所以现在我有一个持续的数据流进入设备,我想在数据进入时绘制一条实时趋势线。
这是我将测试数据输入系统的方式
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
,特别是确保像setFlatness
、setLineCap
、setLineJoin
等设置尽可能简单。你甚至可能想要关闭setShouldAntialias
。确保您没有添加比点短的线段。这是一个常见的错误。
不要让路径无限延伸。我在旧硬件 (iPad 3) 上有多达 5000 个元素的路径,但如果让路径永远增长,任何硬件都会不堪重负。
最终您可能会发现自己在 CGBitmapContext 中绘制更改要容易得多。如果需要,您甚至可以直接翻转像素。很难通过这种方式获得漂亮的抗锯齿线,但您绝对可以获得超快的速度。
曲线更新速度不要快于屏幕刷新速度。这是另一个常见错误,人们每秒计算复杂曲线 100 次,而屏幕每秒仅更新 60 次。
但这主要是一个绘图优化问题。所有有趣的代码都在您未显示的 setValue
方法中。如果您已经难以管理 30fps,那么是的,您肯定是在分析您的绘图。
关于ios - 呈现设备经常更新的线的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39583750/