gpt4 book ai didi

opengl-es - OpenGL ES中高效的绘图方式

转载 作者:行者123 更新时间:2023-12-04 01:48:00 25 4
gpt4 key购买 nike

在我的应用程序中,我通过 OpenGL ES Api 绘制了很多立方体。所有的立方体都是相同的维度,只是它们在空间中的坐标不同。我可以想到两种绘制它们的方法,但我不确定哪种方法最有效。我不是 OpenGL 专家,所以我决定在这里提问。

方法一,我现在使用的方法:由于所有的立方体都是相同的尺寸,所以我只计算了一次顶点缓冲区、索引缓冲区、法线缓冲区和颜色缓冲区。在场景刷新期间,我查看所有立方体,对同一组缓冲区执行 bufferData(),然后使用 drawElements() 调用绘制立方体的三角形网格。由于每个立方体位于不同的位置,我在绘制之前先翻译 mvMatrix。 bufferData() 和 drawElements() 为每个立方体执行。在这种方法中,我可能不会每次都计算缓冲区,从而节省了大量内存。但是我做了很多 drawElements() 调用。

方法 2 是:将所有立方体视为分布在整个场景中的一组多边形。计算每个多边形(实际上是多边形内的三角形)的顶点、索引、颜色、法线缓冲区,并在一次调用 bufferData() 时将它们推送到显卡内存。然后通过一次调用 drawElements() 来绘制它们。这种方法的优点是,我只执行一次 bindBuffer 和 drawElements 调用。缺点是,我使用大量内存来创建缓冲区。

我对 OpenGL 的经验非常有限,不知道从性能的角度来看上述哪一种方法更好。

我在 WebGL 应用程序中使用它,但它是一个通用的 OpenGL ES 问题。

最佳答案

我实现了方法2,它以压倒性优势获胜。大量内存的所谓缺点似乎只是我的想象。实际上垃圾收集器在方法 2 中只被调用了一次,而在方法 1 中它被调用了 4-5 次。

您的 OpenGL 场景可能与我的不同,但如果您来到这里是为了寻找性能提示,那么这个问题的教训是:确定场景中不经常更改的部分。无论它们有多大,将它们放在单个缓冲区集 (VBO) 中,并以最少次数上传到图形内存。这就是 VBO 的用途。客户端(即您的应用程序)和显卡之间的内存带宽非常宝贵,您不想无缘无故地经常使用它。

阅读 Ch 中的“顶点缓冲区对象”部分。 “OpenGL ES 2.0 编程指南”的 6 以了解它们应该如何使用。 http://opengles-book.com/

关于opengl-es - OpenGL ES中高效的绘图方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3846359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com