私は、カスタムファイル形式で画像を表示し、JNIを使ってC++ライブラリを読み込むように設計されたJavaプログラムを持っています。データはC++側のchar配列にロードされ、Java側のBufferedImageに転送されます。イメージのセクションはメモリから削除することができ、かなり定期的にリロードする必要があるので、これらの操作をできるだけ速くします。大量のバイトデータをC++からJavaへ効率的に転送する
私が現在行っているのは、データがファイルからC++ライブラリのメモリ内のバッファに読み込まれることです。 BufferedImageを生成するために、Javaコードは、各ピクセルがこのバッファから読み込み、必要であれば別のデータのまとまりをバッファに読み込むためのJNI関数呼び出しを行います。これは動作しますが、オーバーヘッドは私が望むよりも高くなります。
これを改善するために計画してきたことは、BufferedImageオブジェクトをJNI呼び出しを使用してC++コードに渡し、その側から関数呼び出しを行うことです。私は可能な限りJNIを研究してきましたが、JVMによってロードされたC++ライブラリからJavaオブジェクトを変更する際にコストがかかっているかどうかはわかりませんでした。これを実装するには良い方法ですか、あるいは大量のバイトデータをJNIで高速に転送する方法がありますか?
ピクセルあたりの呼び出し音がひどいです!それは、より大きいイメージのための何十億もの呼び出しでしょう。一度にブロックやラスターライン(例えば、より大きな画像ユニット)を取り出すのはどうですか?ラスタラインをパックされた順に読み込み、追加の変換を避けることができますか? – user2246674
はい、行とブロックの両方をC++側のバッファに読み込むことができます。私はC++側でそれを少し最適化しました。問題は、データをjavaに転送する効率的な方法がわからないため、各ピクセルでC++バッファからデータを読み出すために別途呼び出しを行うことです。 – resueman
@resuerman何か[WritableRaster.setSamples](http://docs.oracle.com/javase/1.5.0/docs/api/java/awt/image/WritableRaster.html#setSamples(int、%20int、%20int) 、%20int、%20int、%20double []))を使用しますか?可能であれば、(最も効率的に)Java配列にデータをロードする方法を見つけることができます。配列を固定したり、[C++]メモリをラップして[プライマリ]コピーを避ける方法はありますか?余分なコピー操作(C++ - > Java Array-> Raster)があっても、JNI呼び出しの数を大幅に減らす必要があります。また、(私はこれを "余分な賢さ"と言います)、ここでOpenGL(テクスチャ)を使うことができますか? – user2246674