2010-01-16 64 views
6

我现在想了很长一段时间来优化我的游戏帧率,而没有真正取得进展。我正在运行最新的iPhone SDK并拥有iPhone 3G 3.1.2设备。iPhone的openGLES性能调整

我调用角落找寻150 drawcalls,总共渲染约1900三角形(所有对象都使用两个texturelayers和多纹理纹理化。最纹理来自存储在PVRTC 2bpp压缩纹理相同textureAtlasTexture)。 这使我的手机呈现在30 fps的周围,这对我来说似乎太低了,只有1900个三角形。

我尝试了很多事情来优化性能,包括将对象组合在一起,转换CPU上的顶点并将它们渲染成单个drawcall。这个字节8个drawcalls(作为oposed到150 drawcalls),但性能差不多(fps下降到大约26fps)

我使用存储在交错数组中的32byte顶点(12bytes位置,12bytes normals,8bytes uv) 。我正在渲染triangleLists,顶点按TriStrip顺序排列。

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

  1. 仪器采样 使用仪器和采样yelds这样的结果: http://neo.cycovery.com/instruments_sampling.gif 告诉我说了很多时间在“mach_msg_trap”是花。我搜索了它,似乎这个函数被称为等待一些其他的东西。但等待什么?

  2. 仪器的OpenGL 仪器符合OpenGL模块yelds这样的结果: http://neo.cycovery.com/intstruments_openglES_debug.gif 但在这里,我真的不知道这些数字告诉我

  3. 鲨鱼分析: 与鲨鱼却没有告诉剖析我不到多少: http://neo.cycovery.com/shark_profile_release.gif 数量最多为10%,由DrawTriangles花 - 和所有的剩余在非常小的比例的功能花了

任何人都可以告诉我还有什么可以做的,以找出瓶颈,并可以帮助我解释这些分析信息?

非常感谢!

回答

0

我遗憾的是没有精通OpenGL的,但这里有一些事情我从三个结果中脱颖而出:

1)从采样仪器,你可能有某种背景的网络连接去?

2)呈现的利用率对我来说似乎很低(尽管我不知道如何改善它们)。 3)虽然10%似乎很低,但这似乎是一个很好的攻击点 - 但是几乎同样怀疑在memcpy中花费了很多时间。另外ValidateState的数量也很大,可能会让你失望。

工具明智我认为您使用正确的工具来检查性能,您只需要更多地考虑这些对您的应用程序意味着什么。

1

你可能是CPU绑定的。 OpenGL ES仪器中的tiler /渲染器利用率统计数据表明,以20-30 fps渲染时,GPU的占空比在20-30%之间,这表明如果馈送足够快,GPU可以以60 fps运行。看起来好像有几件事可以通过仪器和鲨鱼获取更多信息来了解更多信息:

默认情况下,采样器显示每个线程的每个采样,这意味着创建了大部分空闲的帮助线程通过系统框架将支配你的观点。为了更好地了解CPU的实际工作情况,请确保显示详细视图(左下角的第三个按钮),并将样本透视图更改为运行样本时间,以排除线程空闲/阻塞的样本。

我从你的应用程序本身没有看到鲨鱼踪迹中的任何样本。这可能是因为你的代码速度足够快,不会出现在热门函数列表中的任何地方,但也可能是因为Shark无法为你的应用程序找到符号。您可能需要在其首选项中配置搜索路径,或者手动将Shark指向您的应用程序二进制文件。此外,Shark默认显示按照CPU时间消耗的顺序排列的函数列表。将视图更改为更像常规调用树的视图可能会很有用,因此您可以直观地了解整个渲染循环如何花费时间。要做到这一点,请将右下角的视图选项更改为“树(自上而下)”(如果您在这里没有看到您的应用程序名称或功能,那么Shark肯定会丢失您的符号。)

0

没有完整的资料来源,很难确切地说出发生了什么。仪器跟踪显示20%渲染利用率,这有点低。这可能意味着你是CPU绑定的。但是,如果是这种情况,我期望在第一个跟踪中看到更多特定于应用的采样点。

我的建议是推出自己的计时课程。事情是这样的(C++):

#include <sys/time.h> 

class Timer 
{ 
public: 
    Timer() 
    { 
     gettimeofday(&m_time, NULL); 
    } 
    void Reset() 
    { 
     gettimeofday(&m_time, NULL); 
    } 
    // returns time since construction or Reset in microseconds. 
    unsigned long GetTime() const 
    { 
     timeval now; 
     gettimeofday(&now, NULL); 
     unsigned long micros = (now.tv_sec-m_time.tv_sec)*1000000+ 
           (now.tv_usec-m_time.tv_usec); 
     return micros; 
    } 
    protected: 
     timeval m_time; 
}; 

时间你的代码段确切地知道你的时间被消耗。

另一个快速解决方法是禁用Thumb指令集。这可以帮助您的浮点性能提高20%或更多,但是会牺牲可执行文件的大小。

0

如果您使用glFlush或glFinish,请删除所有这些。