gpt4 book ai didi

performance - 层托管的 NSView,内部有大量 CALayers(WindowServer - CPU 100%)

转载 作者:行者123 更新时间:2023-12-03 16:11:24 27 4
gpt4 key购买 nike

我有一个有趣的案例给您。并且需要帮助。

我的 Mac 应用程序有一个图层托管的 NSView,里面有很多图层、子图层和子子图层。想象一个带有项目(图标、文本标签)的 Finder 窗口......类似的东西。每个项目都有一个按钮,选择背景层。

一切都很好,直到你拥有 1000 个这样的元素。

现在,由于有很多这些项目,当我尝试与此 View 交互时,我的应用程序变得无响应。棘手的部分是,消耗 CPU 的不是我的应用程序,而是 WindowServer。它达到 100% 并且系统卡住一段时间。

重要说明:

我的 View 是应用程序界面的一部分。有一个主窗口可以看到其他景色。它们也有自己的结构。

而且我注意到,如果我将这个图层托管 View 放入一个单独的窗口中,它就可以正常工作,不会卡住具有相同的 1000 个项目。但如果我把它放回主窗口,系统就会开始停止。

问题

  1. 我的应用程序( View /层)中的哪些内容让 WindowServer 发疯?
  2. 为什么将此 View 放置到单独的窗口中会有帮助?

我已经运行了一些测试并删除了每个项目的所有子层,每个项目只留下一两个。它减少了系统的负载,但仍然很糟糕。我已经禁用了所有绘图 - 只是图标的小图像。也没有帮助。

最佳答案

WindowServer的主要工作是为macOS绘制图形相关的东西,这意味着你从整个屏幕上看到的所有东西,都必须经过WindowServer并让它绘制你。

WindowServer 使用高 CPU 的原因有很多。

  1. 您的应用程序中有复杂的绘图方法。 -- 尽量简化你的绘图方法。
  2. 桌面上有很多图形,因此 WindowServer 不仅可以绘制您的应用程序,还可以绘制桌面图形。 -- 尝试清理桌面。
  3. 您打开了一些需要复杂图形绘制的应用程序? -- 尝试关闭该应用程序。

在看到您的确切代码之前,我无法告诉您为什么将元素放入单独的窗口中会有帮助。也许窗口本身隐藏了一些东西以便于绘制?

我的一个软件有很多图形元素和动画。但我从来没有遇到过你的问题。创建一个测试项目并尝试类似的事情怎么样?有时,它可以帮助在更清晰的项目结构上看到问题。

我创建了一个简单的演示,窗口中有 100*100 个子层。看起来完全没有问题。

import Cocoa

@NSApplicationMain
class 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)
}
}

enter image description here

关于performance - 层托管的 NSView,内部有大量 CALayers(WindowServer - CPU 100%),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46175906/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com