使用核心动画实现完全自定义的动画 - 性能

4

这篇文章

https://www.objc.io/issues/12-animations/animating-custom-layer-properties/

关于使用核心动画进行完全自定义动画,以下是一些要说的话:

假设我们想使用Core Graphics绘制时钟面而不是使用单独的图层来实现。 (一般来说,这将具有较差的性能,但我们可以想象存在复杂的绘图操作,难以使用普通的图层属性和变换来复制)。我们该怎么做?

换句话说,我们手动使用CG绘制CA的每一帧,因为我们的动画过于复杂,无法仅使用内置的CALayer功能完成。

问题在于性能较差

  1. 由于CG运行在CPU上,这是否会有阻塞主线程的风险?
  2. 这是否是使用SpriteKit而不是CA的原因(因为SpriteKit在GPU上运行,不会阻塞主线程)?

1
你听过这句老话吗:“如果我有更多时间,我会写得更少。”我刚刚看到了这句话,需要一些时间以简洁、优雅和简练的方式解释一切。虽然我理解这个过程,但选择框架是一项严肃的任务,不应该被隐藏或模糊。苹果公司在解释这些东西在其任务、才能和解决方法层次结构中的位置方面做得非常糟糕......我的意思是......这些都是他们自己的框架,他们几乎没有花费任何文档编写人员来撰写关于它们的协同性和冲突的内容。 - Confused
1
这是一个很大的遗憾,因为每个框架(以及其部分和组成部分)都有独特的才能,并且在某种程度上互补其他部分、碎片和整体。这当然完全取决于项目中任何部分以及整个项目的活动目标。但这些是可以做出的决策,并且决策过程可以透明化。另外...这些是非常重要的决定,应该在开始之前以知道和自信的方式进行高度知情、可证明、理性、合理和明智的决策。 - Confused
1
所以...给我一点时间,来构思一些有见解的东西,如果不是智慧的话。 - Confused
1
经过深思熟虑,你的第二个问题... 你是否假设CA需要CG? - Confused
1
啊,好吧。我得解释一下CA的全部功能。它比你想象的要好得多。可能是苹果产品中最好的。 - Confused
显示剩余2条评论
1个回答

16
是的,对于你的第一个问题,使用Core Graphics(Quartz或CG)进行绘图是CPU密集型的,会极大地减慢应用程序的各个方面......如果准备、绘制、合成和呈现占用了帧时间,你的应用程序将明显停顿,并降低帧率以完成绘图。即使这少于1秒每帧。

当输出大PDF时,你会看到这种情况。Core Graphics繁忙地渲染,牺牲了所有其他活动,青睐输出质量而非其他因素。部分原因是因为它的起源是PostScript,针对印刷品输出,其中质量是主要目标,但也因为它一直是一个面向图像创建而非动画的质量中心框架。

  1. 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,用于高性能动画和可视化交互式创建。

  • 作为一个绘图和内容创建框架,CALayer并没有Core Graphics的所有功能。但它们也远非SpriteKit的限制。

作为一种动画和交互框架,Core Animation 是比 SpriteKit 更优秀、更高效的图形、动画和事件游戏引擎,但没有 SpriteKit 中包含的某些特定附加组件。
CALayers 不仅仅是简单的东西。它们还能够绘制内容,并进行遮罩。然后以各种奇妙的方式高度动画化,包括伪3D旋转空间,完全具有透视失真效果。
在 Core Animation 中缺少而在 SpriteKit 中包含的功能有:
1. 声音:在 SK 中有两种不同的播放声音的方法,在 CA 中没有,需要自己实现。 2. 游戏循环:虽然 SK 优化了事件,但也围绕着一个游戏循环构建起来。 3. 物理性质:您需要使用 UIKit Dynamics 与 Core Animation Layers 一起使用才能获得物理性质。 4. 图像打包:需要为纹理制作自己的文件处理和解压缩。 5. 可视化场景编辑器:从设计师的角度来看,可能不是什么损失。 6. 可视化粒子编辑器:这更像是一种损失。没有它很难制作出好的效果。 7. SKActions:但 CA 有隐式/显式动画和/或 CAKeyFrameAnimation。
使用 SpriteKit 的明显负面因素有:
1. 当需要时,它与 UIKit 及其出色的布局能力不兼容。 2. 因为它被赋予了最少(看起来是)的资源和错误测试,所以会出现奇怪的错误。 3. 提供大量琐碎的 Q&A 支持的用户社区非常小。 4. Apple 几乎没有提供任何支持,他们的论坛是悲伤的荒地。 5. 文档糟糕,大部分已过时或毫无意义。 6. 没有游戏引擎常见的各种示例和演示。 7. 理解工作流程、范例和进程是通过渗透学习获得的。 8. 场景编辑器很慢,设计很差,营养不良,并且与 Xcode 不兼容。 9. 对于标签和其他文本展示需求,没有 NSAttributedString 的支持。拥有消费者和创意计算历史上最大的现金储备,但是在创新创意工具方面却失败了。这感觉(和外观)更像是对苹果核心价值观/传统以及那些在过去几十年中致力于学习和使用苹果中心创意工具的人们的背叛。毫无疑问,“创意酷”的帮助下苹果变得“酷”,为iPod的期望和采用率提供了iPhone和iPad的推动力。
由于对iPhone的不考虑后果的贪婪聚焦,品牌的一些光彩肯定会褪色。这令人担忧的一个简单原因是这些决策的因素之一:SpriteKit的采用率极低。苹果可能会决定削减已经很勉强的开发团队来获得更大的利润,因为在新的苹果公司中,利润似乎胜过所有其他动机。与iPhone带来的利润相比,创新框架和软件开发资源的投入远远不足。
苹果没有表现出理解需求或渴望积极、热情地投资于使新框架变得尽善尽美或稳定的迹象。验证并吸引开发人员采用新框架需要透明的努力,苹果似乎不愿意做出这种努力。对于学习、采用和使用新框架所需的时间和精力,苹果似乎轻视和鄙视。而且,在他们的期望开发人员将冒着采用仅限于苹果的技术的风险(这些技术可能会在追求利润的时候被关闭)的假设下,非常武断。
SpriteKit和SceneKit的孕育期过长,并且之前版本存在一些致命性错误。与极其糟糕的开发者沟通以及对编码器信心和采用率的增长毫无关心,这导致了真正低迷的采用率。
如果没有强大的采用率,苹果可能会决定放弃SpriteKit,而不是让它像现在一样蹒跚前行。
公平地说,cocos2D-X的持续成功直接源于苹果未能使SpriteKit成为它应该成为的东西。完全失败的支持、沟通、管理和解决问题,无论是及时还是体贴的方式,都产生了强烈的愿望,避免使用SpriteKit,并在那些使用SpriteKit的开发人员中产生了很多不确定和担忧。
拥有近乎无限的开发人才预算,这种事情应该成为苹果的尴尬和批评来源,并引发对其其他“倡议”和“创新”尝试的强烈关注。出于我不理解的原因,批评性地思考苹果的所作所为以及这些选择所带来的影响和影响力似乎并不被认为是正确的。
我认为公平地说,他们雇用的内部软件开发人员和软件输出质量远远不能与iOS平台的硬件销售、应用商店收入、覆盖率和市场影响力的增长相匹配

1
有趣的想法。不要删除任何内容。即使在添加第二部分后也要保留它们。这些意见非常受欢迎! - code-ninja-54321
漂亮的回答。谢谢你。我现在相信掌握CA是值得的。 - code-ninja-54321
1
我甚至还没有接触到 CA 的精华部分。掌握它,你就会了解关于苹果应用程序和 SpriteKit 游戏“底层”制作的所有知识。CA 是 UIKit 的后备层,也是 SpriteKit 的内部封装。它是 Apple 框架中的“珍宝”。在博客等方面被严重低估,因为每个人都忙于制作待办事项列表,以便为 iOS 咨询编程自我推销……有点像过去的网页设计师。如果苹果真的很聪明,他们会制作一个核心社区框架来弥补猖獗的贪婪和自私。 - Confused

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接