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) )。我想知道为什么分配这么慢以及我能做些什么。
答案 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我。