ファイルへの画像の書き込みを高速化するためのアイデアを得るために、この質問を少し前に行いました。基本的にOpenGLアプリがあります。各レンダリングループの最後に、フレームバッファを画像ファイルに保存します。
fbo.readFrame();
glReadPixels(0, 0, _viewportWidth, _viewportHeight, GL_RGBA, GL_UNSIGNED_BYTE, _data);
_data.rewind(); //ByteBuffer
new TImageExporter(ImageExporter.TGA, "renderings/", _data, _viewportWidth, _viewportHeight, true, _frameCount++).run();
TImageExporterはスレッドを拡張し、「run()」メソッド内でファイルへの書き込みを実行します。驚いたことに、50フレームのレンダリングループは、イメージエクスポーターのシングルスレッドバージョンを使用する場合とほぼ同じ時間がかかります。(3293ミリ秒-マルチスレッドおよびシングルスレッドを使用した場合は3437ミリ秒)ここで何が間違っていますか?これがTImageExporter内のコードです。
public void export() {
_pixels = new int[_width * _height];
int bindex;
int plenght = _pixels.length;
// convert RGB data in ByteBuffer to integer array
for (int i = 0; i < plenght; ++i) {
bindex = i * 4; //use 3 for RGB
//// here write the pixels to RGBA/////
............
.......................
}
_image.flush();
_image.setRGB(0, 0, _width, _height, _pixels, 0, _width);
_image = ImageUtils.flipY(_image);
renderByFormatType();
}
private void renderByFormatType() {
String formattedString = String.format(_formatString, _frameCount);
if (_exportType.equals(TGA)) {
try {
writeTGA(_image, new File(_renderPath + "screenshot_test" + formattedString + ".tga"), _flipX);
} catch (IOException ex) {
Logger.getLogger(TImageExporter.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
@Override
public void run() {
export();
}
更新:ここで、同じファイルに書き込むかどうかを尋ねられました。いいえ、各スレッドは完全に新しいファイルに書き込みます。
UPDATE1:BufferedImageの配列を保持するグローバル静的変数を設定します。これで、新しいTImageExporterはそれぞれ、画像データをその配列に異なるインデックスに書き込みます。ディスクに直接書き込む場合、取得したのは3437ミリ秒ではなく3038ミリ秒です。