我正在编写适用于 Android 和 iPhone 的 OpenGL ES 1.1 应用程序。 OpenGL ES 引擎位于共享库中,可通过 Android 上的 NDK 访问。
我希望优化我的 OpenGL 性能。那里有很多视频和资源,例如:
http://www.vizworld.com/2010/02/ngmocos-tim-omernick-optimizing-opengl-iphone/
OpenGL ES 2.0 : Seeking VBO Performance/Optimisation Tips For Many Moving Vertices
When are VBOs faster than "simple" OpenGL primitives (glBegin())?
https://gamedev.stackexchange.com/questions/1068/opengl-optimization-tips
但通常有普遍适用的众所周知的技术,例如:
- 使用顶点缓冲对象 (VBO)
- 尽量减少 OpenGL 状态变化
- 尽可能使用纹理图集以避免必须选择许多不同的纹理
有些技术在细节上更加敏感,或者可能更加敏感,并且在 Android 和 iPhone 之间可能有所不同,这就是我感兴趣的。例如:
- 将您的顶点数据交织在每个顶点中:例如顶点坐标;纹理坐标;普通的。交错中是否有项目的首选顺序?
- 将每个顶点填充到下一个字节数的倍数。我看到到处都是数字 32,但在某些地方也看到了 4 或 8。
- 考虑为每个顶点的坐标使用 short 或类似的,而不是 float
所以我的问题是:Android 和 iPhone 之间的神奇优化(例如上面的最后一个列表)有哪些更精细的细节?在它们不同的地方,什么是最好的策略?只使用适合两个世界的值? (根据平台在运行时微调这些细节可能有点过头了?)
最佳答案
答案中提到了主要(正统)优化。但是,还有一些其他鲜为人知的技术适用于在移动设备上进行渲染:
与桌面怪兽相比,移动 GPU 的时钟速率和内存带宽要低得多。尽可能减少过度绘制和纹理访问是明智的。考虑使用 CPU 级隐藏表面去除算法和技术。
使用特定于供应商的分析器针对特定芯片微调您的代码。如果性能因供应商而异,请使用不同的代码路径。
再次强调,移动设备上的填充率至关重要。使用更小的数据类型,更少的纹理提取。 Apple 在新 iPad 上的视网膜显示屏尤其如此。对于合理的公式,优先考虑计算而不是纹理查找(您应该分析)。
关于android - Android 上的 OpenGL 与 iOS : optimisations, 以及它们的不同之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8532971/