Performance OpenGL-在快速绘制四边形的道路上又前进了一步

Performance OpenGL-在快速绘制四边形的道路上又前进了一步,performance,opengl,stream,vbo,Performance,Opengl,Stream,Vbo,我已经做了一些实验,现在可以使用 glDrawArrays(GL_QUADS, 0, nVertexCount); 我还使用多个缓冲,循环通过18个顶点缓冲对象,每个对象有100万个顶点。每个顶点位置都是使用存储在堆上的压缩数据和一个简单的计算来计算的。我用 ptr = (float*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); 及 将每个顶点写入每个帧的缓冲区对象。当缓冲区对象已满时,我将取消映射它,调用glDrawArrays,并绑定和映射下

我已经做了一些实验,现在可以使用

glDrawArrays(GL_QUADS, 0, nVertexCount);
我还使用多个缓冲,循环通过18个顶点缓冲对象,每个对象有100万个顶点。每个顶点位置都是使用存储在堆上的压缩数据和一个简单的计算来计算的。我用

ptr = (float*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

将每个顶点写入每个帧的缓冲区对象。当缓冲区对象已满时,我将取消映射它,调用glDrawArrays,并绑定和映射下一个VBO,以进一步流化顶点数据。当所有18个都被使用后,我逻辑地绑定第一个并重新开始

根据我的经验,对顶点数据使用VBOs映射的速度几乎是使用堆数组的两倍。我怎么知道?因为,由于我渲染了300万个GL_四边形,帧速率明显低于30 fps。我可以用眼睛观察VBOs的帧速率是如何的两倍

我还观察到,在每个填充的顶点缓冲区对象上连续两次调用glDrawArrays(导致要渲染的四边形数增加两倍,但要流化顶点数据的工作量增加一倍)只比只渲染一次慢了一点。因此,我假设主要的瓶颈是顶点数据流到顶点缓冲区对象(2 GHz双核60%忙着!!)

现在每个顶点为纹理坐标取3个浮点数加2个浮点数。(总共20个字节)。我想我可以把这个数字缩短到3 GL_加上纹理坐标的2 GL_。使用翻译矩阵(总共5个字节),但速度只会提高4倍。(不知怎的,sizeof(GL_SHORT)在我的系统上给出了4,所以我也不确定。)

不管怎么说,有一些游戏已经很老了,但是每一帧都要在屏幕上渲染300多万个基本体(而且它们不可避免地要流式处理这些顶点,因为没有GPU可以容纳这么多数据),并且仍然可以获得超过100 fps的帧速率

我确信,在这个过程中,我仍然遗漏了一些重要的要点,但我就是不知道它是什么。有什么建议吗

编辑:
这些是松散的四边形,就像在粒子系统中一样。(或者更确切地说,因为每一个都可能最终拥有不同的纹理(纹理取自单个纹理的子文本,因此没有广泛的绑定;)

实际上,您可以做很多事情(或者做一些事情来获得更大的吞吐量)。 我只是略读了一些,因为这可以(而且确实)填满一本(或更多)书

  • 画三角形,而不是四边形。最终,四边形将被拆分为tris(图形硬件针对三角形处理进行了优化)
  • 当您拥有由如此多三角形组成的大型对象时,您将尽可能使用条带和扇形(将要发送的顶点数据量从3N减少到N+2)
  • 巧妙地缓存数据(尤其是在渲染大型场景时)至关重要。正如您所观察到的,数据传输是系统中的瓶颈。因此,基本上每个引擎都经过了大量优化,以避免不必要的数据传输。但这取决于应用程序。这也是一个可以写很多书的话题 我可以推荐这些书作为本主题的一个条目:


    实际上,您可以做很多事情(或者做哪些事情可以获得更高的吞吐量)。 我只是略读了一些,因为这可以(而且确实)填满一本(或更多)书

  • 画三角形,而不是四边形。最终,四边形将被拆分为tris(图形硬件针对三角形处理进行了优化)
  • 当您拥有由如此多三角形组成的大型对象时,您将尽可能使用条带和扇形(将要发送的顶点数据量从3N减少到N+2)
  • 巧妙地缓存数据(尤其是在渲染大型场景时)至关重要。正如您所观察到的,数据传输是系统中的瓶颈。因此,基本上每个引擎都经过了大量优化,以避免不必要的数据传输。但这取决于应用程序。这也是一个可以写很多书的话题 我可以推荐这些书作为本主题的一个条目:

    每个顶点位置都是使用存储在堆上的压缩数据和一个简单的计算来计算的

    也许顶点或几何体着色器可以替代它

    无论如何,有一些游戏已经很老了,但是每一帧都要在屏幕上渲染300多万个基本体(它们不可避免地要流式处理这些顶点,因为没有GPU可以保存这么多数据)

    3000000*20字节=60兆字节
    ,即使是较旧的GPU也能轻松使用

    每个顶点位置都是使用存储在堆上的压缩数据和一个简单的计算来计算的

    也许顶点或几何体着色器可以替代它

    无论如何,有一些游戏已经很老了,但是每一帧都要在屏幕上渲染300多万个基本体(它们不可避免地要流式处理这些顶点,因为没有GPU可以保存这么多数据)

    3000000*20字节=60兆字节
    ,即使是较旧的GPU也能轻松使用

    我确信,在这个过程中,我仍然遗漏了一些重要的方面

    问题应该是我是否需要绘制3MB的三角形,而不是如何突破硬件限制

    您应遵守的限制应为硬件。传输速率、GPU时钟和内存时钟是在没有更新硬件的情况下无法覆盖的特性。事实上,您应该尝试有效地利用当前的硬件

    正如我所理解的,渲染时需要更新顶点缓冲区;因此,可以映射缓冲区对象、更新数据、取消映射和渲染。我想你会重复做的。在这种情况下,你必须考虑转移。
    glUnmapBuffer(GL_ARRAY_BUFFER);