【问题标题】:How can I optimize the rendering of a large model in OpenGL ES 1.1?如何在 OpenGL ES 1.1 中优化大型模型的渲染?
【发布时间】:2011-08-08 19:08:42
【问题描述】:

我刚刚在我的 3D 应用程序中完成了 VBO 的实现,并且看到渲染速度提高了大约 5-10 倍。过去以每秒 1-2 帧的速度呈现的内容现在以每秒 10-11 帧的速度呈现。

我的问题是,我可以做任何进一步的改进来提高渲染速度吗?三角带会有很大的不同吗?目前顶点没有在面之间共享,每个面的顶点都是唯一的但重叠。

我的设备利用率为 100%,Tiler 利用率为 100%,渲染器利用率为 11%,资源字节为 114819072。这是在 CAD 模型上渲染 912,120 个面。

有什么建议吗?

【问题讨论】:

    标签: iphone ios opengl-es vbo


    【解决方案1】:

    100% 的 Tiler 利用率indicates that your bottleneck is in the size of the geometry being sent to the GPU。根据我的经验,无论你可以做什么来缩小几何尺寸,都会导致渲染时间几乎线性减少。这些调整步骤过去对我有用:

    • 如果您还没有,您可以考虑使用索引,这可能会通过消除一些冗余顶点来减少几何图形。 iOS 设备中的 PowerVR GPU 也针对使用索引几何进行了优化。

    • 尝试为您的顶点信息使用较小的数据类型。我发现我可以对顶点和法线使用 GLshort 而不是 GLfloat,而不会在渲染中损失太多精度。这将显着压缩您的几何图形并显着提高渲染速度。

    • Bin 相似颜色的顶点并将它们作为一组以设定的颜色渲染,而不是提供每个顶点的颜色信息。这需要的几个额外绘制调用的开销将大大超过您不必发送所有颜色信息所获得的加速。通过在我的一个较大模型中合并颜色,我发现渲染时间减少了约 18%。

    • 您已经在使用 VBO,因此您已经利用了这种优化。

    • 不要在任何时候停止渲染管道。删除读取当前状态的任何内容,例如所有 glGet* 调用,因为它们确实会干扰 PowerVR GPU 的流程。

    你可以做一些其他的事情来提高性能,比如在你的 VBO 中使用交错的顶点、法线、纹理数据,将你的数据对齐到 4 字节边界等,但上面的那些是我的我发现它对我自己的 OpenGL ES 1.1 应用程序的调整影响最大。

    Apple 的 iOS OpenGL ES 编程指南的“Best Practices for Working with Vertex Data”部分很好地介绍了这些要点。

    【讨论】:

    • 索引几何(要点 1)如何与交错的顶点数组一起工作?苹果说交错数组是最有效的,但我不知道它如何与索引一起工作。目前我正在使用 glDrawArrays()。您能否发布一个快速代码示例,说明如何使用带有 glDrawElements 的 VBO 进行渲染?谢谢。
    • @Davido - 将每个顶点信息作为分组(顶点、法线、纹理坐标、顶点、法线、纹理坐标...)放入 VBO 中。每个索引指的是一个顶点,因此对于每个索引,绘制时都会拉入对应的顶点、法线和纹理坐标。将代码获取到 Molecules,您可以在其中看到交错索引绘图的示例:sunsetlakesoftware.com/molecules。不幸的是,我还没有应用程序的版本,它也可以进行基于颜色的分箱,但我很快就会。
    • 啊,经过大量搜索,我现在想起了为什么我首先使用 glDrawArrays 而不是 glDrawElements。 glDrawElements 不支持 GL_UNSIGNED_INT,这有效地限制了它为单个索引数组渲染不超过 65536 个顶点。问题是,我的模型有一百万个面孔,索引数组中有大约 760,000 个索引。使用 glDrawElements 会大大增加代码的复杂性,因为每个数组的索引限制为 65536 个。关于这个有什么想法,还是我坚持使用 glDrawArrays?
    • @Davido - 在我的例子中,我使用多个 VBO 来存储超过 65536 个索引的几何图形。构造它们的数组并适当地分割您的模型并不难。我仍然怀疑缓冲区切换和绘图调用开销会被减少几何尺寸的更快渲染所抵消。你可以做一个快速计算,看看你的尺寸是多少,有没有索引,看看你可以通过这种方式获得多少。
    • 我应该能够使用 920,000 个面实现的理论限制是每秒 9,807,360 个(基于我自己运行的 GLBenchmark)多边形 (iPad2),除以我的面数,即 10.66 帧每秒,对吗?因此,如果我目前在仪器中的帧速率在 10 和 11 fps 之间来回切换,如果我已经处于极限,进一步的优化将如何影响我的应用程序性能?只是好奇。
    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多