使用 Core Animation 制作完全自定义的动画 - 性能
Doing completely custom animations with Core Animation - performance
文章
https://www.objc.io/issues/12-animations/animating-custom-layer-properties/
关于使用 Core Animation 制作完全自定义的动画有以下说法:
Suppose that instead of implementing our clock face using individual layers, we wanted to draw the clock using Core Graphics. (In general this will have inferior performance, but it’s possible to imagine that there are complex drawing operations that we might want to implement that would be hard to replicate using ordinary layer properties and transforms.) How would we do that?
换句话说,我们使用CG手动绘制CA的每一帧,因为我们的动画太复杂,仅使用内置的CALayer功能无法完成。
问题是关于性能较差。
- 由于 CG 在 CPU 上运行,这不会有阻塞主线程的风险吗?
- 这是否是使用 SpriteKit 而不是 CA 的原因(因为 SpriteKit 在 GPU 上运行并且不会阻塞主线程)?
- 是的。对于你的第一个问题。使用 Core Graphics(Quartz 或 CG)绘图受到 CPU 限制,并且会大大减慢应用程序的各个方面....如果准备、绘图、合成和演示占用帧时间,您的应用程序将明显停滞和变慢它的帧速率来完成绘图。即使这低于每秒 1 帧。
您在输出大 PDF 时会看到这个。 Core Graphics 忙于以牺牲所有其他 activity 为代价进行渲染,优先考虑输出质量而不是所有其他因素。部分原因是它的起源是 PostScript,以打印输出为目标,其中质量是首要因素 objective,但也因为它仍然是用于创建图像而非动画的以质量为中心的框架。
- SpriteKit 与 CA 的争论比 SpriteKit/CA 与 CG
的争论要微妙得多
了解这些框架的不同优先级、功能和性能特征可以揭示如何最好地将它们一起使用,以及何时单独选择它们。
在 CA 和 CG 的情况下,命名约定传达的依赖性和互操作性不一定是正确的、必要的或存在的,但它们可以有效且很好地结合。这只是一种平衡行为,因为他们做一些非常不同的事情。
CG = Core Graphics
CA = Core Animation
Core Animation 就像它在罐头上所说的那样:非常擅长制作动画。但它也有惊人的创意内容创建工具。可能会让您感到惊讶的事情,因为它不是一个经常被提及的框架。它的许多关键功能都被使用它们的 UIKit 包装器所掩盖。
您所链接的文章完全避免讨论 Core Animation 的内容创建工具,这些工具不是半生不熟,而且非常好。特别是对于动画框架。您可以完全在 Core Animation 中制作所需的所有组件和完美的时钟动画,而无需使用任何较慢的 Core Graphics 绘图。我不确定为什么那篇文章没有说明这些功能。
在 Core Animation 内容创建层上,这里有两个:
CAShapeLayer 可以制作任何形状或形状组合的绘图并制作动画。
CATextLayer 完全支持 NSAttributedString 及其所有属性,并为它们设置动画。
将 Core Animation 想象成受 Flash 和 QuickTime 启发、闭源、特定于平台的 API,用于从头开始创建高性能动画和视觉交互activity。
作为绘图和内容创建框架,CALayers 不具备 Core Graphics 的所有功能。但它们在 SpriteKit 的方式上也远未受到限制。
作为动画和交互activity 框架,Core Animation 是一个比 Sprite Kit 更好且(在许多方面)性能更高的图形、动画和基于事件的游戏引擎,没有一些更具体的 add-ons 包含在 SpriteKit 中。
CALayers 不仅仅是简单的东西。他们能够绘制内容,也能对其进行屏蔽。然后以各种奇妙的方式高度动画,包括伪 3D 旋转 space,完成透视变形。
Core Animation 中缺少,但在 SpriteKit 中是:
- 声音:在 SK 中有两种不同的方式播放声音,none 在 CA 中无需滚动自己
- 游戏循环:虽然 SK 针对事件进行了优化,但它也有一个围绕
构建的游戏循环
- 物理:您需要将 UIKit Dynamics 与核心动画层结合使用才能获得物理效果
- 图像打包:需要对纹理进行自己的文件处理及其解包
- Visual Scene Editor:可以说损失不大。从设计师的角度说
- Visual Particle Editor:这个比较亏。没有一个更难做出好的效果
- SKActions:但是CA同时拥有implicit/explicit动画and/or CAKeyFrameAnimation
使用 SpriteKit 的彻底负面影响:
- 不能很好地使用 UIKit 及其出色的布局能力
- 特殊的错误,因为它被赋予了最少的(看似)资源和错误测试
- 非常小的用户社区,提供少量大部分琐碎的问答支持
- 几乎没有Apple的支持,他们的论坛是悲伤的荒地
- 文档很糟糕,大部分都已过时and/or毫无意义
- None 游戏引擎常用的无数示例和演示
- 通过渗透学习了解工作流程、范例和流程
- 场景编辑器运行缓慢、设计不佳、营养不良且不适合 Xcode
- 没有 NSAttributedString 支持标签和其他文本表示需要
他的一些口头废话我会在第二部分添加答案后删除:
快速回顾 Core Graphics 的历史,并进行适当的改动……
Mac 上的 PostScript 主要负责桌面出版的发展,Mac 在它协助创建的设计和创意计算市场的新兴利基市场取得成功。这些市场让 Apple 得以生存,同时 IBM/Intel/Microsoft 攻击注重成本和兼容性的“生产力”和企业市场。数字创意人员现在对蒂姆库克的苹果公司感到沮丧和愤怒,因为苹果榨取了 iPhone 摇钱树,却没有承认、尊重、关心甚至跟上现代桌面创意的能力。*
选择框架时需要考虑的其他一些运球:
拥有消费和创意计算历史上最大的现金储备,他们也未能在创造创意工具方面进行创新。这感觉(和看起来)很像是对 Apple 核心 values/traditions 以及那些在精简的几十年里致力于学习和使用以 Apple 为中心的创意工具的人们的能量和热情的背叛。毫无疑问,“酷”的创造力帮助苹果变得“酷”,提供了对 iPod 的期待和采用,从而导致 iPhone 和 iPad。
品牌的一些光彩肯定是因为cash-grab专注于iPhone的粗鲁无礼而脱落的。这令人担忧,因为一个简单的原因会影响这些类型的决策:SpriteKit 的使用率一直很低。 Apple 可能会决定削减其本已精简的开发团队的成本,以赚取更大的利润,因为在新 Apple 中,利润似乎压倒了所有其他动机。与 iPhone 带来的利润增长相比,框架和软件开发资源创新方面的支出远不及比例。
Apple 没有表现出理解需求的迹象,也没有积极热情地投资于使新框架尽可能好或稳定。验证并因此吸引开发人员使用新框架需要透明的努力,Apple 似乎不愿意这样做。 Apple 似乎对学习、采用和使用新框架所需的时间和精力不屑一顾。他们完全假设开发人员会冒险采用 Apple 独有的技术,这些技术可能会因一时兴起而关闭。
Sprite Kit 和 Scene Kit 的酝酿期长得离谱,并且在之前的版本中存在一些严重的错误。再加上极差的开发人员沟通以及完全缺乏对编码人员信心和采用率增长的明显关注,这导致了真正贫乏的采用率。
如果没有得到广泛采用,Apple 可能会决定放弃 SpriteKit,而不是让它像过去那样一瘸一拐地走下去。
可以说,cocos2D-X 的持续成功是 Apple 未能使 SpriteKit 尽其所能和应有的直接结果。完全未能以及时和周到的方式支持、沟通、管理和更新其问题,这导致人们强烈希望避免使用 SpriteKit,并且在那些使用 SpriteKit 的开发人员中产生了很多不确定性和恐惧。
由于他们对开发人才的预算几乎是无限的,这种事情应该是苹果的尴尬和批评的来源,并刺激对他们的其他 "initiatives" 和涉足 "innovation" 的密切关注。出于我不明白的原因,批判性地思考 Apple 做什么和不做什么,以及这些选择所产生的影响和影响并不是一件好事。
我认为可以公平地说,他们雇用的 in-house 软件开发人员和软件输出质量在硬件销售、应用商店收入、影响力和市场影响力。这很快就会产生比 Sprite Kit 的瘦用户群和近 non-existent 使用 SceneKit 更明显的后果。
文章
https://www.objc.io/issues/12-animations/animating-custom-layer-properties/
关于使用 Core Animation 制作完全自定义的动画有以下说法:
Suppose that instead of implementing our clock face using individual layers, we wanted to draw the clock using Core Graphics. (In general this will have inferior performance, but it’s possible to imagine that there are complex drawing operations that we might want to implement that would be hard to replicate using ordinary layer properties and transforms.) How would we do that?
换句话说,我们使用CG手动绘制CA的每一帧,因为我们的动画太复杂,仅使用内置的CALayer功能无法完成。
问题是关于性能较差。
- 由于 CG 在 CPU 上运行,这不会有阻塞主线程的风险吗?
- 这是否是使用 SpriteKit 而不是 CA 的原因(因为 SpriteKit 在 GPU 上运行并且不会阻塞主线程)?
- 是的。对于你的第一个问题。使用 Core Graphics(Quartz 或 CG)绘图受到 CPU 限制,并且会大大减慢应用程序的各个方面....如果准备、绘图、合成和演示占用帧时间,您的应用程序将明显停滞和变慢它的帧速率来完成绘图。即使这低于每秒 1 帧。
您在输出大 PDF 时会看到这个。 Core Graphics 忙于以牺牲所有其他 activity 为代价进行渲染,优先考虑输出质量而不是所有其他因素。部分原因是它的起源是 PostScript,以打印输出为目标,其中质量是首要因素 objective,但也因为它仍然是用于创建图像而非动画的以质量为中心的框架。
- SpriteKit 与 CA 的争论比 SpriteKit/CA 与 CG 的争论要微妙得多
了解这些框架的不同优先级、功能和性能特征可以揭示如何最好地将它们一起使用,以及何时单独选择它们。
在 CA 和 CG 的情况下,命名约定传达的依赖性和互操作性不一定是正确的、必要的或存在的,但它们可以有效且很好地结合。这只是一种平衡行为,因为他们做一些非常不同的事情。
CG = Core Graphics
CA = Core Animation
Core Animation 就像它在罐头上所说的那样:非常擅长制作动画。但它也有惊人的创意内容创建工具。可能会让您感到惊讶的事情,因为它不是一个经常被提及的框架。它的许多关键功能都被使用它们的 UIKit 包装器所掩盖。
您所链接的文章完全避免讨论 Core Animation 的内容创建工具,这些工具不是半生不熟,而且非常好。特别是对于动画框架。您可以完全在 Core Animation 中制作所需的所有组件和完美的时钟动画,而无需使用任何较慢的 Core Graphics 绘图。我不确定为什么那篇文章没有说明这些功能。
在 Core Animation 内容创建层上,这里有两个:
CAShapeLayer 可以制作任何形状或形状组合的绘图并制作动画。 CATextLayer 完全支持 NSAttributedString 及其所有属性,并为它们设置动画。
将 Core Animation 想象成受 Flash 和 QuickTime 启发、闭源、特定于平台的 API,用于从头开始创建高性能动画和视觉交互activity。
作为绘图和内容创建框架,CALayers 不具备 Core Graphics 的所有功能。但它们在 SpriteKit 的方式上也远未受到限制。
作为动画和交互activity 框架,Core Animation 是一个比 Sprite Kit 更好且(在许多方面)性能更高的图形、动画和基于事件的游戏引擎,没有一些更具体的 add-ons 包含在 SpriteKit 中。
CALayers 不仅仅是简单的东西。他们能够绘制内容,也能对其进行屏蔽。然后以各种奇妙的方式高度动画,包括伪 3D 旋转 space,完成透视变形。
Core Animation 中缺少,但在 SpriteKit 中是:
- 声音:在 SK 中有两种不同的方式播放声音,none 在 CA 中无需滚动自己
- 游戏循环:虽然 SK 针对事件进行了优化,但它也有一个围绕 构建的游戏循环
- 物理:您需要将 UIKit Dynamics 与核心动画层结合使用才能获得物理效果
- 图像打包:需要对纹理进行自己的文件处理及其解包
- Visual Scene Editor:可以说损失不大。从设计师的角度说
- Visual Particle Editor:这个比较亏。没有一个更难做出好的效果
- SKActions:但是CA同时拥有implicit/explicit动画and/or CAKeyFrameAnimation
使用 SpriteKit 的彻底负面影响:
- 不能很好地使用 UIKit 及其出色的布局能力
- 特殊的错误,因为它被赋予了最少的(看似)资源和错误测试
- 非常小的用户社区,提供少量大部分琐碎的问答支持
- 几乎没有Apple的支持,他们的论坛是悲伤的荒地
- 文档很糟糕,大部分都已过时and/or毫无意义
- None 游戏引擎常用的无数示例和演示
- 通过渗透学习了解工作流程、范例和流程
- 场景编辑器运行缓慢、设计不佳、营养不良且不适合 Xcode
- 没有 NSAttributedString 支持标签和其他文本表示需要
他的一些口头废话我会在第二部分添加答案后删除:
快速回顾 Core Graphics 的历史,并进行适当的改动……
Mac 上的 PostScript 主要负责桌面出版的发展,Mac 在它协助创建的设计和创意计算市场的新兴利基市场取得成功。这些市场让 Apple 得以生存,同时 IBM/Intel/Microsoft 攻击注重成本和兼容性的“生产力”和企业市场。数字创意人员现在对蒂姆库克的苹果公司感到沮丧和愤怒,因为苹果榨取了 iPhone 摇钱树,却没有承认、尊重、关心甚至跟上现代桌面创意的能力。*
选择框架时需要考虑的其他一些运球:
拥有消费和创意计算历史上最大的现金储备,他们也未能在创造创意工具方面进行创新。这感觉(和看起来)很像是对 Apple 核心 values/traditions 以及那些在精简的几十年里致力于学习和使用以 Apple 为中心的创意工具的人们的能量和热情的背叛。毫无疑问,“酷”的创造力帮助苹果变得“酷”,提供了对 iPod 的期待和采用,从而导致 iPhone 和 iPad。
品牌的一些光彩肯定是因为cash-grab专注于iPhone的粗鲁无礼而脱落的。这令人担忧,因为一个简单的原因会影响这些类型的决策:SpriteKit 的使用率一直很低。 Apple 可能会决定削减其本已精简的开发团队的成本,以赚取更大的利润,因为在新 Apple 中,利润似乎压倒了所有其他动机。与 iPhone 带来的利润增长相比,框架和软件开发资源创新方面的支出远不及比例。
Apple 没有表现出理解需求的迹象,也没有积极热情地投资于使新框架尽可能好或稳定。验证并因此吸引开发人员使用新框架需要透明的努力,Apple 似乎不愿意这样做。 Apple 似乎对学习、采用和使用新框架所需的时间和精力不屑一顾。他们完全假设开发人员会冒险采用 Apple 独有的技术,这些技术可能会因一时兴起而关闭。
Sprite Kit 和 Scene Kit 的酝酿期长得离谱,并且在之前的版本中存在一些严重的错误。再加上极差的开发人员沟通以及完全缺乏对编码人员信心和采用率增长的明显关注,这导致了真正贫乏的采用率。
如果没有得到广泛采用,Apple 可能会决定放弃 SpriteKit,而不是让它像过去那样一瘸一拐地走下去。
可以说,cocos2D-X 的持续成功是 Apple 未能使 SpriteKit 尽其所能和应有的直接结果。完全未能以及时和周到的方式支持、沟通、管理和更新其问题,这导致人们强烈希望避免使用 SpriteKit,并且在那些使用 SpriteKit 的开发人员中产生了很多不确定性和恐惧。
由于他们对开发人才的预算几乎是无限的,这种事情应该是苹果的尴尬和批评的来源,并刺激对他们的其他 "initiatives" 和涉足 "innovation" 的密切关注。出于我不明白的原因,批判性地思考 Apple 做什么和不做什么,以及这些选择所产生的影响和影响并不是一件好事。
我认为可以公平地说,他们雇用的 in-house 软件开发人员和软件输出质量在硬件销售、应用商店收入、影响力和市场影响力。这很快就会产生比 Sprite Kit 的瘦用户群和近 non-existent 使用 SceneKit 更明显的后果。