Java使用多线程写入文件不会加速执行

时间:2012-08-01 17:34:54

标签: java multithreading opengl

前段时间我已经问过this question想要加快图像写入文件的速度。我基本上有一个OpenGL应用程序。在每个渲染循环结束时,我将帧缓冲区保存到图像文件中。 / p>

   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扩展了Thread并在“run()”方法内部执行写入File。 令我惊讶的是,50帧的渲染循环几乎与使用Image Exporter的单线程版本时相同。 (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.Now数组,每个新的TImageExporter 将图像数据写入该数组到不同的索引。当直接写入磁盘时,我得到的是3038毫秒而不是3437。

3 个答案:

答案 0 :(得分:3)

多线程不会加速文件传输,因为:

  
      
  1. 进行非线程安全文件写入会覆盖其他线程在1个线程保存时写入的一些信息   它

  2.   
  3. 磁盘I / O是你的瓶颈。最好的做法是将你想要的内容写入内存流(有人编辑并提供文档i   找不到真正的快速)并允许它写入磁盘..这个   将允许恒定磁盘i / o而不用担心线程

  4.   

答案 1 :(得分:2)

即使您的代码是多线程的;因为你所有的线程都试图访问同一个文件..它不会有太大的区别。因为在这种情况下,即使很多线程正在运行;在一个瞬间,除1之外的所有人都将等待获取对文件的写访问权。

答案 2 :(得分:-1)

为什么你认为它会更快?磁盘不是多线程的。