【问题标题】:Best way to render line that is being updated frequently by the device渲染设备经常更新的线条的最佳方式
【发布时间】:2016-09-19 23:58:18
【问题描述】:

所以现在我有一个持久的数据流进入设备,我想在数据进入时实时绘制趋势线。

这是我将测试数据输入系统的方式

    self.timer = [NSTimer scheduledTimerWithTimeInterval:0.100f
                                                  target:self
                                                selector:@selector(didGetTimerEvent:)
                                                userInfo:nil
                                                 repeats:YES];

    //
    // This is what's in the timer function
    //
    static CGFloat trigger = 0;
    const CGFloat weight = 50;

    // the line view, unsurprisingly, is what draws the line
    lineView.value = 12 * cosf(trigger) * M_PI * 0.6 + weight;
    trigger++;
    if (trigger > 100) trigger = 0;

简单对了,就是一条波浪线。

在线视图的 setValue 属性中,它会将值附加到 NSArray。然后它调用一个渲染函数,在该函数中创建一个点并将其添加到 CGPath,然后将其设置为 CAShapeLayer 的路径属性。之后,CAShapeLayer 处理将所述点绘制到屏幕上的细节。

这是绘制经常更新的线条的最佳方式吗?

如果我只在屏幕上放一个图表,分析器中的 CoreAnimation 工具会读取我正在以 25 fps 的速度绘制,所以现在我开始重新考虑我的实现。

【问题讨论】:

    标签: ios core-graphics uibezierpath cashapelayer cgpath


    【解决方案1】:

    这是一个相当标准的优化问题。首先,您需要确保有效地绘制线条。周围有很多事情:

    • 关闭CGContext 中不需要的任何花哨的选项(如果您使用的是CGPath,否则在您的UIBezierPath 中,尤其要确保@987654324 之类的东西@、setLineCapsetLineJoin 等设置得尽可能简单。您甚至可以关闭setShouldAntialias

    • 确保没有添加比点短的线段。这是一个常见的错误。

    • 不要让路径无限制地增长。我在旧硬件(iPad 3)上的路径多达 5000 个元素时运气不错,但如果你让路径永远增长,任何硬件都会不堪重负。

    • 最终,您可能会发现自己在 CGBitmapContext 中绘制更改要容易得多。如果需要,您甚至可以直接翻转像素。以这种方式很难获得漂亮的抗锯齿线条,但您绝对可以超快。

    • 更新曲线的速度不要超过屏幕刷新速度。这是另一个常见的错误,当屏幕每秒只更新 60 次时,人们每秒计算复杂的曲线 100 次。

    但大多数情况下,这只是一个绘图优化问题。所有有趣的代码都在您未显示的setValue 方法中。如果你已经在管理 30fps 时遇到了问题,那么是的,你肯定是在分析你的绘图。

    【讨论】:

      【解决方案2】:

      我很惊讶它显示 25fps。您的计时器仅适用于 1/10 秒,因此该线路目前应该仅以 10fps 的速度更新。尝试让计时器启动得更快,并考虑改用 CADisplayLink - 这是以设备的帧速率进行更新的更好方法。

      【讨论】:

      • 我真是个白痴。我刚刚检查了我设置 CADisplayLink 的调用,它返回给我一个零!哎呀。等我回家再看看。
      • 所以我修复了这个错误,以确保 CADisplayLink 正在调用它的更新函数并将我的 frameInterval 设置为 1,但它只有 27fps。无论如何,该设备只会以每秒 10 次的速度发送消息。我只是因为无法更频繁地调用我的渲染函数而被刷爆了吗?
      • 不查看核心动画工具的 FPS,而是使用 Time Profiler 时会看到什么?该工具将向您显示代码库中需要很长时间的热点。如果您只是每 1/10 秒更新一次数据,那么以 60fps 运行 UI 并不一定很重要。是否有其他动画正在运行?或者它只是一个静态图? Core Graphics 可能只是限制了 FPS b/c 没有什么可更新的,所以它决定不花费额外的精力来渲染新帧。
      • 对不起,我在那儿掉了车。并没有发生很多事情。我要提出一个新问题。我感觉我缺少一些设置,因为我在屏幕上放了 5 个这样的东西,性能几乎相同。我有一部 iPhone 4s 和一部 iPhone 6,两者的性能非常相似。让我提出我的测试项目。
      猜你喜欢
      • 2013-04-06
      • 2015-10-10
      • 1970-01-01
      • 2018-03-18
      • 1970-01-01
      • 2012-06-04
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多