我有一个有趣的案例需要你帮忙解决。
我的Mac应用程序有一个 layer-hosted NSView,里面有很多层和子层以及子子层。可以想象成一个Finder窗口里的项目(图标、文本标签)等等。每个项目都有一个按钮、选择背景层。
一切都很好,直到你拥有了1000个这样的项目。
现在,当我尝试与此视图交互时,我的应用程序变得不响应。棘手的是,消耗CPU的不是我的应用程序,而是WindowServer。它达到了100%,系统会冻结一段时间。
重要说明:
我的视图是应用程序界面的一部分。有一个带有其他视图的主窗口。它们也有自己的结构。
我注意到,如果我将这个 layer-hosted 视图放在一个单独的窗口中,即使拥有相同的1000个项目,它也能正常工作。但如果把它放回主窗口,就会开始阻塞系统。
问题:
- 我的应用程序中的哪些视图/层会导致 WindowServer 出问题?
- 为什么把这个视图放在一个单独的窗口里会有帮助?
我进行了一些测试,删除了每个项目的所有子层,只留下一两个子层。这减轻了系统的负担,但仍然不好。我禁用了所有绘图 - 只为图标使用了小图片。也没有帮助。