【问题标题】:GL_TRIANGLES or GL_TRIANGLE_STRIP on iOS?iOS 上的 GL_TRIANGLES 或 GL_TRIANGLE_STRIP?
【发布时间】:2010-12-15 07:42:55
【问题描述】:

this document(Apple 关于 OpenGL 的 iOS 文档)中,Apple 建议在 iOS 上的 OpenGL ES 中在(索引)三角形上使用三角形条:

为获得最佳性能,您的模型应使用 glDrawArrays 提交为单个未索引的三角形带,并尽可能少地重复顶点。

但是,Imagination Technologies(iOS 设备中使用的图形芯片的创建者)在this document(POWERVR 3D 应用程序开发建议)中提出了相反的建议。他们专门写在第 11 页:

使用索引三角形列表可能比使用条带更有效。

我的问题:谁是对的?还是我误解了这两个文件?

【问题讨论】:

    标签: iphone ios ipad opengl-es


    【解决方案1】:

    TBH 我相信 powerVR。 PowerVR 支持转换后缓存。此缓存意味着在相对接近上次调用位置重复的索引可以完全避免重新转换(它只是将已经转换的值从缓存中拉出)。因此,对于 0、1、2、3、4、5、6、7 的条带,它不会提供任何奖励,但实际上,条带通常并不那么简单。那里会有一些顶点索引重用。这种重用可以完全避免转换。如果条带经过优化以牢记这一点(请参阅NVTriStrip library!),那么您可以获得显着提高的性能,因为不会执行许多转换。

    此外,一个额外的好处是三角形列表不再是性能障碍,因为您将要转换的 2 个顶点在缓存中,因此没有性能损失(除了每个三角形上传 6 个字节而不是 2 (ish),这在宏伟的计划中并不多)。此外,因为您无需执行条带“重新启动”(通过重复最后一个三角形的最后一个索引和下一个三角形的第一个索引来执行重新启动。即 0、1、2、2、3、3, 4,5,6) 一些复杂的网格可能比条带更快。除此之外,在未索引的条带中,每个重复的顶点必须全部向下发送,需要发送的数据量可能比索引列表中需要发送的数据量高很多(因为每个顶点只发送一次,并且在更紧凑的索引中完成重复)。

    当然,MBX (iPhone 3G) 不支持转换后缓存,这很可能是苹果建议的来源。然而,SGX(iPhone 3GS 及更高版本)确实如此,这实际上取决于您希望针对的硬件。如果您可以定位 3GS 及更高版本,则使用索引,否则不要。当然,开箱即用地支持这两种方法将在两个平台上提供最佳性能。

    当然最好的查看方法是两种方法都试一下(确实用不了多久),看看哪个在硬件上表现更好!!

    【讨论】:

    • 很好的建议 Goz。我认为 Apple 在他们自己的“最佳实践”文档中完成所有“翻译”PowerVR 建议的工作,但将这些优化建议转向(条带与索引 tris),这很奇怪。可能是因为你说的原因:3GS 之前的硬件,但苹果的建议通常是最新的,并且主要关注更新的硬件。测试这确实不会那么困难,但我希望我以前知道 ImgTec 的“建议”,因为它可以为我节省很多时间(我已经创建了一些非常复杂的条带,不必要的......)。跨度>
    • @zmippie:我知道你的烦恼是什么意思,这就是为什么像 NVTriStrip 这样的库如此方便的原因。不过,根据以前的经验,我会>总是始终
    • @Goz:你再次说得非常正确。我目前看到的证据表明,在我的特殊情况下,即使使用(我认为非常理想的)顶点排序和索引排序,我也无法通过索引 GL_TRIANGLES 超越 GL_TRIANGLE_STRIPS。我要看看索引的 GL_TRIANGE_STRIPS 是否对我有任何好处,否则它对我来说只是普通的 GL_TRIANGLE_STRIPS...再次感谢!
    • 这很奇怪,因为当我与 Apple 工程师交谈时,他们推荐索引三角形条带作为这些设备的最快数据结构。我相信这也可以在一些 WWDC 和技术谈话视频中找到。我不记得以前读过关于未索引条的建议。
    • @Brad:他说他接下来会尝试。
    猜你喜欢
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2012-09-17
    相关资源
    最近更新 更多