1

簡単な質問として:Javaで1つの配列から別の配列に1バイトおきにすばやくコピーする方法はありますか?

免責事項:私のコードはすでに十分に高速ですが、単純なforループよりも高速なネイティブメソッドがあるかどうか疑問に思いました。

問題の詳細(興味のある方):YUVバイト配列を3つの別々のバイト配列(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++];              
  }
}

どういうわけか「ストライド」変数または既知の間隔で要素を選択できるものを取り込むことができる方法はありますか?

4

1 に答える 1

1

いいえ。System.arraycopyはmemcpyに直接マップできるため高速です。これは、ある場所から別の場所へのメモリのブロックコピーをゼロ処理で実行するだけです。

あなたのケースは処理を必要とし、それはどこかで起こらなければなりません。C(JNI)でそれを行うこともできますが、私の経験ではそれだけの価値はありません。JITコンパイラーは、とにかくそのような単純なケースを最適化するのに適しています。

于 2012-07-10T02:25:06.637 に答える