Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
openGL静态绘制与静态读取性能_Opengl_Jogl - Fatal编程技术网

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