0

ファイルへの画像の書き込みを高速化するためのアイデアを得るために、この質問を少し前に行いました。基本的に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ミリ秒です。

4

3 に答える 3

3

マルチスレッドは、次の理由でファイル転送を高速化しません。

  1. 非スレッドセーフなファイル書き込みを行うと、1つのスレッドがファイルを保存するときに、他のスレッドが書き込んでいる情報の一部が上書きされます。

  2. ディスクI/Oはあなたのボトルネックです。それを行うための最良の方法は、メモリストリームに書き込みたいものを書き込み(誰かが編集してドキュメントを提供しますが、実際にはすぐには見つかりません)、ディスクに書き込むことができます。これにより、心配することなく一定のディスクI/Oが可能になります。スレッド

于 2012-08-01T17:40:46.293 に答える
2

コードがマルチスレッドであっても; すべてのスレッドが同じファイルにアクセスしようとしているため、多くのスレッドが実行されている場合でも、このシナリオでは大きな違いはありません。ある瞬間、1を除くすべてがファイルへの書き込みアクセスを取得するのを待機します。

于 2012-08-01T17:40:01.157 に答える
-1

なぜもっと速くなると思いますか?ディスクはマルチスレッドではありません。

于 2012-08-01T22:27:45.843 に答える