我正在开发游戏,游戏速度是60fps,给我大约16ms来执行我需要执行的操作。我发现的是某些代码路径需要一段时间才能执行。起初我认为这必须是内存分配/释放的问题。它可能是,但我已经为更重量级的对象实现了对象池,这似乎没什么影响。
我已经剥离了令人讨厌的大型物体,并用一个更简单的物体替换它们,但制作这个物体仍然需要3ms左右。简单对象包含两个自定义对象,2个数组和2个字典。大对象具有任意复杂性。制作更复杂的大型物体似乎需要线性更多的时间,最多需要20-30ms。在我的游戏的许多情况下,我可以在很短的时间内制作一个很多更复杂的对象。但不知何故,代码中的这些特定位置会导致严重的减速。
我使用以下代码来分析我的功能(最初来自SO):
NSDate* methodStart = [NSDate date];
// My code here.
NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart];
NSLog(@"[CH] executionTime to create %@ = %f", myObject , executionTime );
尽管我可以确认我是否在内部和外部功能中执行了类似的操作,但看起来可能会出现严重的减速:
内部功能调用完成:4ms
...除了计时器之外,内部和外部代码之间没有代码...
外部函数调用完成:8ms
我目前的理论是在导致严重减速的功能之间发生'中间'计算。由于我是Obj-C / C的新手,我不完全确定这种放缓可能是什么。它可能是线程,可能是因为内存alloc / autorelease / dealloc,或其他一些不相关的问题。我试图从仪器获得更多信息而没什么好处。
所以我的问题是:这听起来合乎逻辑吗?是否有可能在我的函数之间发生某种计算,这会在ipad2上占用2-4ms的cpu?如果我的理论不可能,任何想法可以是什么?
答案 0 :(得分:0)
追踪此类问题的最佳方法是使用Instruments来分析代码的执行情况。通常,您可以在模拟器下对Mac上的代码运行此操作以查看时间的位置,但是,在这种情况下,您可能需要在iPad上对其进行分析以确定。
删除基于NSDate的性能分析代码,因为NSDate可能是一个非常重量级的对象,尤其是当您将结果放入自动释放池时,您正在此处执行此操作。
如果您认为必须进行基于NSDate的分析,则只需要创建一个NSDate对象并使用: [methodStart timeIntervalSinceNow] 计算时间增量而不必创建单独的对象并执行日期减法操作。