【问题标题】:Draw large number of paths in drawRect在drawRect中绘制大量路径
【发布时间】:2014-04-19 11:50:58
【问题描述】:

在视图的 drawRect 中渲染大量

我想实时绘制最多 512 个 2 像素宽的片段,但不确定如何以最高性能做到这一点。

将所有这些段创建和绘制为 BezierPath 或多个 bezierPath 不够快。

我读过 CGLayers 可以使用并渲染到目标 UIView 中。

从视图上下文设置图层并使用其自己的上下文写入其他地方的图层后,可以将图层绘制到视图中

CGContextDrawLayerAtPoint(context, point, layer);

如果图层中不断绘制某些内容,它应该何时使用 setNeedsDisplay 通知 UIView 并且它们可以保持同步?例如没有将 setNeedsDisplay 分派到主线程(这感觉不对)。

一旦进行了优化,在图层中渲染这么多路径/线的最佳方式是什么?

【问题讨论】:

  • 贝塞尔路径是静态的吗?如果是,一种方法是在初始化时创建一次路径,然后 drawRect 在需要时使用它们而无需重新创建。标题现在让我忘记了,但是有一个 wwdc 2012 视频关于优化绘图、分析等。

标签: ios core-graphics cglayer


【解决方案1】:

如果你想真正快速,使用 OpenGL ES ;) 否则,有一些一般性的考虑:

  1. 尽可能少做重复工作。例如。如果在渲染之间有 200 个背景多边形保持不变,则将它们渲染为 UIImage 并在 -drawRect 方法的开头绘制该 UIImage。避免使用if(array.count < 3) { y += array.count } else { y += 3 } 之类的东西,因为int array_count = array.count; if(array_count < 3) { y += array_count } else { y += 3 } 更快!好的,在这种情况下没有太大区别,但在很多情况下,这些事情确实很重要!避免在内部循环中创建太多对象。
  2. 使用CADisplayLink
  3. 分析您的代码以查看瓶颈所在。它们是在绘图代码中,还是在计算多边形的代码中?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多