【问题标题】:Redundant image drawing with CGContextDrawImage使用 CGContextDrawImage 绘制冗余图像
【发布时间】:2011-12-23 07:38:16
【问题描述】:

我希望在屏幕上反复重绘一张图像,但是每秒重绘次数很多,每次绘制图像都会对应用程序的性能造成巨大影响。有没有办法以某种方式缓存 CGImageRef 或使 CGContextDrawImage 执行得更快的东西?

【问题讨论】:

  • 为什么不把图片做成 UIImageView 呢?
  • 这是一张图像,但它在屏幕上的许多位置绘制。所以会有很多 UIImageViews。此外,内容是动态的,因此这些图像的绘制位置会发生变化,所以我认为使用图像视图不是正确的方法。
  • 使用 Box2d 或类似的库并使用精灵。

标签: iphone objective-c cgcontext


【解决方案1】:

尝试使用 UIImageViews 看看它是否足够快。你可以有很多 UIImageViews。您应该将它们的所有图像属性设置为同一个 UIImage 实例。

如果是为了游戏,你应该只使用游戏引擎(Unity、Cocos2D 等)。他们已经花了很多时间研究如何快速制作这些东西。

【讨论】:

  • 这是一个游戏,内容是相当动态的,所以如果可以避免的话,我不想处理添加、移动和删除所有子视图。
  • 你试过了吗?还是只是猜测?
  • 顺便说一句,你没有理由不能缓存 UIImageViews 并重用它们,就像 UITableView 对 UITableViewCells 所做的那样。
【解决方案2】:

CGLayerRef 应该是您所需要的。

来自 Apple 文档:

图层适用于以下情况:

对您计划重复使用的绘图进行高质量的屏幕外渲染。

  • 例如,您可能正在构建一个场景并计划重复使用相同的背景。将背景场景绘制到图层,然后在需要时绘制图层。另一个好处是,您无需了解颜色空间或设备相关信息即可绘制到图层。
  • 重复绘图。例如,您可能想要创建一个由反复绘制的相同项目组成的模式。将item绘制到图层上,然后重复绘制图层,如图12-1所示。您重复绘制的任何 Quartz 对象(包括 CGPath、CGShading 和 CGPDFPage 对象)如果将其绘制到 CGLayer 上,将受益于改进的性能。请注意,图层不仅仅用于屏幕绘图;您可以将它用于不面向屏幕的图形上下文,例如 PDF 图形上下文。

https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/drawingwithquartz2d/dq_layers/dq_layers.html#//apple_ref/doc/uid/TP30001066-CH219-TPXREF101

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2018-07-20
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多