性能 – 内置大量CALayer的层托管NSView(WindowServer – CPU 100%)

性能 – 内置大量CALayer的层托管NSView(WindowServer – CPU 100%),第1张

概述我有一个有趣的案例给你.并需要帮助. 我的Mac应用程序有一个层托管的NSView,里面有很多层,子层和子子层.想象一个带有项目(图标,文本标签)的Finder窗口……就像那样.每个项目都有一个按钮,选择背景图层. 一切都很好,直到你有1000个这样的项目. 现在有很多这些项目,当我尝试与此视图交互时,我的应用程序变得没有响应.而棘手的部分是它不是我的应用程序消耗CPU,而是WindowServe @H_301_2@ 我有一个有趣的案例给你.并需要帮助.

我的Mac应用程序有一个层托管的NSVIEw,里面有很多层,子层和子子层.想象一个带有项目(图标,文本标签)的Finder窗口……就像那样.每个项目都有一个按钮,选择背景图层.

一切都很好,直到你有1000个这样的项目.

现在有很多这些项目,当我尝试与此视图交互时,我的应用程序变得没有响应.而棘手的部分是它不是我的应用程序消耗cpu,而是windowserver.它达到100%并且系统冻结一段时间.

重要的提示:

我的观点是app界面的一部分.有一个主窗口,其他视图.它们也有自己的结构.

而且我注意到,如果我把这个图层托管的视图放到一个单独的窗口中,它可以正常工作,没有冻结具有相同的1000个项目.但是如果我把它放回主窗口就开始停止系统.

问题

>我的应用程序(视图/图层)是什么让windowserver发疯?
>为什么将此视图放在单独的窗口有帮助?

我已经进行了一些测试并删除了每个项目的所有子图层,每个项目只留下一两个.它减轻了系统的负担,但仍然很糟糕.我已经禁用了所有图纸 – 只是图标的小图像.没有帮助.

解决方法 windowserver的主要工作是为macOS绘制图形相关的东西,这意味着你可以从整个屏幕上看到的一切,你必须通过windowserver并让它为你绘制.

windowserver使用高cpu的原因有很多.

>您的应用程序中有复杂的绘图方法. – 尝试简化绘图方法.
>桌面上有很多图形,因此windowserver不仅可以绘制应用程序,还可以绘制桌面图形. – 尝试清理桌面.
>您打开了一些需要复杂图形绘制的应用程序? – 尝试关闭该应用程序.

在看到您的确切代码之前,我无法告诉您为什么将元素放入单独的窗口可以提供帮助.也许窗口本身隐藏了一些东西,以便更容易绘制?

我的一个软件有很多图形元素和动画.但我从未遇到过你的问题.如何创建测试项目并尝试类似的东西?有时,它可以帮助在更清晰的项目结构上看到问题.

我创建了一个简单的演示,窗口中有100 * 100个子图层.似乎没有任何问题.

import Cocoa@NSApplicationMainclass AppDelegate: NSObject,NSApplicationDelegate {@IBOutlet weak var window: NSWindow!func applicationDIDFinishLaunching(_ aNotification: Notification) {    // Insert code here to initialize your application    self.window.contentVIEw?.wantsLayer = true    let size = 10    for i in 0..<10000 {        let x = i%100        let y = i/100        let layer = CALayer()        layer.frame = NSRect(x: x*size,y: y*size,wIDth: size,height: size)        layer.backgroundcolor = .random()        self.window.contentVIEw?.layer?.addSublayer(layer)    }}   func applicationWillTerminate(_ aNotification: Notification) {        // Insert code here to tear down your application    }}extension CGfloat {    static func random() -> CGfloat {        return CGfloat(arc4random()) / CGfloat(UInt32.max)    }}extension CGcolor {    static func random() -> CGcolor {        return CGcolor(red:   .random(),green: .random(),blue:  .random(),Alpha: 1.0)    }}

@H_403_55@ @H_301_2@ 总结

以上是内存溢出为你收集整理的性能 – 内置大量CALayer的层托管NSView(WindowServer – CPU 100%)全部内容,希望文章能够帮你解决性能 – 内置大量CALayer的层托管NSView(WindowServer – CPU 100%)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1011824.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存