我一直在尝试执行一些OpenGL ES性能优化,试图增加我能够在iPhone应用程序中呈现的每秒三角形数量,但我已经碰到了一堵砖墙。我已经尝试将我的OpenGL ES数据类型从固定点转换为浮点(每Apple's recommendation),交错我的顶点缓冲区对象,并最大限度地减少绘图状态的变化,但这些变化都没有对渲染速度产生影响。无论如何,我似乎无法在运行3.0操作系统的iPhone 3G上将我的应用程序推到320,000三角形以上。根据{{3}},我应该可以使用我正在使用的平滑着色在这个硬件上达到687,000个三角形/秒。
在我的测试中,当我针对正在运行的设备运行仪器中的OpenGL ES性能工具时,我看到在渲染我的基准测试时统计数据“Tiler Utilization”几乎达到了100%,但“渲染器利用率”只是获得大约30%。这可能提供了关于显示过程中瓶颈是什么的线索,但我不知道这些值是什么意思,我没有找到任何关于它们的文档。有人对iPhone OpenGL ES仪器中的这个和其他统计数据有什么好的描述吗?我知道iPhone 3G中的PowerVR MBX Lite是this benchmark,但我不确定渲染器和Tiler在该架构中的区别。
如果您想以任何方式提供帮助,请使用(BSD许可的)此应用程序tile-based deferred renderer的源代码,如果您想自己下载并测试它。在当前配置中,每次加载新的分子结构并将三角形输出到控制台时,它会启动一个小基准。
答案 0 :(得分:26)
Tiler利用率和渲染器利用率百分比分别测量顶点和片段处理硬件的占空比。在MBX上,Tiler利用率通常根据发送到GPU的顶点数据量进行扩展(根据顶点数量和每个顶点发送的属性的大小),碎片利用率通常随着透支和纹理采样而增加
在你的情况下,最好的办法是减少你发送的每个顶点的大小。对于初学者,我会尝试按颜色对原子和键进行分级,并使用恒定颜色而不是数组发送每个分区。我还建议调查短裤是否适合您的位置和法线,给予适当的缩放。在这种情况下,您可能还必须按位置进行分区,如果缩放以提供足够的精度,则不会覆盖您需要的范围。这些技术可能需要额外的绘制调用,但我怀疑顶点吞吐量的改善将超过额外的每次绘制调用CPU开销。
请注意,确保每个顶点属性在32位边界上开始通常是有益的(在MBX和其他地方),这意味着如果将它们切换为短路,则应将位置和法线填充到4个组件。 MBX平台的特性也使得在这种情况下你想要在glVertexPointer的调用中实际包含该位置的W分量。
您也可以考虑为您的多边形数据(尤其是球体)采用DOT3等替代照明方法,但这需要特别注意确保您不会使渲染片段受限,或者无意中发送比以前更多的顶点数据
答案 1 :(得分:6)
很棒的回答,@ Pivot!作为参考,this Apple doc定义了以下术语: