Cocoa ограничения, приводящие к высокому использованию процессора
Недавно я переключился на NSLayoutConstraint
в своем приложении, и я вдруг заметил, что в некоторых представлениях мое приложение использует около 20% или более из CPU постоянно. Как я уже сказал, это происходит только тогда, когда некоторые виды отображаются на экране и только после того, как я переключился на ограничения.
Запустив профайлер времени, я заметил, что [NSView displayIfNeeded]
постоянно вызывается в этих представлениях, хотя ничего не происходит, никаких событий или пользовательских взаимодействий. Кроме того, если я изменил размер своего окна, я смогу найти определенную конфигурацию, в которой использование ЦП переходит к нормальным значениям. Если я вернусь к исходному размеру окна, использование ЦП будет расти снова, а [NSView displayIfNeeded]
снова будет вызвано.
Кажется, что есть определенные комбинации представлений и размеров, которые постоянно обновляются, даже если ограничения не сбой (никаких признаков недопустимых ограничений в консоли не обнаружено).
Кто-нибудь испытал это? Или, по крайней мере, знает, как лучше отслеживать проблему?
После нескольких попыток и ошибок я сузил его до этого вида ![Tableview cell]()
Это пользовательская ячейка в TableView. Если я заменил его нормальной ячейкой, то использование процессора вернется к норме. Я также проверил, что макет не является двусмысленным.
Ответы
Ответ 1
Это часто происходит из-за проблем округления для ограничений. Особенно, если вы используете ограничения "Равная ширина".
![Two Buttons with Equal Width Constraint]()
Другой причиной подобной проблемы является использование ограничений "Центр в контейнере". Которые часто вызывают проблемы округления.
Проверьте свои ограничения, если вы использовали одно из этих ограничений и опустили приоритет. Это позволяет игнорировать эти правила, если они не подходят хорошо. Или даже лучше, создайте макет без ограничений по центру и ширине/высоте.