openGL静态绘制与静态读取性能
使用此初始化块:openGL静态绘制与静态读取性能,opengl,jogl,Opengl,Jogl,使用此初始化块: public void init(GL gl) { buffer = new int[1]; gl.glGenBuffers(1, buffer, 0); VBOVertices = buffer[0]; gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBOVertices); gl.glBufferData(GL.GL_ARRAY_BUFFER, vertices.limit() * Buffe
public void init(GL gl) {
buffer = new int[1];
gl.glGenBuffers(1, buffer, 0);
VBOVertices = buffer[0];
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBOVertices);
gl.glBufferData(GL.GL_ARRAY_BUFFER, vertices.limit() * BufferUtil.SIZEOF_FLOAT, vertices, GL.GL_STATIC_DRAW);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
init = true;
}
以及此渲染块:
public void display(GL gl) {
gl.glEnableClientState(GL.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL.GL_COLOR_ARRAY);
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE);
gl.glBlendEquation(GL.GL_FUNC_ADD);
gl.glDepthMask(false);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBOVertices);
gl.glColorPointer(4, GL.GL_FLOAT, 7 * 4, 3 * 4);
gl.glVertexPointer(3, GL.GL_FLOAT, 7 * 4, 0);
gl.glDrawArrays(GL.GL_LINE_STRIP, 0, vertices.limit() / 7);
gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL.GL_COLOR_ARRAY);
}
当我将GL.GL_STATIC_DRAW更改为GL.GL_STATIC_READ时,某些图形卡(GeForce GT 750M)的性能会受到严重的影响,但这种情况会消失,我不明白为什么。
我曾尝试对顶点使用填充,但没有任何改变。有人能解释一下这种行为吗?
GL\u STATIC\u READ
是一个奇怪的提示,因为它基本上是说“我要从CPU上的这个缓冲区读取很多数据,但只写入一次(或几次)”,所以它在glBufferData中的使用是可疑的。它通常表示要将数据从另一个缓冲区复制到其中。GL客户端实现最明显的行为是在系统内存中分配这样的缓冲区,而不是在GPU上
这意味着,由于某些原因,您的视频卡从系统内存中读取数据的性能优于GPU专用内存。这可能有很多原因,例如GPU内存阻塞、对齐问题、驱动程序错误等
当然,您可以通过启用一些GL调试功能和设置调试回调来获得更多信息。通常情况下,驱动程序会通过这些回调让您知道您正在做的事情会降低性能。它可能是完全其他的东西,只是通过这个怪癖被暴露出来。好吧,
STATIC\u DRAW
将是这个场景的正确用法提示。在这里,我们说的是什么样的“seriuos性能惩罚”?帧速率从30fps下降到5fps