Cocoa ограничения, приводящие к высокому использованию процессора

Недавно я переключился на NSLayoutConstraint в своем приложении, и я вдруг заметил, что в некоторых представлениях мое приложение использует около 20% или более из CPU постоянно. Как я уже сказал, это происходит только тогда, когда некоторые виды отображаются на экране и только после того, как я переключился на ограничения.

Запустив профайлер времени, я заметил, что [NSView displayIfNeeded] постоянно вызывается в этих представлениях, хотя ничего не происходит, никаких событий или пользовательских взаимодействий. Кроме того, если я изменил размер своего окна, я смогу найти определенную конфигурацию, в которой использование ЦП переходит к нормальным значениям. Если я вернусь к исходному размеру окна, использование ЦП будет расти снова, а [NSView displayIfNeeded] снова будет вызвано.

Кажется, что есть определенные комбинации представлений и размеров, которые постоянно обновляются, даже если ограничения не сбой (никаких признаков недопустимых ограничений в консоли не обнаружено).

Кто-нибудь испытал это? Или, по крайней мере, знает, как лучше отслеживать проблему?

После нескольких попыток и ошибок я сузил его до этого вида Tableview cell

Это пользовательская ячейка в TableView. Если я заменил его нормальной ячейкой, то использование процессора вернется к норме. Я также проверил, что макет не является двусмысленным.

Ответы

Ответ 1

Это часто происходит из-за проблем округления для ограничений. Особенно, если вы используете ограничения "Равная ширина".

Two Buttons with Equal Width Constraint

Другой причиной подобной проблемы является использование ограничений "Центр в контейнере". Которые часто вызывают проблемы округления.

Проверьте свои ограничения, если вы использовали одно из этих ограничений и опустили приоритет. Это позволяет игнорировать эти правила, если они не подходят хорошо. Или даже лучше, создайте макет без ограничений по центру и ширине/высоте.