问题简而言之
我最近几周一直在构建一个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中重写动画的渲染。它并没有像预期的那样长。该应用程序现在实现了相当好的性能水平,并且更简单。
答案 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之间移动位(因为你使用的是图像堆栈,而不仅仅是动画一个)。