作为一个简单的问题:有没有办法在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++];
}
}
是否有一种方法能够以某种方式接受“步幅”变量或某种可以允许以已知间隔选择元素的东西?
答案 0 :(得分:1)
没有。 System.arraycopy很快,因为它可以直接映射到memcpy,而memcpy只是将一些内存的块拷贝从一个地方复制到另一个地方而没有处理。
您的案件需要处理,而且必须在某处进行。你可以用C(JNI)来做,但根据我的经验,这是不值得的,JIT编译器无论如何都会很好地优化这样一个简单的案例。