导致 CPU 使用率高的 Cocoa 约束

Posted

技术标签:

【中文标题】导致 CPU 使用率高的 Cocoa 约束【英文标题】:Cocoa constraints causing high cpu usage 【发布时间】:2012-08-16 23:06:15 【问题描述】:

我最近在我的应用程序中切换到NSLayoutConstraint,我突然注意到,在某些视图中,我的应用程序经常使用大约 20% 或更多的 CPU。正如我所说,它仅在某些视图出现在屏幕上并且仅在我切换到约束后才会发生。

通过运行时间分析器,我注意到[NSView displayIfNeeded] 在这些视图中被不断调用,即使没有发生任何事情,也没有事件或用户交互。此外,如果我调整窗口大小,我可以找到 CPU 使用率降至正常值的某些配置。如果我将窗口恢复到原来的大小,CPU 使用率会再次增长,[NSView displayIfNeeded] 会再次被不断调用。

似乎有某些视图和大小的组合会不断刷新,即使约束没有崩溃(控制台中没有不满足约束错误的迹象)。

有人经历过吗?或者至少知道如何更好地跟踪问题?

经过一番尝试和错误后,我将其范围缩小到此视图

它是 TableView 中的自定义单元格。如果我用正常的单元格替换它,CPU 使用率就会恢复正常。我还检查了布局没有歧义。

【问题讨论】:

经过更多尝试和错误,我发现了有罪的约束。在上图中,我将验证标签的左侧限制在单元格的中心。约束是在代码中创建的,如果我评论约束cpu使用再次正常。 请用测试用例提交错误!这听起来像是一个框架问题,但我认为它没有被看到。 您发现了在运行时未检测到的约束冲突。 【参考方案1】:

这种情况经常发生,因为约束的舍入问题。特别是如果您使用“等宽”约束。

类似问题的另一个原因是使用“容器中的中心”约束。这通常会导致舍入问题。

如果您使用了这些约束之一并降低它们的优先级,请检查您的约束。如果它们不合适,这允许忽略这些规则。或者更好的是,创建没有中心和相等宽度/高度约束的布局。

【讨论】:

以上是关于导致 CPU 使用率高的 Cocoa 约束的主要内容,如果未能解决你的问题,请参考以下文章

如何停止导致 Firefox 和 Xorg CPU 使用率高的 CSS 动画?

最简单的动画会导致高 CPU 使用率和非常高的能量影响 SpriteKit

由于查询速度慢而导致 CPU 使用率极高的 Wordpress 网站

如何找到导致cpu飙高的线程堆栈信息

Java程序导致服务器CPU占用率过高的问题排除过程

性能分析- 软中断导致 CPU 使用率过高的案例