出于性能原因,我正在考虑使用 VBO 而不是立即模式。我正在创建一个充满精灵的 2D 正交场景。我不想绘制屏幕外的精灵。我通过根据屏幕尺寸和相机位置检查它们的位置来做到这一点。
在即时模式下,这很简单;每个精灵都有绘制方法。使用 VBO 这似乎很重要;我一次渲染 VBO 的整个部分。我(我能想到的)没有办法选择不在屏幕外的渲染精灵。
出于性能原因,我正在考虑使用 VBO 而不是立即模式。我正在创建一个充满精灵的 2D 正交场景。我不想绘制屏幕外的精灵。我通过根据屏幕尺寸和相机位置检查它们的位置来做到这一点。
在即时模式下,这很简单;每个精灵都有绘制方法。使用 VBO 这似乎很重要;我一次渲染 VBO 的整个部分。我(我能想到的)没有办法选择不在屏幕外的渲染精灵。
我只是假设您确实确实为 CPU 上的精灵设置了动画,因为根据您的问题,这是唯一有意义的事情(否则,您最初将如何在立即模式下绘制它们,以及如何跳过绘制一些)。
从性能的角度来看,AGP/PCIe 的行为很像硬盘。带宽很大,但访问时间非常明显。换句话说,进行传输是很痛苦的,但是一旦你这样做了,再多几千字节并没有什么区别。上传 500 个精灵和上传 1000 个精灵是一回事。
由于您在 CPU 上为精灵设置动画,因此您已经必须每帧执行一次传输(glBufferSubData
或glMapBuffer/glUnmapBuffer
),没有其他方法。
请务必使用“新鲜”缓冲区,例如通过应用glBufferData(null)
idiom。这通过允许 OpenGL 继续使用(从)缓冲区同时为您提供不同的缓冲区(您不知道)来避免管道停顿。稍后当它完成绘图时,它只是偷偷地翻转缓冲区并将旧缓冲区扔掉。这样,您可以获得良好的并行性(这是性能的关键,比剔除几千个顶点更重要)。
此外,显卡在剔除几何体方面相当出色(这包括在生成片段之前丢弃屏幕外的整个三角形)。数百?数千?十万?没有任何问题。让显卡来做。
除非您有一百万个 sprite,其中一半是可见的,而另一半不可见,否则连续写入整个缓冲区且没有分支的情况并非不可能,不仅速度一样快,而且由于缓存和管道效应。