复制数组的每个其他字节的最快方法

时间:2012-07-09 23:48:34

标签: java android optimization yuv arraycopy

作为一个简单的问题:有没有办法在Java中从一个数组快速复制每个其他字节?

免责声明:我的代码已经足够快了,但我发现自己想知道是否存在比简单for循环更快的本机方法。

问题详情(对于那些感兴趣的人):我正在将YUV字节数组拆分成三个独立的字节数组(Y,U和V)。如果您之前没有看过YUV数组(采用Android标准NV21格式),结构是高度*宽度字节Y后跟(高度*宽度)/ 2字节UV数据(我们的眼睛对色度分辨率不太敏感)交错。使用arraycopy可以使用以下方法优化Y字节到专用数组的传输:

System.arraycopy(yuvs, 0, yArray, 0, imgSize.width*imgSize.height);

但是我将UV部分复制到专用数组中,如下所示:

for (bt_y = 544; bt_y < previewSize.height*(3.0/2.0); bt_y++) {
  for (bt_x = 0; bt_x < 960;) {
    uArray[UVIndex] = yuvs[bt_y*960+bt_x++];
    vArray[UVIndex++] = yuvs[bt_y*960+bt_x++];              
  }
}

是否有一种方法能够以某种方式接受“步幅”变量或某种可以允许以已知间隔选择元素的东西?

1 个答案:

答案 0 :(得分:1)

没有。 System.arraycopy很快,因为它可以直接映射到memcpy,而memcpy只是将一些内存的块拷贝从一个地方复制到另一个地方而没有处理。

您的案件需要处理,而且必须在某处进行。你可以用C(JNI)来做,但根据我的经验,这是不值得的,JIT编译器无论如何都会很好地优化这样一个简单的案例。