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