Подсказки по рисованию какао
Этот раздел включает некоторые общие советы для улучшения производительности получения приложений Какао.
Нарисуйте минимально
Плохая производительность получения часто вызывается приложением, получающим содержание излишне. Каждый раз, когда Ваше приложение получает событие, прося, чтобы он перерисовал содержание, это должно обратить внимание на прямоугольник получения, который это получает, и ограничьте себя этим прямоугольником. Ограничительный прямоугольник передается в качестве параметра Вашему представлению drawRect:
метод.
В версии 10.3 OS X и позже, приложения Какао имеют два способа получить более усовершенствованную версию прямоугольника получения. Прямоугольник передается в NSView drawRect:
метод формируется путем создания объединения всех грязных прямоугольников. Однако, если обновленные области являются маленькими и далеко друг от друга, область объединения может часто быть намного больше и содержать много неизменного содержания. Вместо того, чтобы использовать этот прямоугольник, можно вместо этого вызвать представление getRectsBeingDrawn:count:
метод для получения массива отдельных прямоугольников, представляющих точную область обновления. Можно также вызвать needsToDrawRect:
метод, чтобы определить, должен ли быть перерисован определенный прямоугольник.
Можно использовать Кварцевый Отладчик для наблюдения, где приложение рисует и найти области, где это рисует содержание избыточно. Для получения дополнительной информации посмотрите Используя Кварцевую Отладку.
Оптимизируйте Ваш изменять размеры кода
Живое изменение размеров окна имеет тенденцию помещать большую деформацию на Ваш код для прорисовки, чем какая-либо другая работа обновления. В течение нескольких секунд Ваш код для прорисовки мог бы получить десятки событий для обновления значительных частей содержания окна. Если Ваш код для прорисовки не достаточно быстр, чтобы не отставать от этого нападения событий, Ваше приложение может казаться явно вялым пользователю.
Если Вы знаете, что Вы посреди живого, изменяют размеры работы, рассматривают способы упростить Ваш код перерисовки. Данные кэша каждый раз, когда возможный или включают особые случаи в Ваш код для прорисовки, одобряющие скорость по точности.
Живое изменение размеров окон является одним местом, где пользователи замечают низкую производительность. Когда сделано правильно, изменение размеры окна должно чувствовать себя гладким и остаться незамеченным пользователем. Когда сделано неправильно, изменение размеров окна может чувствовать себя изменчивым и вялым.
Ключ к оптимизации живого изменяет размеры кода, должен нарисовать как можно меньше, все еще поддерживая приемлемый взгляд для Вашего окна. Это обычно означает рисовать только L-образную область, представленную путем изменения размеров плюс несколько средств управления, таких как полосы прокрутки и пользовательские виджеты. Однако некоторые приложения, возможно, должны нарисовать больше содержания. Например, приложение, возможно, должно сделать больше перерисовки если это динамично обратные течения ее содержание окна на основе ширины окна и высоты.
Очистите свой код для прорисовки
Код для прорисовки Вашего приложения вызывают часто, чтобы удостовериться, что Ваш интерфейс актуален. Во время живой работы изменения размеров система может вызвать Ваши подпрограммы получения много раз секунда для отображения раскрытых областей окна. Поскольку их можно часто вызывать, Ваши подпрограммы получения должны фокусироваться исключительно на получении. Они не должны пытаться вычислить значения данных или сделать что-либо, что не необходимо для рисования содержания. Например, при разработке игры Вы не должны использовать свою подпрограмму получения для выполнения обнаружения коллизий. Необходимо выполнить те вычисления за пределами основных подпрограмм получения.
Объедините обновления представления
Каждый раз, когда Вы представляете содержание, система отслеживает области, которые Вы изменяете, и объединяет их в область обновления, которая будет сброшена к буферу окна. Если Ваш код для прорисовки обновляет большую площадь экрана с помощью нескольких более коротких вызовов получения, можно хотеть уведомить сервер окна общей области обновления заранее. Лишение законной силы большей области заранее устраняет необходимость вычислить эту область с каждым последовательным вызовом рендеринга.
Используйте setNeedsDisplay:
или setNeedsDisplayInRect:
методы для лишения законной силы надлежащей области представления. Бойтесь объединять свои обновления, если получающаяся область содержала бы неизменное содержание. Можно определить, перерисовываете ли Вы неизменное содержание с помощью Кварцевого приложения Отладки. Посмотрите Измеряющую Производительность Получения для получения дополнительной информации.
Объявите подпредставления как непрозрачные
При реализации пользовательского подкласса NSView можно ускорить производительность получения путем объявления объекта представления как непрозрачного. Непрозрачное представление является тем, заполняющим его весь ограничительный прямоугольник содержанием. Система рисования Какао не отправляет сообщения обновления в суперпредставление для областей, покрытых одним или более непрозрачными подпредставлениями.
isOpaque
метод возвратов NSView NO
по умолчанию. Для объявления пользовательского объекта представления как непрозрачного переопределите этот метод и возврат YES
. При создании непрозрачного представления помните, что объект представления ответственен за заполнение его ограничительного прямоугольника с содержанием.
Сокрытие представлений
В версии 10.3 OS X и позже, приложения Какао могут минимизировать получение путем сокрытия представлений, которые не необходимы в данный момент. Сокрытие представления избавляет от необходимости вызывать код для прорисовки того представления в целом. Сокрытие родительского представления избавляет от необходимости рисовать родителя и все его дочерние элементы.
Используйте setHidden:
метод NSView для маркировки представления скрыл или показал. По умолчанию представления показаны. Чтобы определить, скрыто ли представление, используйте isHiddenOrHasHiddenAncestor
метод. Если текущее представление или какое-либо из его родительских представлений скрыты, этот метод возвращает true. Если необходимо знать, скрыто ли определенное представление, используйте isHidden
метод вместо этого.
Отключите поведение отсечения значения по умолчанию
В версии 10.3 OS X и позже, приложения Какао могут отключить значение по умолчанию, отсекающее обработку области для улучшения производительности. Если Вы уже планируете управлять областью отсечения в Вашем собственном коде для прорисовки, Вы могли бы хотеть сделать это. Для отключения отсечения переопределите wantsDefaultClipping
метод Вашего объекта NSView и возврата NO
.