小编Ed *_*ell的帖子

将PNG加载到OpenGL性能问题中 - Java和JOGL比C#和Tao.OpenGL慢得多

我注意到Java和JOGL以及C#和Tao.OpenGL在将PNG从存储器加载到内存中时,以及将BufferedImage(java)或Bitmap(C# - 两者都是硬盘驱动器上的PNG)加载到'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);
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

经过大量的测试后,我只能得出结论,Java/JOGL在这里速度较慢 - PNG读取可能不会那么快,或者我仍然在做错事.

谢谢.

EDIT2:

我发现创建一个格式为TYPE_INT_ARGB_PRE的新BufferedImage会使OpenGL纹理加载时间减少近一半 - 这包括必须创建新的BufferedImage,从中获取Graphics2D,然后将之前加载的图像渲染到它.

Edit3:5种变化的基准测试结果.我写了一个小的基准测试工具,下面的结果来自加载一组33个png,大多数是非常宽,5倍.

testStart: ImageIO.read(file) -> TextureIO.newTexture(image)  
result: avg = 10250ms, total = 51251 …
Run Code Online (Sandbox Code Playgroud)

java opengl performance png jogl

7
推荐指数
1
解决办法
9361
查看次数

标签 统计

java ×1

jogl ×1

opengl ×1

performance ×1

png ×1