【问题标题】:Incrementally adding to a UIView增量添加到 UIView
【发布时间】:2011-06-13 02:57:20
【问题描述】:

在我的 iOS 应用程序中,我创建了一个视图,该视图在绘制时使用 UIBezierPath 实时呈现用手指绘制的路径。不幸的是,随着路径变长(数百个顶点),我遇到了性能问题,并且每次刷新视图时都绘制整个路径变得不切实际。

我尝试将路径分成许多不同的段,这样我就可以只绘制在drawRect: 中传递给我的矩形中的段,这很有帮助,但绘制仍然很慢;当部分被添加到屏幕区域中的路径中时,许多段被不必要地重绘。

我没有从视图中删除任何内容,所以我尝试启用 clearsContextBeforeDrawing 并且每次调用 drawRect: 时只绘制最新段,但似乎网上有大量轶事证据表明这一点属性没有做任何事情,我似乎也无法让它工作。

加快绘图速度的最佳方法是什么?

根据我的阅读,我最好的选择似乎是绘制到(屏幕外)位图上下文,因此我可以一点一点地添加并将其复制到屏幕上显示的图形上下文中,但我也读到了由于在将图像渲染到屏幕时需要进行 RGBA 到 RGB 的转换,这在分配上下文时通常都很慢。

看起来我可以做一些涉及CALayer 的事情(无论是否有屏幕外缓冲区)——我不清楚在图层上绘图是如何工作的,以及它是否会规避我遇到的任何问题见过。 contents 属性接受 CGImageRef;我可以创建一个CGImage 然后逐步更新 it 而不重绘所有内容吗?另外,是否可以在不重绘整个内容的情况下添加到 CALayer 的内容中?

任何见解都将不胜感激。


编辑:对于赏金,请提供一个示例,说明如何正确初始化图像缓冲区,在其上绘制三次贝塞尔路径,并将其适当地复制到屏幕上。另外请记下为什么要使用您的方法 - 我不知道使用 CGBitmapContextCreate 是否是最好的方法,或者是否还有其他我应该使用的方法。

【问题讨论】:

  • (如果可能的话,我想避免使用 OpenGL ES,因为在我看来,这增加了很多实现的复杂性,因为我对 OpenGL 真的一无所知。)

标签: cocoa-touch performance drawing calayer


【解决方案1】:

BezierPaths 很好,因为它们是矢量,无论您的视图分辨率如何,它们都会看起来不错。但是,如果您不需要调整视图大小,则无需每次都计算所有内容。只需计算最后一条弧线并将其绘制到前一个(屏幕外)缓冲区,这应该会提高性能。

我记得我在 iPhone 3GS 上获得了大约 12fps 的性能,而且性能并不是什么大问题。这还不错。 (我没有使用贝塞尔路径,我正在使用 CGImageRefs 和原始 rgba 缓冲区进行一些图像处理,这应该是这种方法中最昂贵的部分。只计算 BezierPath 的一条弧线/直线非常便宜)

【讨论】:

  • 谢谢。您能否详细说明如何设置缓冲区以及如何将其复制到屏幕上? (我对 iOS 编程和核心图形有点陌生。)
猜你喜欢
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2015-12-19
  • 2013-08-08
  • 2015-09-06
  • 1970-01-01
相关资源
最近更新 更多