OpenGL-进一步加快QUADS渲染的步伐

问题描述 投票:1回答:3

我一直在进行实验,现在可以使用]将大约300万个GL_QUADS渲染到屏幕上。

glDrawArrays(GL_QUADS, 0, nVertexCount);

我还使用多个缓冲,循环遍历18个顶点缓冲对象,每个对象有100万个顶点。使用存储在堆中的压缩数据和简单的计算来计算每个顶点位置。我用

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

glUnmapBuffer(GL_ARRAY_BUFFER);

将每个顶点写入每个帧的缓冲区对象。当缓冲区对象已满时,我取消映射它,调用glDrawArrays,然后绑定并映射下一个VBO以流式传输更多顶点数据。当所有18个都用完后,我逻辑上绑定第一个并重新开始。

根据我的经验,使用VBO映射几乎是使用堆数组存储顶点数据的两倍。我怎么知道?因为,由于我渲染了300万个GL_QUADS,因此帧速率明显低于30 fps。我只是可以用眼睛观察VBO的帧频是两倍。

[我也观察到,在每个填充的顶点缓冲区对象上连续调用glDrawArrays两次(结果是要渲染的四倍的四边形,但是一次是流传输顶点数据)-仅比仅渲染慢得多一旦。因此,我认为主要的瓶颈是将顶点数据流传输到顶点缓冲区对象中(2 GHz双核正忙着处理它的60%!)。

现在,每个顶点需要3个浮点,加上2个浮点用于纹理坐标。 (总共20个字节)。我想我可以将其缩短为3 GL_SHORT加2 GL_SHORT以获得纹理坐标。使用转换矩阵(总共5个字节),但这只会加快4倍。 (而且不知何故,sizeof(GL_SHORT)在我的系统上给出4,所以我也不确定。)

无论如何,那里已经有一些游戏,甚至已经很老了,但是每帧afaik都会在屏幕上渲染超过300万个图元(而且它们不可避免地必须流这些顶点,因为没有GPU可以容纳这么多顶点数据),仍然可以获得超过100 fps的体面帧率!

我确定,我仍然缺少该过程中的一些要点,但是我无法弄清楚它是什么。有什么建议吗?

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

我一直在进行实验,现在可以使用glDrawArrays(GL_QUADS,0,nVertexCount)在屏幕上渲染大约300万个GL_QUADS;我还使用了多个缓冲,在18个顶点之间循环...

performance opengl stream vbo
3个回答
2
投票

我确定,在此过程中我仍然缺少一些要点


1
投票

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


1
投票

每个顶点位置都是使用存储在堆中的压缩数据和简单的计算得出的。

© www.soinside.com 2019 - 2024. All rights reserved.