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