IOS模拟器和Iphone之间的应用程序性能差异很大

时间:2013-06-05 18:34:07

标签: ios performance memory-management ios-simulator

问题简而言之

我最近几周一直在构建一个IOS应用程序并遇到了一些麻烦。应用程序通过操作然后每秒多次绘制图像栅格来播放动画。通过将图像分配给UIViews CALayer来绘制图像,因此self.layer.contents = (id)pimage.CGImage;计算和渲染分为两个CADisplayLink

这种动画技术在iPhone 6.1模拟器上实现了令人满意的性能,但是当它在物理设备(运行IOS 6.1.3的Iphone 4s)上构建时,它会经历显着的减速。减速是如此糟糕,以至于它实际上使应用程序无法使用。

疑似问题

我已经在这个问题Difference of memory organization between iOS device and iPhone simulator中读到,模拟器可以使用比实际设备多得多的内存。但是,在观察我的应用程序内存使用情况时,我注意到总内存使用率从未超过3Mbs。所以我不确定这是否真的是问题,但它可能值得指出。

根据这个问题,Does the iOS-Simulator use multiple cores?,IOS模拟器运行一个英特尔芯片,而实际我的设备使用苹果A5芯片。我怀疑这也可能是放缓的原因。

我正在考虑在Open GL中重写动画,但是在我采取任何激烈步骤之前,我首先想尝试改进现有代码。

任何帮助确定问题的方法都将受到高度赞赏。

更新

感谢所有提出建议的人。 我在分析时发现,主要的瓶颈实际上是清除下一个动画的图像栅格。我决定在opengl中重写动画的渲染。它并没有像预期的那样长。该应用程序现在实现了相当好的性能水平,并且更简单。

2 个答案:

答案 0 :(得分:2)

这是一个经典问题。模拟器正在使用您的高性能工作站/笔记本电脑的资源。

不幸的是,唯一的解决方案是返回并优化您的代码,尤其是显示内容。

通常情况下,您希望尽量减少从计算时间开始的绘图时间,这听起来就像您正在做的那样,但请确保您不在主线程上进行计算。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^{
    // Do the computation
});

您可以在设备上运行时使用仪器,因此CoreGraphics仪器可以随时查看正在使用的仪器并指向有问题的代码。不幸的是,你可能已经知道它是什么了,它只是归结为优化。

答案 1 :(得分:1)

减速很可能与blitting图像有关。我假设您正在使用一系列在显示外观回调中更改的静止图像。我相信如果您可以使用添加到主视图/图层的CALayers(同时删除旧图像),并且已经包含CGImageRefs,则可以使用CGContextDrawImage()在图层的drawInContext方法中对图像进行blit。设置上下文以使用copy not blend,因此它只是替换旧位。

您可以使用调度队列在辅助线程上创建包含图像的CALayer子类,然后当然在主队列上进行绘制。您可以使用一些限制来维护一个大约10个的CALayers队列,并在它们被消耗时补充它们。

如果不这样做,那么OpenGL可能有所帮助,但是这一点都没有帮助在处理器和GPU之间移动位(因为你使用的是图像堆栈,而不仅仅是动画一个)。