Tim*_*ber 27 cocoa-touch core-animation objective-c ios
在我的应用程序中,我使用drawViewHierarchyInRect:afterScreenUpdates:以获取我的视图的模糊图像(使用Apple的UIImage类别UIImageEffects).
我的代码看起来像这样:
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];
UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
/* Use im */
Run Code Online (Sandbox Code Playgroud)
我在开发过程中注意到,在使用我的应用程序之后,我的许多动画都被延迟了,即,与应用程序的全新启动相比,我的视图在显着(但不到大约一秒)暂停之后开始动画.
经过一些调试后,我注意到仅使用drawViewHierarchyInRect:afterScreenUpdates:屏幕更新设置YES导致此延迟.如果在使用会话期间从未发送此消息,则永远不会出现延迟.使用NO的屏幕更新参数也做出了延迟消失.
奇怪的是,这个模糊的代码与延迟的动画完全无关(据我所知).有问题的动画不使用 drawViewHierarchyInRect:afterScreenUpdates:,它们是CAKeyframeAnimation动画.仅发送此消息(屏幕更新设置为YES)的行为似乎在我的应用程序中全局影响了动画.
这是怎么回事?
(我创建了说明效果的视频:有和没有动画延迟.请注意导航栏中"Check!"语音气泡的外观延迟.)
我已经创建了一个示例项目来说明这个潜在的错误.https://github.com/timarnold/AnimationBugExample
我收到Apple的回复,证实这是一个错误.见下面的答案.
Tim*_*ber 70
我用了一张Apple开发者支持票来向Apple询问我的问题.
事实证明这是一个确认的错误(雷达号17851775).他们对正在发生的事情的假设如下:
方法drawViewHierarchyInRect:afterScreenUpdates:尽可能在GPU上执行其操作,并且大部分工作可能发生在另一个进程中应用程序的地址空间之外.将YES作为afterScreenUpdates:参数传递给drawViewHierarchyInRect:afterScreenUpdates:将导致Core Animation刷新任务和渲染任务中的所有缓冲区.正如您可能想象的那样,在这些情况下还会发生很多其他内部事情.工程理论认为它很可能是这个机器中与你所看到的效果相关的错误.
相比之下,方法renderInContext:在应用程序的地址空间内执行其操作,并且不使用基于GPU的进程来执行工作.在大多数情况下,这是一个不同的代码路径,如果它适合您,那么这是一个合适的解决方法.此路由不如使用基于GPU的任务那样高效.此外,它不像屏幕截图那样准确,因为它可能会排除由GPU任务管理的模糊和其他核心动画功能.
他们还提供了一种解决方法.他们建议代替:
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];
UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
/* Use im */
Run Code Online (Sandbox Code Playgroud)
我应该这样做
UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
/* Use im */
Run Code Online (Sandbox Code Playgroud)
希望这对某人有帮助!
| 归档时间: |
|
| 查看次数: |
15467 次 |
| 最近记录: |