- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个有趣的案例给您。并且需要帮助。
我的 Mac 应用程序有一个图层托管的 NSView,里面有很多图层、子图层和子子图层。想象一个带有项目(图标、文本标签)的 Finder 窗口......类似的东西。每个项目都有一个按钮,选择背景层。
一切都很好,直到你拥有 1000 个这样的元素。
现在,由于有很多这些项目,当我尝试与此 View 交互时,我的应用程序变得无响应。棘手的部分是,消耗 CPU 的不是我的应用程序,而是 WindowServer。它达到 100% 并且系统卡住一段时间。
重要说明:
我的 View 是应用程序界面的一部分。有一个主窗口可以看到其他景色。它们也有自己的结构。
而且我注意到,如果我将这个图层托管 View 放入一个单独的窗口中,它就可以正常工作,不会卡住具有相同的 1000 个项目。但如果我把它放回主窗口,系统就会开始停止。
问题
我已经运行了一些测试并删除了每个项目的所有子层,每个项目只留下一两个。它减少了系统的负载,但仍然很糟糕。我已经禁用了所有绘图 - 只是图标的小图像。也没有帮助。
最佳答案
WindowServer
的主要工作是为macOS绘制图形相关的东西,这意味着你从整个屏幕上看到的所有东西,都必须经过WindowServer
并让它绘制你。
WindowServer 使用高 CPU 的原因有很多。
在看到您的确切代码之前,我无法告诉您为什么将元素放入单独的窗口中会有帮助。也许窗口本身隐藏了一些东西以便于绘制?
我的一个软件有很多图形元素和动画。但我从来没有遇到过你的问题。创建一个测试项目并尝试类似的事情怎么样?有时,它可以帮助在更清晰的项目结构上看到问题。
我创建了一个简单的演示,窗口中有 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)
}
}
关于performance - 层托管的 NSView,内部有大量 CALayers(WindowServer - CPU 100%),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46175906/
我需要制作一个功能非常简单的 kext。每当按下组合键时,kext 应该终止恰好是“WindowServer”的进程 由于问题的性质,它必须是 kext。它必须独立于系统的用户界面,所以如果它挂断了,
我需要创建非不透明的透明窗口,其中包含不透明的 subview (称为surfaceView)。每个 subview 可以包含数千个 subview (称为controlView)。所以结构一定是这样
我正在尝试注册 CGScreenRefreshCallback 和 CGScreenUpdateMoveCallback(这是苹果对 http://developer.apple.com/mac/li
我有一个有趣的案例给您。并且需要帮助。 我的 Mac 应用程序有一个图层托管的 NSView,里面有很多图层、子图层和子子图层。想象一个带有项目(图标、文本标签)的 Finder 窗口......类似
我正在 Mac 上开发一个 UI 应用程序。运行大约 1 小时后,应用程序似乎卡住了。同时,WindowServer 进程占用的 CPU 非常高,在 50%~100% 之间。 我google了很多,似
我一直在尝试 PyObjC,但似乎无法让 QTKit 导入工作。如果我像这样导入 QTKit: from QTKit import * 我会收到大量错误: [Session started at 20
如有错误请指正。我的理解是 Mac OS X 有一个 WindowServer 进程,它从所有应用程序合成窗口,并在屏幕上绘制最终的合成图像。那么问题是 WindowServer 进程从哪里获得其他应
所以我正在使用java和maven学习selenium和jenkins集成。我在使用 chrome 和 jenkins 时遇到了问题,并被告知我应该尝试 firefox webdriver。这就是我所
我是一名优秀的程序员,十分优秀!