【问题标题】:NSScrollView with massive contentView causing terrible performance on scroll具有大量 contentView 的 NSScrollView 导致滚动性能很差
【发布时间】:2017-07-26 03:09:11
【问题描述】:

我正在尝试绘制一个较大的波形/图形,它是一个位于 NSScrollView 内的 NSView。这样,用户就可以一次水平滚动和部分滚动。

波形视图可以非常大(从技术上讲,无限宽)。

如果绘制整个波形,则滚动性能无法使用。我不确定为什么NSScrollView 试图重绘整个视图而不仅仅是可见的矩形 - 但我怀疑我需要自己实现这个逻辑。

实现此功能以获得良好滚动体验的最有效方法是什么?

【问题讨论】:

  • NSScrollView 是要求您绘制整个视图还是在要求绘制脏部分时绘制整个视图?是否可以选择创建图形图像?

标签: macos cocoa nsscrollview


【解决方案1】:

您可以将滚动视图的内容平铺到几个小的 NSView 实例中,每个实例代表图表的一小部分并并排放置。

但是,我不确定被剪裁到屏幕外的视图在多大程度上仍会消耗资源并影响性能。

更好的方法与上述类似,但依赖于Collection View的内置功能。它的机器肯定只显示应该可见的单元格(不被滚动视图裁剪)。

【讨论】:

  • 收藏视图也出现在我的脑海中——但滚动视图不应该具有相同的内置机制而无需平铺吗?诸如 scrollView:willShowRect: 之类的方法或类似的方法?
  • 如果你的图表是一个单一的单片 NSView,这是一个孤注一掷的事情:NSView 本身不支持对部分遮挡显示的优化,除了 drawRect:...
  • 我不知道你的 NSView 的内容是如何创建的细节,但是分割成图块让系统有更好的机会处理更小的数据。
  • 好吧,正如你提到的,NSViewdrawRect:,大概与NSClipViewNSScrollView 的一部分)结合使用时,应该只会触发可见部分的平局!跨度>
  • 是的...您是否正在实施该方法,并且只计算图表的可见部分? drawRect: 将这种优化交给你;它使它成为你的责任。但我还没有看到你实际“绘制”图形的代码,所以不能肯定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 2012-03-29
  • 2012-05-11
相关资源
最近更新 更多