2013-01-09 65 views
0

我正在尋找從GPU下載圖像到文件的最快方式,以便以後在同一應用程序中加載(因此不一定是PNG例如)。ImageIO以最快速度比GZIPStream更快

但我注意到,當我直接使用DeflaterStream時,它比使用DeflaterStream的ImageIO慢得多(所以使用ImageIO.write(deflaterstream))。

我做錯了什麼?或者是ImageIO剛剛進行了大量優化/比最快的GZIP壓縮更好?

glBindTexture(GL_TEXTURE_2D, textureId); 

     int bpp = 4; // Assuming a 32-bit display with a byte each for red, green, blue, and alpha. 
     ByteBuffer buffer = BufferUtils.createByteBuffer(SAVE_WIDTH * SAVE_HEIGHT * bpp); 
     glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA8, GL_UNSIGNED_BYTE, buffer); 

//  File file = new File("saves/s-" + layer + ".png"); // The file to save to. 
     String format = "png"; // Example: "PNG" or "JPG" 
//  BufferedImage image = new BufferedImage(SAVE_WIDTH, SAVE_HEIGHT, BufferedImage.TYPE_INT_ARGB); 

     try { 
      FileOutputStream bOut = new FileOutputStream("saves/p-"+ layer + ".gz"); 
      DeflaterOutputStream gzipOut = new DeflaterOutputStream (bOut, new Deflater(Deflater.BEST_SPEED)); 
      //buffer.flip(); 
      System.out.println("Bytes remaining " + buffer.remaining()); 
      while (buffer.hasRemaining()) gzipOut.write(buffer.get()); 
      gzipOut.close(); 
      bOut.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(SaveStateManager.class.getName()).log(Level.SEVERE, null, ex); 
     } 

回答

1

Conmpression始終是昂貴的,但在一個批處理顯著增加了我的速度,你也許能

OutputStream bOut = new BufferedOutputStream(new FileOutputStream("saves/p-" + layer + ".gz")); 
DeflaterOutputStream defOut = new DeflaterOutputStream(bOut, new Deflater(Deflater.BEST_SPEED)); 
//buffer.flip(); 
byte[] bytes = new byte[1024]; 
while (buffer.hasRemaining()) { 
    int len = Math.min(buffer.remaining(), bytes.length); 
    buffer.get(bytes, 0, len); 
    defOut.write(bytes, 0, len); 
} 
defOut.close(); 
+1

是的,我發現確實越來越字節來提高。 – RobotRock

+0

你可以嘗試從512中獲得2的冪來找到看起來是最優的。 –

+0

嗯,這是一個圖像,所以我想我可以只讀WIDTH * HEIGHT * bitsperpixel。 – RobotRock