我想要向用户表示数十万个时间序列数据点.我目前的解决方案是将所述数据呈现给带有第三方库的PNG,然后将该PNG加载到a中NSImage
并在滚动视图中显示它.这很好用,除了:
宽度超过32k像素的NSImages无法正常显示
我希望能够快速轻松地放大数据
从磁盘读取和写入是愚蠢的
我目前的尝试是直接将NSBezierPath
s 绘制成a NSView
.即使我一次只绘制一个有限的点子集,视图渲染得非常漂亮,但非常非常缓慢.每次我滚动我必须重新绘制,这也很慢.
我确定,作为一个相对的Cocoa新手,我错过了一些更好的方法来做到这一点.这样做的"正确"方法是什么?
我目前的尝试是直接将NSBezierPaths绘制到NSView.即使我一次只绘制一个有限的点子集,视图渲染得非常漂亮,但非常非常缓慢.每次我滚动我必须重新绘制,这也很慢.
在您采取任何激烈的解决方案之前,请尝试以下更简单的步骤:
夹.使用NSRectClip
,传递您作为参数的矩形drawRect:
.这是一个单行.
在填充路径之前进行简单的矩形测试 对于每个路径,获取其边界并用于NSIntersectsRect
测试它是否在矩形内.
在描边路径之前进行稍微不那么简单的矩形测试.与上一步类似,除了您需要通过线宽增长矩形(您收到的那个作为参数),因为一半的笔划将落在路径之外.对于每个路径,获取线宽并取消它(delta = -[path lineWidth]
- 是的,您必须包含该减号),然后将结果作为两个参数传递给NSInsetRect
.确保保持原始矩形,因为不同的路径可能具有不同的线宽.
简单来说,这个想法就是减少吸引力.设置剪切路径(使用NSRectClip
)将减少绘制操作导致的blitting数量.排除完全位于绘制矩形之外的路径将为这些路径节省可能更昂贵的剪辑.
当然,您应该在每个步骤进行分析,以确保您没有减慢速度.您可能想要设置某种帧速率计数器.
还有一件事:获取每条路径的边界可能很昂贵.(同样,配置文件.)如果是这样,你可能想缓存界对各路径可能使用一个并行NSArray
的NSValue
S或由您自己设计的对象包装路径和范围在一起.然后,您只计算一次边界,并在将来的绘图运行中仅检索它.