iOS上的GL_TRIANGLES或GL_TRIANGLE_STRIP?

时间:2010-12-15 07:42:55

标签: iphone ios ipad opengl-es

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

  

为了获得最佳性能,您的模型应使用glDrawArrays作为单个无索引三角形条提交,并尽可能少复制顶点。

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

  

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

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

1 个答案:

答案 0 :(得分:13)

TBH我相信powerVR。 PowerVR支持后变换缓存。这个缓存意味着重复相对接近它们最后调用位置的索引可以完全避免重新转换(它只是将已经转换的值拉出缓存)。因此,在条带为0,1,2,3,4,5,6,7的情况下,它没有提供奖励,但实际上,条带通常不那么简单。那里会有一些顶点索引重用。重复使用可以完全避免变换。如果条带经过优化以考虑到这一点(请参阅NVTriStrip library!),那么您可以获得更好的性能,因为很多变换都不会被执行。

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

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

当然,最好的方法是尝试这两种方法(这样做真的不需要很长时间),看看哪种方法在硬件上表现更好!!