前段时间我已经问过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。
答案 0 :(得分:3)
多线程不会加速文件传输,因为:
进行非线程安全文件写入会覆盖其他线程在1个线程保存时写入的一些信息 它
- 醇>
磁盘I / O是你的瓶颈。最好的做法是将你想要的内容写入内存流(有人编辑并提供文档i 找不到真正的快速)并允许它写入磁盘..这个 将允许恒定磁盘i / o而不用担心线程
答案 1 :(得分:2)
即使您的代码是多线程的;因为你所有的线程都试图访问同一个文件..它不会有太大的区别。因为在这种情况下,即使很多线程正在运行;在一个瞬间,除1之外的所有人都将等待获取对文件的写访问权。
答案 2 :(得分:-1)
为什么你认为它会更快?磁盘不是多线程的。