我注意到Java和其他編程語言的差別很大, BufferedImage(java)或Bitmap(C# - 都是硬盤上的PNG)'轉換成'OpenGL'。將PNG加載到OpenGL性能問題 - Java和JOGL比C#&Tao慢很多。OpenGL
這種差異是相當大的,所以我認爲我做錯了什麼,但經過很多搜索和嘗試不同的加載技術後,我一直無法減少這種差異。
使用Java我得到一個圖像加載到248ms,並加載到728ms的OpenGL 在C#上的相同需要54ms加載圖像和34ms加載/創建紋理。
上述問題中的圖片是包含透明度的PNG,大小爲7200x255,用於2D動畫精靈。我意識到這個尺寸真的非常荒謬,正在考慮削減這個精靈,但是這個巨大的差距仍然存在(並且令人困惑)。
在Java端的代碼如下所示:
BufferedImage image = ImageIO.read(new File(fileName));
texture = TextureIO.newTexture(image, false);
texture.setTexParameteri(GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
texture.setTexParameteri(GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
的C#代碼使用:
Bitmap t = new Bitmap(fileName);
t.RotateFlip(RotateFlipType.RotateNoneFlipY);
Rectangle r = new Rectangle(0, 0, t.Width, t.Height);
BitmapData bd = t.LockBits(r, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, tID);
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, t.Width, t.Height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, bd.Scan0);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
t.UnlockBits(bd);
t.Dispose();
經過相當大量的測試我只能得出這樣的結論的Java/JOGL在這裏只是比較慢--PNG閱讀可能不那麼快,或者我仍然在做錯事。
謝謝。
EDIT2:
我發現,創造與格式TYPE_INT_ARGB_PRE一個新的BufferedImage幾乎減少了一半的OpenGL紋理加載時間 - 這包括創建新的BufferedImage,從中得到的Graphics2D,然後渲染以前加載圖像。
編輯3:5個變化的基準結果。 我寫了一個小型的基準測試工具,下面的結果來自加載一組33個png,大部分都很寬,5次。
testStart: ImageIO.read(file) -> TextureIO.newTexture(image)
result: avg = 10250ms, total = 51251
testStart: ImageIO.read(bis) -> TextureIO.newTexture(image)
result: avg = 10029ms, total = 50147
testStart: ImageIO.read(file) -> TextureIO.newTexture(argbImage)
result: avg = 5343ms, total = 26717
testStart: ImageIO.read(bis) -> TextureIO.newTexture(argbImage)
result: avg = 5534ms, total = 27673
testStart: TextureIO.newTexture(file)
result: avg = 10395ms, total = 51979
ImageIO.read(bis)指James Branigan在下面的答案中描述的技術。 argbImage是指在我以前的編輯中描述的技術:
img = ImageIO.read(file);
argbImg = new BufferedImage(img.getWidth(), img.getHeight(), TYPE_INT_ARGB_PRE);
g = argbImg.createGraphics();
g.drawImage(img, 0, 0, null);
texture = TextureIO.newTexture(argbImg, false);
加載的任何多種方法(無論是從文件的圖像,或圖像的OpenGL)將被理解的是,我將更新這些基準。
使用濤在C#中的相同的基準測試程序運行需要平均1106ms,總5531ms。仍然比我在Java/JOGL中找到的最快方法快5倍。 – 2009-12-21 00:50:25