在后台线程上渲染新的UIView图层内容?

时间:2012-08-09 03:13:48

标签: objective-c ios5 uiview calayer

我有一大堆旋转动画UIView实例,其内容设置为各种CGImage,这些CGImage都是(并且本质上需要)即时创建的。它工作得很好,但图像生成很慢(大约1/4秒到1秒 - 即不可接受)。

所以我想做的是快速生成低分辨率近似(比如1/100秒),并将UIView的CALayer内容(例如view.layer.contents)设置为快速低分辨率图像,然后立即生成后台线程以生成高分辨率版本,以便在它准备就绪后立即替换低分辨率版本。

有什么明智的方法可以做到这一点?

我的想法是我应该使用GCD(Grand Central Dispatch)来安排后台线程,然后在完成后再次使用它来发送消息。如果我这样做,将新的高分辨率替换图像作为完成消息的一部分发送是否有意义?

如果我需要取消后台主题怎么办?如果用户向前翻页到另一个对象,就会发生这种情况,在这种情况下,我将不得不取消当前的后台任务并为不同的视图启动一个新任务。 (这实际上是一个相当常见的事情,所以我肯定需要处理它。)我不认为我可以杀死后台任务,因为它可能正在处理CGPath,CGGradient,CGImage等对象需要释放。有哪些方法可以从另一个可以测试的线程中设置标志?我应该从主线程向后台线程发送某种“中止”信号,然后让后台线程在最舒适的位置中止图像的创建吗?

1 个答案:

答案 0 :(得分:1)

我不会为此使用GCD。 GCD在回调时更新UI时遇到问题。如果你对每个图像执行此操作,它将破坏性能。只需分离单个线程,并在每次渲染其中一个图像时实现高清图像串行执行回调。它更简单,你对主线程的回调将显示得更快。

出于某种原因,GCD的UI更新似乎不太可靠,因为速度太慢。不知道为什么会这样。