ios - 呈现设备经常更新的线的最佳方式

标签 ios core-graphics uibezierpath cashapelayer cgpath

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

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

    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;

简单吧,就是一条波浪线。

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

这是画一条频繁更新的线的最佳方式吗?

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

最佳答案

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

  • 关闭您在 CGContext 中不需要的任何花哨选项(如果您使用的是 CGPath,否则在您的 UIBezierPath,特别是确保像 setFlatnesssetLineCapsetLineJoin 等设置尽可能简单。你甚至可能想要关闭 setShouldAntialias

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

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

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

  • 曲线更新速度不要快于屏幕刷新速度。这是另一个常见错误,人们每秒计算复杂曲线 100 次,而屏幕每秒仅更新 60 次。

但这主要是一个绘图优化问题。所有有趣的代码都在您未显示的 setValue 方法中。如果您已经难以管理 30fps,那么是的,您肯定是在分析您的绘图。

关于ios - 呈现设备经常更新的线的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39583750/

相关文章:

ios - 计算点大小以适合矩形内的字符串

ios - UIImageView 螺旋动画

iphone - Objective-C:使用 NSDate 和 NSDecimalNumber 计算小时费率

ios - 我无法在 self.window 上使用 navigationController 推送 loginViewcontroller

ios - 使用 Swift 的 Core Graphics/Quartz Core resizing 从较小尺寸调整到较大尺寸

ios - UIBezierPath 部分描边

ios - 使用 CALayers 绘制自定义形状和动画自定义属性?

ios - iOS绘图圈百分比状态的路径

html - 如何使用 swift 解释 IOS 应用程序中的 HTML

ios - 更改 UIScrollView 中的页数