NSView 上的 SetNeedsDisplay 触发整个视图层次结构的重绘

SetNeedsDisplay on NSView triggers the redrawing of the whole views hierarchy

我正在开发一个由 NSWindow 制作的应用程序,它拥有很多自定义子视图,这些子视图可能是不透明的,也可能不是。 每当我在子视图上调用 SetNeedsDisplay: 或 SetNeedsDisplayInRect: 时,系统都会从父 NSWindows 的内容视图开始调用每个子视图的 drawRect。

如何避免?我怎样才能重绘脏子视图(它应该是默认行为)?在对 NSView 进行子类化时,我是否遗漏了什么?或者在设置父 NSWindow 的属性或样式中?

谢谢

可不透明的是麻烦点。任何非不透明视图都会触发整个视图层次结构的重绘,因为 window 必须将该视图背景恢复到原始状态。只有设置为不透明的视图可能不需要重绘其下方的任何其他内容。但是,如果不透明视图本身被其他视图部分覆盖,它们可能仍会触发“上方”重绘。

好的,我想我已经弄明白了。似乎将所有子视图转换为 layer-backed 视图就可以了。 给出 gpu 管理图层的方式以及图层合成的执行方式是合理的。 但我仍然不明白为什么,使用“经典”NSViews,无论它们是否不透明,兄弟姐妹或 children,重叠与否,我都无法在系统调用 [= 的情况下使单个视图无效window

的整个视图层次结构的 13=]