iPhone openGLES 性能调优

标签 iphone opengl-es performance

我现在尝试了很长一段时间来优化游戏的帧率,但没有真正取得进展。我正在最新的 iPhone SDK 上运行,并拥有 iPhone 3G 3.1.2 设备。

我调用了大约 150 个绘制调用,总共渲染了大约 1900 个三角形(所有对象都使用两个纹理层和多重纹理进行纹理化。大多数纹理来自存储在 pvrtc 2bpp 压缩纹理中的同一纹理AtlasTexture)。 这在我的手机上以大约 30 fps 的速度渲染,在我看来,对于只有 1900 个三角形来说,这个速度太低了。

我尝试了很多方法来优化性能,包括将对象批处理在一起、在 CPU 上转换顶点以及在单个绘图调用中渲染它们。这会产生 8 个绘制调用(相对于 150 个绘制调用),但性能大致相同(fps 下降至 26fps 左右)

我使用存储在交错数组中的 32 字节顶点(12 字节位置、12 字节法线、8 字节 uv)。我正在渲染三角形列表,并且顶点按 TriStrip 顺序排序。

我做了一些分析,但我真的不知道如何解释它。

  1. 仪器采样 使用仪器和采样会产生以下结果: http://neo.cycovery.com/instruments_sampling.gif 告诉我很多时间都花在“mach_msg_trap”上。我用谷歌搜索它,似乎调用这个函数是为了等待其他一些事情。但还等什么?

  2. 仪器-openGL 带有 openGL 模块的仪器会产生以下结果: http://neo.cycovery.com/intstruments_openglES_debug.gif 但在这里我真的不知道这些数字告诉我什么

  3. 鲨鱼分析: 鲨鱼的分析也没有告诉我太多信息: http://neo.cycovery.com/shark_profile_release.gif 最大的数字是 10%,由 DrawTriangles 花费 - 其余的全部花费在非常小的百分比函数中

谁能告诉我我还能做什么来找出瓶颈并帮助我解释这些分析信息?

非常感谢!

最佳答案

您可能受 CPU 限制。 OpenGL ES 仪器中的平铺器/渲染器利用率统计数据显示,以 20-30 fps 渲染时,GPU 的占空比在 20-30% 之间,这表明如果馈送足够快,GPU 可以以 60 fps 运行。看来您可以采取一些措施来从 Instruments 和 Shark 中获取更多有关要追求的目标的信息:

默认情况下,Sampler 显示每个线程的每个样本,这意味着由系统框架创建的大部分空闲的辅助线程将主导您的 View 。为了更好地了解 CPU 实际在做什么,请确保显示“详细信息 View ”(左下角左侧第三个按钮)并将“示例视角”更改为“运行示例时间”以排除线程空闲/阻塞的示例.

我在您的应用程序本身的 Shark 跟踪中没有看到任何样本。这很可能是因为您的代码足够快,以至于它不会出现在热门函数列表中的任何位置,但也可能是因为 Shark 无法找到您的应用程序的符号。您可能需要在其首选项中配置搜索路径或手动将 Shark 指向您的应用程序二进制文件。此外,Shark 默认显示函数列表,按函数所花费的 CPU 时间排序。将 View 更改为更像常规调用树的 View 可能很有用,这样您就可以可视化整个渲染循环如何花费时间。为此,请将右下角的“ View ”选项更改为“树(自上而下)”。 (如果您在这里也没有看到您的应用程序名称或功能,那么 Shark 肯定缺少您的符号。)

关于iPhone openGLES 性能调优,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2075708/

相关文章:

android - 使用 OpenGL ES 的任何分辨率的视口(viewport)边界

c++ - 计算着色器 Open GL ES 的多个输入

Android:OpenGL 存储纹理多长时间?

java - hibernate 按计数排序连接表并返回 pojo 列表

java - 评估赋值运算符性能与具体操作的正确测试用例是什么?

ios - HW kbd 无法将(null)设置为键盘焦点 iOS Xamarin.iOS 10.2.1.5

ios - 如何在用户位置上居中 map IOS 9 SWIFT

iphone - 导航时 iPhone OpenGL 应用程序随机崩溃

javascript - iPhone - 使用 UIWebView 评估 JavaScript 和正则表达式

PHP 5.3 命名空间 我应该使用每个带反斜杠的 PHP 函数吗?