1

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

所以我想做的是非常快速地生成一个低分辨率的近似值(比如 1/100 秒),并将 UIView 的 CALayer 的内容(例如,view.layer.contents)设置为那个快速的低分辨率图像,然后立即生成背景线程来生成高分辨率版本,以便在准备好后立即替换低分辨率版本。

有哪些明智的方法可以做到这一点?

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

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

4

1 回答 1

1

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

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

于 2012-08-09T04:34:02.797 回答