IOS模拟器和Iphone之间存在显著的应用程序性能差异

IOS模拟器和Iphone之间存在显著的应用程序性能差异,ios,performance,memory-management,ios-simulator,Ios,Performance,Memory Management,Ios Simulator,问题,简而言之 最近几周,我一直在构建一个IOS应用程序,但遇到了一些麻烦。该应用程序通过每秒多次操作并绘制图像光栅来播放动画。通过将图像分配给UIViewsCALayer等self.layer.contents=(id)pimage.CGImage来绘制图像计算和渲染分为两部分CADisplayLinks 这种动画技术在iPhone6.1模拟器上取得了令人满意的性能,但在物理设备(运行IOS 6.1.3的iPhone4S)上构建时,速度会明显减慢。速度太慢了,以至于应用程序无法使用 可疑问题

问题,简而言之

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

这种动画技术在iPhone6.1模拟器上取得了令人满意的性能,但在物理设备(运行IOS 6.1.3的iPhone4S)上构建时,速度会明显减慢。速度太慢了,以至于应用程序无法使用

可疑问题

在这个问题上,我读到,模拟器被允许使用比实际设备多得多的内存。然而,在“instruments”中观察我的应用程序内存使用情况时,我注意到总内存使用量从未超过3MB。因此,我不确定这是否真的是问题所在,但可能值得指出

根据这个问题,IOS模拟器运行的是英特尔芯片,而我的设备实际使用的是苹果A5芯片。我怀疑这也可能是经济放缓的原因

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

如果您能帮助确定问题所在,我们将不胜感激

更新

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

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

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

通常,您希望尝试从计算时间中最小化绘图时间,这听起来像是在做,但请确保不在主线程上进行计算

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

您可以在设备上运行时使用工具,因此CoreGraphics工具可以随时查看正在使用的内容并指向有问题的代码。不幸的是,您可能已经知道了它是什么,接下来就是优化了。

速度的放缓很可能与图像的快速播放有关。我假设您正在使用一系列在显示外观回调中更改的静态图像。我相信,如果您可以使用添加到主视图/图层的Calayer(同时删除旧的Calayer),并且其中已经包含CGImageRef,那么您可以使用CGContextDrawImage()在图层的DrawInText方法中blit图像。将上下文设置为使用copy not blend,以便它只替换旧位

您可以使用分派队列在次线程上创建包含映像的CALayer子类,当然,绘图发生在主队列上。您可以使用一些节流来维持大约10个Calayer的队列,并在消耗时补充它们


如果这不起作用,那么OpenGL可能会有所帮助,但同样,所有这些都无助于在处理器和GPU之间移动位(因为您使用的是图像堆栈,而不仅仅是动画图像)。

您在beth设备和模拟器上的仪器中运行过它吗?我发现模拟器上的计算速度比设备上快得多,但openGL风格的东西在设备上运行得更快。使用计时仪器查看哪些功能占用了所有的处理时间,并首先关注该功能(或将其张贴在此处,以便我们了解其慢的原因)。模拟器还充分利用了Mac的CPU潜力,而在真正的iOS设备上,您的CPU功能要差得多。您已经正式发现了为什么必须在真实设备上测试应用程序。模拟器可以用于基本逻辑测试,但不能用于性能测试。