1

简而言之问题

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

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

疑似问题

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

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

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

任何帮助确定问题所在将不胜感激。

更新

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

4

2 回答 2

2

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

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

通常,您希望尽量减少计算时间的绘制时间,这听起来像是您正在做的事情,但请确保您不在主线程上进行计算。

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

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

于 2013-06-05T18:42:44.633 回答
1

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

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

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

于 2013-06-05T19:04:24.717 回答