繁体   English   中英

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

[英]Significant application performance difference between IOS simulator and Iphone

问题简而言之

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

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

疑似问题

我已经读过,在这个问题iOS设备和iPhone模拟器之间的内存组织的差异 ,允许模拟器使用比实际设备更多的内存。 但是,在“仪器”中观察我的应用程序内存使用情况时,我注意到总内存使用率从未超过3Mbs。 因此,我不确定这是否真的是问题,但它可能值得指出。

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

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

任何帮助确定问题是什么将非常感激。

更新

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

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

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

通常,您希望尝试最小化计算时间的绘制时间,这听起来就像您正在做的那样,但请确保您不在主线程上进行计算。

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

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

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

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

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

暂无
暂无

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

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