drawViewHierarchyInRect:afterScreenUpdates: 延迟其他动画

2024-03-04

在我的应用程序中,我使用drawViewHierarchyInRect:afterScreenUpdates:为了获得我视野中的模糊图像(使用AppleUIImage类别UI图像效果 https://developer.apple.com/downloads/index.action).

我的代码如下所示:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];
UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
/* Use im */

我注意到在开发过程中,我的许多动画在使用我的应用程序一段时间后都会延迟,也就是说,与应用程序的新启动相比,我的视图在明显(但不到一秒)的暂停后开始动画。

经过一些调试后,我注意到仅使用的行为drawViewHierarchyInRect:afterScreenUpdates:屏幕更新设置为YES造成了这次延误。如果在使用会话期间从未发送此消息,则不会出现延迟。使用NO对于屏幕更新参数也使延迟消失。

奇怪的是这个模糊的代码是完全不相关(据我所知)延迟的动画。有问题的动画不使用 drawViewHierarchyInRect:afterScreenUpdates:, 他们是CAKeyframeAnimation动画。发送此消息的行为(屏幕更新设置为YES)似乎在我的应用程序中对全局动画产生了影响。

这是怎么回事?

(我制作了演示效果的视频:with https://dl.dropboxusercontent.com/u/1991225/Tall%20Chess%20Delay.mov and without https://dl.dropboxusercontent.com/u/1991225/Tall%20Chess%20No%20Delay.mov动画延迟。请注意“检查!”出现的延迟。导航栏中的对话框。)

UPDATE

我创建了一个示例项目来说明这个潜在的错误。https://github.com/timarnold/AnimationBugExample https://github.com/timarnold/AnimationBugExample

更新2号

我收到了 Apple 的回复,确认这是一个错误。查看答案below https://stackoverflow.com/a/25704861/1148702.


我使用我的一张 Apple 开发者支持票向 Apple 询问我的问题。

事实证明这是一个已确认的错误(雷达号 17851775)。他们对正在发生的事情的假设如下:

drawViewHierarchyInRect:afterScreenUpdates: 方法尽可能在 GPU 上执行其操作,其中大部分工作可能会发生在应用程序地址空间之外的另一个进程中。将 YES 作为 afterScreenUpdates: 参数传递给 drawViewHierarchyInRect:afterScreenUpdates: 将导致核心动画刷新您的任务和渲染任务中的所有缓冲区。正如您可能想象的那样,在这些情况下还发生了很多其他内部事情。工程理论认为,这很可能是与您所看到的效果相关的机器中的错误。

相比之下,方法 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 */

我应该这样做

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
/* Use im */

希望这对某人有帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

drawViewHierarchyInRect:afterScreenUpdates: 延迟其他动画 的相关文章

  • React Native 模块中的 EADemo 永远不会收到委托方法handleEvent NSStreamEventOpenCompleted?

    我希望我有一个反应本机桥接模块 https facebook github io react native docs native modules ios html 线程 委托或生命周期问题 我不明白这些问题正在阻止接收委托方法调用 我需要
  • ios - 在日期之间获取(以实际日期,而不是天数)

    我有两个日期字符串 我想获取中间日期 例如 NSString startDate 25 01 2014 NSString endDate 02 02 2014 之间的日期将为 26 01 2014 27 01 2014 28 01 2014
  • 在 Swift 中使用 CIColorMatrix 过滤器

    以下 Swift 函数应该使用指定的 tintColor 对灰度图像 greyImage 进行着色 import UIKit func colorizeImage greyImage UIImage tintColor UIColor gt
  • 如何正确释放附加 C 数组中的内存?

    我只是想弄清楚为什么下面的代码会泄漏内存 并且我有一种有趣的感觉 我没有正确释放数组内存 这是一个更广泛的 Objective C 应用程序中的 C 函数 我不是 C 语言的本地人 我尝试过在数组上使用 free 但有一种感觉这不是全部故事
  • 从 .Plist 加载数组

    我正在尝试从 Plist 中的数组加载数组 但它不起作用 该 plist 看起来像这样 这是我正在使用的代码 NSString path NSBundle mainBundle pathForResource DiseaseProperty
  • Objective-C 中的属性和实例变量

    我对 Objective C 中的属性和实例变量感到相当困惑 我正在阅读 Aaron Hillegass 的 Mac OS X 的 Cocoa 编程 一切都很合乎逻辑 你可以像这样声明一个类 class Something interfac
  • iOS 9 + Xcode 7 的 Segue 上的应用程序导致整个设备崩溃

    更新 我已经在这一年中使用了我的一个 DTS 目前与 Apple 支持工程师合作 根据他的建议 我还为此创建了一个错误报告 随着时间的推移 我将更新此线程 希望能产生最终的解决方案 不知何故 我找到了一种方法来创建一个可以真正重新启动模拟器
  • 通过 IOS Google Drive SDK 列出 Google Drive 的所有文件夹

    实际上我将 google drive sdk 与我的 ios 应用程序集成了 我可以通过适用于 iOS 的 google drive sdk 在 Google Drive 上上传指定文件 此外 我想提供一个功能 用于从可用文件夹中选择一个文
  • 如何在 iOS 中将 URL 添加到 Safari 的阅读列表?

    在我的 UIWebView 中 我想添加一个选项来将当前页面添加到 Safari 的阅读列表中 我知道这个功能的存在 因为 GMail 在长按链接时提供了它 但我找不到任何有关要使用的 URL 方案的信息 可能重复 如何从 iOS 以编程方
  • 如何设置 AWS Appsync 请求超时限制 || AWSAppSync 客户端不提供回调

    我正在使用 AWS Appsync 来开发当前的应用程序 并面临一个严重的问题 即每当我在 Appsync 客户端中触发查询时 当互联网连接速度较慢时 请求永远不会以回调结束 我在互联网上查了一下 关于这个主题的信息来源有限 而且发现这个问
  • 使用 Unity3D 按钮执行 xcode 函数?

    是否可以在 unity 中制作一个按钮来执行 Xcode 中的功能 我正在尝试执行来自 unity3d 项目的推送消息 请帮忙 因为这让我发疯 提前致谢 是的 您可以调用具有 C 接口的本机 Objective C 代码 您甚至可以在 Un
  • Xcode如何将目标打包为.framework(而不是.a库)

    我有一个通用框架项目 其中包含一个库作为其主要目标 在产品下是带有 lib 前缀和 a 扩展名的库 请参阅下面的屏幕截图 我正在使用一个第三方项目 其中包含一个框架作为其目标 并且在 产品 下是具有 framework 扩展名的框架 请参阅
  • 如何在没有 Apple 开发者帐户的设备上运行应用程序

    我找到了几个网站 其中提供了有关如何完成此操作的信息 但似乎没有一个网站适用于 Xcode 10 1 或 iOS 12 1 我尝试过的那些似乎都不起作用 我试过这个 创建一个空的 swift 项目 单视图应用程序 将签名团队设置为我的个人团
  • 某些网站如何在 iOS Safari 中内嵌播放视频?

    非常令人难以置信 因为我认为所有视频都可以在常规野生动物园中扩展为全屏播放 例如检查一下 https entertainment theonion com the onion reviews rogue one 1819596116 htt
  • Objective-c - 类关键字

    我没有在 Objective c 文件中使用 Class https github com cocos2d cocos2d iphone blob 15ed2bc79b74bb13dcd8022d8336a54ede94140c tests
  • iOS 上有像 JUNG 这样的可视化框架吗?

    有没有类似的可视化框架JUNG http jung sourceforge net applet index html对于iOS 我想实现类似的东西this http prefuse org gallery graphview iOS 上最
  • 如何以编程方式伪造 UIButton 的触摸事件?

    我正在编写一些单元测试 并且由于这个特定应用程序的性质 重要的是我要达到尽可能高的水平UI链尽可能 因此 我想做的是以编程方式触发按钮按下 就好像用户按下了按钮一样GUI 是的 是的 我could只需致电IBAction选择器 但同样 这个
  • 在线和离线管理 iPhone 应用程序

    我被困在一个点上 我也在离线管理我的应用程序 第一次我从网络服务获取所有配置文件数据并将其路径存储到 sqlite 中时 我在更新这些数据时遇到问题 例如如果图像发生更改 我应该如何通知我的应用程序 我在 Google 上搜索了它 唯一的解
  • WebCore::UserGestureIndicator::processingUserGesture 中的 EXC_BAD_ACCESS (SIGSEGV)

    我有一个使用 UIWebView 和 HTML5 websockets 构建的 iOS 应用程序 该应用程序经历了看似随机的崩溃 它发生在用户与其交互时以及在用户和应用程序之间没有发生交互的寿命测试期间 崩溃日志都有以下内容 Excepti
  • 用于在某个日期或活动打开 iCal 应用程序的 URL 方案?

    Apple URL 方案参考 https developer apple com library ios featuredarticles iPhoneURLScheme Reference Introduction Introductio

随机推荐

  • HDINSIGHT hive,MSCK REPAIR TABLE table_name 抛出错误

    我有一个名为employee 的外部分区表 带有分区 年 月 日 每天都会有一个新文件出现在特定日期的位置 调用今天的日期 它将是2016 10 13 TABLE SCHEMA create External table employee
  • 在 ExpressJS + Reactjs 中传递数据以查看

    我有一个应用程序 其中一部分是用 Twitter 登录 成功登录后 我通常会将用户数据传递给模板 app get function req res next log The Home page has the user info req s
  • C# 依赖注入运行时(动态)注册

    我正在使用 VS 2017 和 NET Core 使用依赖注入 我想在运行时动态注册我的服务 我的目标是编写在单独的程序集中实现服务接口的服务实例 然后 服务名称 程序集名称将被添加到某种配置文件 或数据库表 中 我的注册代码会做这样的事情
  • OpenMP 中使用循环的并行部分

    我想知道是否有任何技术可以使用 for 循环在 OpenMp 中创建并行部分 例如 我不想创建 n 个不同的 pragma omp 部分 而是使用 n 次迭代来创建它们for loop每个部分都有一些变化的参数 pragma omp par
  • 如何处理具有不同布局的 Visual Studio 解决方案中的 Git 子模块?

    我们使用 Visual Studio 2010 C 进行开发 不久前从 SVN 迁移到 GIT 现在 我们尝试将我们的存储库 相当大 约 30 000 个文件 拆分为许多 git 存储库 每个解决方案一个 这些解决方案共享一些项目 主要是我
  • 无法让 Costura.Fody 工作,一直要求 DLL

    我已使用 nuget 包将 costura fody 安装到我的项目中 我已将 FodyWeavers xml 文件更新为
  • Binary(16) 字段截断 Guid 的尾随零

    在 C 中 我有一个byte 名为 UniqueId 的字段 我将此字段作为 Binary 16 存储在 SQL Server 数据库 EF6 中 我注意到有时 存储的 guid 是 15 个字节而不是 16 个字节 当我这样做时 这会导致
  • 从月份名称获取月份编号?

    快速问题 我有一个按名称列出的月份列表 即 Jan Feb Mar Apr 等 我想将其转换为 1 2 3 4 等 我已经写了一些简单的代码可以做到这一点 但只是好奇是否有人知道使用任何 API 来做到这一点的方法 快速回答 NSDateF
  • Memcached 使用超过最大内存

    我在 memcache 上安装了一个安装程序 我想在生产环境中使用它 但是当我运行了一些测试时 似乎 memcache 不会释放内存 即使它用完了所有分配的内存 我也登录了并运行了flush all命令 但对象仍在缓存中 这是一些测试的输出
  • 使用 CreateProcessAsUser 启动 url

    最近我遇到了一个问题 我需要从提升的应用程序打开网页 我需要以非提升方式打开浏览器 所以我环顾四周 发现这个解决方案 https stackoverflow com a 287072 127602 这肯定会解决我的问题 除了CreatePr
  • windows批处理文件eq此时出乎意料

    我正在编写一个 Windows 批处理脚本来安装服务 首先 我需要查找该服务是否已经存在 如果服务存在 它必须检查状态 如果状态正在运行 则必须停止并删除服务 这是我的代码 test bat 我正在从命令行运行它 for F tokens
  • 操作栏中的自定义主页图标 Sherlock

    我正在尝试使用设置主页图标的自定义图标ActionBarSherlock 库 http actionbarsherlock com 我尝试使用设置自定义布局abHomeLayout我的自定义主题中的属性 但这对我不起作用 唯一的方法 如何设
  • FieldValue.increment 不起作用,但添加“操作数”

    我正在使用 firebase 数据库和一个带有新功能的简单函数FieldValue increment https firebase google com docs reference js firebase firestore Field
  • 在 JavaScript 中执行继承

    现在 虽然我知道您不能像在 C 中那样执行继承 但我在互联网上看到它提到这是可能的 如果无法使用纯 JavaScript 代码 那么是否可以使用Ext JS http en wikipedia org wiki Ext JS如果是这样怎么办
  • 伊莎贝尔的文件准备

    我想获得与相关的 LaTeX 代码这个理论 https github com rjraya Isabelle blob master curves Hales thy 以前的答案仅提供文档的链接 让我描述一下我做了什么 我去了目录Hales
  • Eclipse PDT 插件安装

    我尝试在 Eclipse 中安装 PDT 插件 但出现错误 Cannot complete the install because one or more required items could not be found Software
  • Firebase 身份验证 - 过期的 api 密钥

    我正在开发一个无服务器客户端应用程序 它使用 Firebase 身份验证和 Google 的其他服务 一切都很顺利 突然 FB 登录身份验证停止工作 当尝试登录用户时 我会收到一个 400 BADREQUEST 其正文如下 error co
  • 使用 Socket.IO 发送数据的频率是多少?

    我正在创建一个 Web 应用程序 需要频繁地将少量数据 每个套接字 3 个整数值 从服务器发送到客户端 并且我想看看是否有使用更新客户端的最大频率套接字IO https socket io 我希望能够实现至少 50 个套接字连接 每个连接每
  • 在Delphi XE2上使用MSBuild编译运行时包时出现编译错误

    我正在将我们的构建服务器 Jenkins 升级到Delphi XE2 编译运行时包时出现以下错误 ComponentsR vrc 61 error RC2135 file not found ComponentsR Icon4 ico 此运
  • drawViewHierarchyInRect:afterScreenUpdates: 延迟其他动画

    在我的应用程序中 我使用drawViewHierarchyInRect afterScreenUpdates 为了获得我视野中的模糊图像 使用AppleUIImage类别UI图像效果 https developer apple com do