2012-06-13 27 views
1

由于性能原因,我正在研究使用VBO而不是即时模式。我正在创建一个充满精灵的二维正射影像场景。我不想画出离屏的精灵。我通过检查相机的屏幕大小和位置来确定它们的位置。使用VBOs在OpenGL中进行简单2D剔除

即时模式下,这很简单;每个精灵都有绘制方法。使用VBO这似乎不重要;我一次渲染一个VBO的整个部分。对于我来说(我能想到的)将无法选择不在屏幕上的渲染精灵。

+3

在CPU上动画的动画是否正确?另外,我们在谈论什么数字?如果你有例如几百个精灵,然后扑杀几乎不值得考虑(显卡会为你做,忘掉它)。 – Damon

回答

5

我只假设你确实在CPU上制作了精灵动画,因为这是根据你的问题唯一有意义的东西(否则,你将如何在最初的即时模式中绘制它们,以及如何你跳过画一些)。

从性能的角度来看,AGP/PCIe的行为非常像硬盘。带宽很大,但访问时间相当明显。换句话说,做转移是件痛苦的事情,但一旦你做了,再多几千字节也没有什么区别。上传500个精灵并上传1000个精灵是同样的事情。

既然你动画在CPU上的精灵,你已经必须做一个转移(glBufferSubDataglMapBuffer/glUnmapBuffer)每一帧,没有其他办法。

确保使用“新鲜”缓冲区,例如通过应用glBufferData(null) idiom。通过允许OpenGL继续使用(绘制)缓冲区,同时为您提供不同的缓冲区(不知道),避免了管道延迟。稍后当它完成绘图时,它只是秘密地翻转缓冲区并抛出旧的。这样,你就可以实现良好的并行性(这对性能至关重要,比剔除几千个顶点更重要)。此外,图形卡在选择几何图形时也相当不错(这包括丢弃在生成碎片之前不在屏幕上的整个三角形)。数百?成千上万的?十万?没有任何问题。让显卡去做。

除非你有一百万精灵,其中一半是可见在同一时间,另一半是不是,这不是不可能连续写入整个缓冲区和无枝不仅一样快,但由于缓存和管道效应,速度更快。

+0

因此,基于文档,我将使用GL_STREAM_DRAW_ARB使用标志。这将表明VBO应该针对这种确切的情况进行优化。它是否正确? –

+0

是的。 “流”意味着“定义一次,使用一次或几次”。这并不意味着你不能做别的事情,但这是你给司机的暗示(它可能会或者可能不会被尊重,有所作为,这取决于司机,硬件和你的工作。例如,在使用正确的标志和错误的标志进行回读时,我看到差异大约为1:100)。另一半(“绘制”)暗示您打算从您的应用提供的数据中绘制。请注意,在后来的版本(如果我没有记错的话3.2版本),这个“提示”是一个很难的要求。 – Damon