繁体   English   中英

关于在iPhone上加速OpenGL ES 1.1的建议

[英]Advice on speeding up OpenGL ES 1.1 on the iPhone

我正在开发一款严重依赖OpenGL的iPhone App。 现在它在iPhone 3G上运行有点慢,但在新的32G iPod Touch上看起来很快。 我认为这与硬件有关。 无论如何,我想让iPhone的性能与iPod Touch的性能相似。 我相信我在OpenGL中做了很多次优化的事情,我想知道哪些改进会给我带来最大的好处。

我的场景渲染是这样的:

  • 重复35次
    • glPushMatrix
    • glLoadIdentity
    • glTranslate
    • 重复7次
      • glBindTexture
      • glVertexPointer
      • glNormalPointer
      • glTexCoordPointer
      • glDrawArrays(GL_TRIANGLES,...)
    • glPopMatrix

我的顶点,法线和纹理坐标已经交错。

那么,我应该采取什么措施加快速度呢? 你先做什么步骤?

我的第一个想法是通过使用纹理图集来消除所有那些glBindTexture()调用。

一些更有效的矩阵运算怎么样? 我理解gl *()版本效率不高。

维多利亚州立大学呢?

更新

有8260个三角形。 纹理大小为64x64 png。 有58种不同的纹理。

我没有运行乐器。

更新2

在iPhone 3G上运行OpenGL ES仪器后,我发现我的Tiler利用率在90-100%范围内,我的渲染利用率在30%范围内。

更新3

纹理图集对问题没有明显的影响。 使用范围仍然如上所述。

更新4

将我的Vertex和Normal指针转换为GL_SHORT似乎可以提高FPS,但Tiler利用率在很多时候仍然在90%的范围内。 我仍在使用GL_FLOAT作为纹理坐标。 我想我可以将它们击倒到GL_SHORT并为每个顶点节省四个字节。

更新5

将我的纹理坐标转换为GL_SHORT会产生另一个性能提升。 我现在一直都超过30 FPS。 Tiler利用率仍然在90%左右,但经常在70-80%的范围内下降。 渲染器利用率徘徊在50%左右。 我想这可能与从GL_TEXTURE矩阵模式缩放纹理坐标有关。

我还在寻求其他改进。 我想接近40 FPS,因为这就是我的iPod Touch所带来的,它在那里如丝般顺滑。 如果有人还在关注,我还能选择哪些其他低调的水果?

由于平铺器利用率仍然高于90%,您可能仍然受顶点吞吐量限制。 渲染器利用率较高,因为GPU渲染的帧数较多。 如果您的主要关注点是提高旧设备的性能,那么关键还在于减少每个三角形所需的顶点数据量。 这有两个方面:

减少每个顶点的数据量 :现在所有的顶点属性都已经是GL_SHORT ,接下来要做的就是找到一种方法,使用更少的属性或组件来做你想做的事。 例如,如果您可以在没有镜面高光的情况下生活,使用DOT3照明代替OpenGL ES固定功能照明将替换您的3条短裤(+ 1短填充),用于具有2条短裤的法线,以获得额外的纹理坐标。 作为额外的奖励,您可以逐像素地点亮模型。

减少每个三角形所需的顶点数量 :使用索引三角形绘制时,应确保对索引进行排序以便最大程度地重用。 通过Imagination Technologies的PVRTTriStrip工具运行几何图形可能是您最好的选择。

如果你只有58种不同的64x64纹理,纹理图集似乎是一个好主意,因为它们都适合单个512x512纹理......如果你不依赖纹理包裹模式,我当然至少会尝试这个。

你的纹理是什么格式的? 您可以尝试使用压缩的PVRTC纹理; 我认为Tiler的负载较少,即使对于每像素2位纹理,我也对图像质量感到惊喜。 (对于自然图像有好处,如果你正在做一个看起来像8位视频游戏的东西,那就不好了)

我要做的第一件事是在硬件设备上运行仪器分析,这很慢。 它应该很快向您展示您的特定情况的瓶颈所在。

仪器结果后更新:

这个问题在仪器上有类似的结果,也许这个建议也适用于你的情况(基本上减少数字顶点数据)

图形编程的最大胜利归结为:

批处理,批处理,批处理

TextureAtlasing将比你能做的其他任何东西都有更大的不同。 切换纹理就像停止高速列车每次都让新乘客一样。

将所有这些纹理组合成一个地图集,并将绘制调用减少很多。

这个基于Web的工具可能会有所帮助:http: //zwoptex.zwopple.com/

您是否在开发中心查看了“适用于iPhone OS的OpenGL ES编程指南”? 有关于顶点数据和纹理数据的最佳实践的部分。

您的数据是否格式化为能够使用三角形条带?

就努力程度而言,您的修改顺序可能是:

  • 减少顶点属性大小
  • 维也纳组织

请注意,执行这些操作时,需要确保组件在其原始对齐方式上对齐,即浮点数或完整整数位于4字节边界上,短路位于2字节边界上。 如果你不这样做,那将会影响你的表现。 通过键入您的属性排序作为结构定义来精神映射它可能会有所帮助,这样您就可以理智地检查您的布局和对齐方式。

  • 确保您的数据被剥离以共享顶点
  • 使用纹理图集来减少纹理交换

要尝试将纹理转换为16位RGB565格式,请在Apple的古老Texture2D.m中查看此代码,搜索kTexture2DPixelFormat_RGB565

http://code.google.com/p/cocos2d-iphone/source/browse/branches/branch-0.1/OpenGLSupport/Texture2D.m

(此代码加载PNG并在纹理创建时将它们转换为RGB565;我不知道是否存在RGB565文件格式)

有关PVRTC压缩纹理的更多信息(看起来比我使用时更好,即使每像素2位),请参阅Apple的PVRTextureLoader示例:

http://developer.apple.com/iPhone/library/samplecode/PVRTextureLoader/index.html

它既有用于在应用程序中加载PVRTC纹理的代码,也有使用texturetool将.png文件转换为.pvr文件的说明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM