【问题标题】:Masking performance掩蔽性能
【发布时间】:2015-08-07 07:41:24
【问题描述】:

我正在创建一个揭示底层图像的动画。有一个虚拟形状(例如星形)在混乱地移动并揭示图像的不同部分。

所以到目前为止我有两个位图:

  • 面具(一个形状在这里'那里移动的痕迹)
  • 图像(基础图像)

到目前为止,我在每个drawRect() 中:

  1. 通过复制当前掩码创建新掩码位图
  2. 在新面具上画一个印章
  3. 创建结果位图(将 newMask 应用到图像上)
  4. 将生成的位图绘制到屏幕上下文中

我在这种方法的性能上苦苦挣扎。任何想法如何改进它?

特别是:

  • 是否可以跳过第 1 步和第 2 步并直接在蒙版上绘制(而不是克隆它)。
  • 我是否应该开始尝试使用 CALayer 方法(如果这种掩蔽是可能的)
  • 我应该使用 OpenGL
  • 还有其他方法可以解决这个问题吗?

【问题讨论】:

    标签: ios objective-c swift core-graphics core-animation


    【解决方案1】:

    不,您不应该操作位图。这可能会占用大量 CPU 资源,而且很不稳定(动画不流畅)。

    相反,您应该使用 CAShapeLayer 作为蒙版和核心动画。

    使用形状图层,您可以将路径(CGPath,可以从 UIBezierPath 轻松创建)安装到图层中。然后创建一个 CABasicAnimation 将路径切换到新路径。诀窍是在动画的开始和结束路径中始终保持相同数量和类型的控制点。 (如果两条路径中控制点的数量和/或类型不同,您会得到非常非常奇怪的结果。请注意,创建圆弧的路径调用实际上会根据您的圆的多少生成不同数量的控制点弧覆盖,因此圆弧需要特殊处理。)

    我在 Github 上有一个示例项目,它演示了各种核心动画技术,包括一个“时钟擦除”动画的演示,它可以像您描述的那样显示/隐藏和图像视图。

    https://github.com/DuncanMC/iOS-CAAnimation-group-demo

    动画是这样的:

    请注意,该图像的生涩本质是因为它是 GIF。设备上的实际动画非常流畅。也可以像这样创建非常复杂的平滑动画:

    (这不是蒙版动画,但它可能是。)

    【讨论】:

    • 谢谢,我在这里遇到的问题是那个形状,例如星星被克隆——想象 100 颗星星以 1px 的距离排列在一条线上,每颗星星都与邻居重叠。所以这不能用你描述的方法来完成,如果我理解的话。形状实际上不是一个开始,而是更多这样的东西:lh3.googleusercontent.com/-G1PLzaN4rOs/TYrq7Pxg9UI/AAAAAAAACpE/… with alpha channel
    猜你喜欢
    • 1970-01-01
    • 2018-07-29
    • 2017-12-07
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2021-12-28
    • 2018-02-04
    相关资源
    最近更新 更多