【发布时间】:2020-04-06 03:16:10
【问题描述】:
我需要创建不透明的透明窗口,里面有不透明的子视图(称为表面视图)。每个子视图可以包含数千个子视图(称它们为 controlView)。所以结构一定是这样的:
NSWindow(非透明)
- NSView(非透明)(窗口内容视图)
-- NSView(不透明)(SurfaceView)
--- NSView (不透明) (ControlView)
问题是,当内部有数千个 controlView 时,WindowServer 变得过载。看起来窗口中的任何 NSView 都变得不透明。我不明白我必须做什么。
如果 NSWindow 不是不透明的,则 WindowServer 不会过载。但我需要不透明的窗口。这个案例证明了不透明的 NSView 可以包含很多性能良好的子视图。
如果 NSWindow 有 stylemask [.titled, .resizable] 没有过载,窗口变成透明的(证明性能好的透明窗口是可能的),但是鼠标不能通过窗口的透明部分工作。 NSWindow 也有来自私有类 NSThemeframe 的圆角。这个解决方案很脏,因为它需要重新实现鼠标事件并替换私有类中的一些方法。
如果表面是 childWindows 而不是子视图,则不会过载。但是在这种情况下,主窗口不裁剪表面,小型化动画不起作用,实际上窗口不是实际窗口。
我尝试过与 CAlayer、opaque 等不同的组合和操作,但它看起来像一个错误。绝对有可能获得良好的性能,但我不明白如何。有什么想法吗?
【问题讨论】:
标签: macos cocoa nsview nswindow appkit