【发布时间】:2012-01-21 21:49:20
【问题描述】:
我正在编写适用于 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。
- 考虑为每个顶点的坐标使用短的或类似的,而不是浮点数
所以我的问题是:神奇优化的更精细细节是什么,例如上面最后一个列表,Android 和 iPhone 之间有什么不同?它们在哪里不同,最好的策略是什么?只需使用适合两个世界的值吗? (根据平台在运行时微调这些细节可能有点过头了?)
【问题讨论】:
-
我不是这方面的专家,但 AFAIK 的优化主要取决于底层芯片。 iPhone 的 GPU 芯片(有点)更加一致,但在 android 中你可以有几个 GPU 芯片:Adreno 2xx、PowerVR SGXxxx、Malixxx、Tegra2。功能上也存在差异。另外,只是出于好奇?为什么你使用 1.1 而不是 2.0?我认为使用可编程着色器可以更好地优化代码(当然,您的应用程序将支持更少的设备......但现在 AFAIK 每个 android 设备都支持 2.0)
-
至于使用OpenGL ES1.1:是支持一些老设备的问题。关于芯片组的要点!
标签: android iphone optimization opengl-es opengl-es-2.0