在我的应用程序中,我通过OpenGL ES Api绘制了很多立方体.所有立方体都具有相同的尺寸,只有它们位于空间的不同坐标.我可以想到两种绘制它们的方法,但我不确定哪种方法最有效.我不是OpenGL专家,所以我决定在这里问一下.
方法1,这就是我现在使用的:由于所有立方体的尺寸相同,我只计算一次顶点缓冲区,索引缓冲区,普通缓冲区和颜色缓冲区.在刷新场景期间,我遍历所有立方体,对同一组缓冲区执行bufferData(),然后使用drawElements()调用绘制多维数据集的三角形网格.由于每个立方体位于不同的位置,我在绘制之前翻译mvMatrix.对每个多维数据集执行bufferData()和drawElements().在这种方法中,我可能通过不每次计算缓冲区来节省大量内存.但我正在进行很多drawElements()调用.
方法2将:将所有立方体视为遍布场景的多边形集.计算每个多边形的顶点,索引,颜色,正常缓冲区(实际上是多边形内的三角形),并在单次调用bufferData()时将它们推送到图形卡内存.然后单击调用drawElements()绘制它们.这种方法的优点是,我只做一个bindBuffer和drawElements调用.缺点是,我使用大量内存来创建缓冲区.
我对OpenGL的经验是有限的,从性能的角度来看,不知道上述哪种方法更好.
我在WebGL应用程序中使用它,但它是一个通用的OpenGL ES问题.
Jay*_*esh 14
我实施了方法2,它以压倒性优势获胜.高记忆的假设下行似乎只是我的想象力.事实上,垃圾收集器只在方法2中调用一次,而在方法1中调用了4-5次.
您的OpenGL场景可能与我的不同,但如果您到达此处寻找性能提示,则此问题的教训是:识别场景中不经常更改的部分.无论它们有多大,都将它们放在单个缓冲区集(VBO)中并上传到图形内存的次数最少.这就是VBO的用途.客户端(即您的应用程序)和显卡之间的内存带宽非常宝贵,您不希望经常无故地使用它.
阅读Ch.中的"顶点缓冲区对象"部分.6"OpenGL ES 2.0编程指南"了解它们应该如何使用.http://opengles-book.com/
我知道这个问题已经回答了,但我认为值得指出关于WebGL优化的Google IO演示:
http://www.youtube.com/watch?v=rfQ8rKGTVlg
它们基本上涵盖了这个完全相同的问题(具有不同颜色/位置的相同形状的许多)并且谈论优化这样一个场景的一些好方法(并且它们也是动态的!)
| 归档时间: |
|
| 查看次数: |
6647 次 |
| 最近记录: |