“Renderscript Allocation copyto”花费了不少时间,如何解决?

时间:2014-05-11 03:53:40

标签: android renderscript

void sobel(const uchar * v_in , uchar4 *v_out, const void * userData , uint32_t x , uint32_t y)
{
    if ((x==0)||(x==width-1)||(y==0)||(y==height-1)) return;

    uchar a00 = rsGetElementAt_uchar(gIn,x-1,y-1); 
    uchar a01 = rsGetElementAt_uchar(gIn,x,y-1);
    uchar a02 = rsGetElementAt_uchar(gIn,x+1,y-1);
    uchar a10 = rsGetElementAt_uchar(gIn,x-1,y);
    uchar a11 = rsGetElementAt_uchar(gIn,x,y);
    uchar a12 = rsGetElementAt_uchar(gIn,x+1,y);
    uchar a20 = rsGetElementAt_uchar(gIn,x-1,y + 1);
    uchar a21 = rsGetElementAt_uchar(gIn,x,y + 1);
    uchar a22 = rsGetElementAt_uchar(gIn,x+1,y + 1);


    short ux = ((short)((a20) * (1) + (a21) * (2) + (a22) * (1) + (a00) * (-1) + (a01) * (-2) + (a02) * (-1)));
    short uy = ((short)((a02) * (1) + (a12) * (2) + (a22) * (1) + (a00) * (-1) + (a10) * (-2) + (a20) * (-1)));

    uchar resx = (NDA_CAST_8U(ux));
    uchar resy = (NDA_CAST_8U(uy));

    //outdata[y*width + x] = resx;

    rsSetElementAt_uchar(gUx,resx,x,y);
    rsSetElementAt_uchar(gUy,resy,x,y);

    uchar res  = 255 * (uchar)(ux > 10 || uy > 10 );
    *v_out = (uchar4){res,res,res,255};
}

我对renderscript感到困惑。我只想用它来做Imageprocess sobel (image size : 640 * 480;我试图使用JNI来做sobel,但需要3.5毫秒,这太长了。每帧帧,我从相机surfaceview得到的字节数据,我发现无论是编码还是使用api ScriptIntrinsicConvolve3x3,copyto和copyfrom操作都需要花费很多时间(约15ms) )。我想知道为什么分配这么慢以及我能做些什么。

2 个答案:

答案 0 :(得分:2)

这实际上是你的计算需要这个时间而不是copyTo。 计算在后台执行,只有当您尝试访问结果时(使用copyTo),您需要等待计算完成。

当你调用你的script.forEach_sobel时,它几乎立刻就会出现,但这并不意味着计算已经完成,而是在后台运行。

您可以通过注释掉script.forEach_sobel调用来检查copyTo的实际时间,如果您不调用此方法并尝试使用copyTo则会更快。

答案 1 :(得分:0)

have found Allocation.copyTo()如果计划将渲染脚本在GPU上执行可能花费大量时间,而在计划在CPU上执行时立即执行。但是在GPU上,forEach()是异步的(@Larry Schiefer),起初我认为GPU的执行时间更短。幸运的是, AccoGuy 及时corrected我。