0

後で同じアプリケーションにロードするために、GPUからファイルに画像をダウンロードする最速の方法を探しています(したがって、必ずしもPNGではありません)。

ただし、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);
        }
4

1 に答える 1

1

印象は常に高価ですが、あなたはで改善することができるかもしれません

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();
于 2013-01-09T13:27:10.493 に答える