[英]Difference of memory organization between iOS device and iPhone simulator
[英]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.