Объединенные обновления
Улучшение рисования производительности путем использования в своих интересах объединенных обновлений.
Объединенные обновления
Mac OS X 10.4 представляет новое поведение объединения обновлений, который позволяет Кварцу более эффективно обновить кадровый буфер во время каждого обновления дисплея. В дополнение к увеличению системной эффективности объединение обновлений улучшает визуальную непротиворечивость и устраняет «разрыв» во время прокрутки и анимации. Для объединения обновлений сервер окна Quartz составляет все буферы окна в единственный внеэкранный кадровый буфер прежде, чем сбросить его на экран. Когда Ваши проблемы приложения команда для сбрасывания система фактически не сбрасывает то содержание до следующего доступного обновления дисплея. Это позволяет всем обновлениям для многократных приложений происходить одновременно. Операции сервера окна (окно изменяют размеры или перемещаются, например), обрабатываются таким же образом — объединенный в экранное обновление в масштабе всей системы.
Как это влияет на приложения?
Большинство приложений получает выгоду от объединенных обновлений, однако, существуют некоторые ситуации, где это может вызвать регрессии производительности. Регрессии имеют тенденцию попадать в две категории:
Вспышка: Приложения, рисующие и сбрасывающие намного быстрее, чем обновление дисплея, снижены скорость к частоте обновления. Идеально, приложения не должны рисовать быстрее, чем обновление дисплея, поскольку оно напрасно тратило бы время, таща пиксели, которые пользователь не будет видеть на дисплее. Как только окно было вовлечено и сбросило буфер, должен быть заблокирован в подготовке к доступу сервера окна, таким образом, приложение может сделать что-либо, что это любит, пока тот сброс не добирается до экрана кроме, вовлекают буфер снова. Если приложение попытается нарисовать сразу то после сброса оно блокирует, пока тот сброс фактически не завершается, поэтому если приложение просто пропускает кадровую синхронизацию, оно должно ожидать вокруг до следующего и не будет в состоянии начать рисовать следующий кадр тем временем.
Расширенный Интервал Получения: Если анимация проведет больше времени в своей подпрограмме получения, чем это берет для экрана для обновления, то это станет отрегулированным к некоторому фактору частоты обновления. Так, если частота обновления составляла 60 кадр/с, и анимация может выполнить самое большее 55 кадр/с, это будет снижено скорость к 30 кадр/с.
Какие инструменты я могу использовать, чтобы сказать, затрагивается ли приложение объединенными обновлениями?
Если приложение, созданное и соединенное на Mac OS X 10.4 и позже проводящее больше времени, таща, чем то же приложение, созданное и соединенное в предыдущей системе, то это, вероятно, затрагивается объединенными обновлениями. Существует два инструмента, которые могут использоваться, чтобы проверить, ли приложение или не затрагивается объединенными обновлениями, Кварцевой Отладкой и Инструментами.
Кварцевая отладка
Кварцевая Отладка является средством отладки для Кварцевой графической системы с несколькими мощными функциями, чтобы помочь Вам идентифицировать много графических дисплеев и проблем производительности. Как только инструменты разработчика Mac OS X были установлены, Кварцевое приложение Отладки расположено в: Инструменты/Developer/Applications/Performance/. Для наблюдения влияния эффектов объединенных обновлений на приложениях, включая приложения CFM и приложения, соединенные в системах до 10,4, включают вызванную синхронизацию луча в Кварцевой Отладке. Приложение, затрагивающееся объединенными обновлениями, будет иметь пониженную частоту кадров, когда синхронизация луча будет включена чем тогда, когда синхронизация луча отключена, и часто будет увеличивать использование CPU. Узнать больше об использовании Кварцевой Отладки, чтобы видеть, что эффект объединенных обновлений видит Вопросы и ответы 1234, Отлаживая Графику с QuartzDebug.
Инструменты
Инструменты являются профильным инструментом, включенным с распределением инструментов разработчика Mac OS X. Инструменты могут использоваться, чтобы профилировать приложение и видеть, проводится ли слишком много времени в операциях рисования, сигнализируя, что приложению объединяли его обновления. Как только инструменты разработчика Mac OS X были установлены, Инструменты, в которых профильный инструмент расположен в системе:/Developer/Applications/. В случае необходимости используйте Кварцевую Отладку, чтобы вызвать синхронизацию луча тогда, в Инструментах, выбрать Ваше приложение с помощью «инструмента» Профилировщика Времени. Если Вы видите время, больше времени потратило в CGContext операции рисования, чем Вы делают с отключенной синхронизацией луча, Вашему приложению объединяли его обновления.
Для узнавания больше об использовании Инструментов для профилирования, см. Инструментальное Руководство пользователя.
Рекомендации
К приложениям это действительно не изменяет то, что они должны делать; это просто осуществляет то, что было рекомендовано в прошлом.
Общие рекомендации
Сброс один раз на событие обновления.
Рассмотрите периодические обновления, когда живое изменение размеров и прокрутка, и в случае необходимости нарисуют более низкие качественные результаты.
В то время как приложение может получить частоту обновления текущего экрана, рекомендация состоит в том, чтобы принять частоту обновления 60 Гц.
Приложения в целом не должны рисовать или сбрасывать быстрее, чем видит пользователь. Для большинства анимаций только нужна частота обновления 30 кадр/с, если анимация должна обновить чаще, то таймер должен использоваться для ограничения уровней анимации частотой обновления или меньше.
Избегите, если это возможно, функций, запрашивающих непосредственный сброс на экран. Получение приложений с Кварцем должно использовать
CGContextSynchronizeвместоCGContextFlush.В использовании Какао
NSViewsetNeedsDisplay:запрашивать обновление на представление вместо более непосредственногоdisplay:, и в использовании HIToolBox УглеродаHIViewSetNeedsDisplayилиHIViewSetNeedsDisplayInRegionвместо непосредственногоHIWindowFlush.
Методы наиболее успешной практики
В рисовании подпрограмм сделайте все вычисления тогда рисуют, минимизируя количество времени между первым касанием контекста и быть сделанным с ним. В окнах, имеющих сложные подпрограммы получения, это минимизирует время, ожидая контекста, сбрасывающегося, чтобы быть выпущенным для большего количества получения.
Это - хорошая идея для анимаций и экранных обновлений, чтобы быть временем, базируемым и ограниченным кадром для работы лучше всего с объединенными обновлениями. Т.е. они должны сделать фиксированную сумму прогресса на единицу времени, а не на кадр, и они не должны пытаться работать на уровне, больше, чем частота обновления.
Приложения, выводящие на экран больше, чем единственная анимация за один раз в одном окне, должны принять меры, чтобы все анимации в окне убежали того же таймера, обновляющего в том же раунде в runloop и сбрасывающего вместе.
Разъедините свой механизм визуализации от Вашего механизма данных так, чтобы никакой механизм не препятствовал другому. Избегите доступа к сети или доступа к диску, который блокировал бы UI.
Последнее средство
Если Ваше приложение не может принять ни одно из вышеупомянутых решений, возможно отключить объединенные обновления для Вашего приложения. Для отключения объединенных обновлений для приложения установите ключ CGDisableCoalescedUpdates к значению CFBoolean истины в Вашем словаре Info.plist как показано в Перечислении 1. Этот ключ только отключит объединенные обновления для приложений, работающих на Mac OS X 10.4.4 или позже.
Перечисление 1 Используя CGDisableCoalescedUpdates, в приложения Info.plist, для отключения объединенных обновлений на 10.4.4 и позже.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>GraphicsApp</string>
<key>CFBundleName</key>
<string>GraphicsApp</string>
...
<key>CGDisableCoalescedUpdates</key>
<true/>
...
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>grap</string>
<key>CFBundleVersion</key>
<string>1.0</string>
</dict>
</plist> |
История версии документа
| Дата | Примечания |
|---|---|
| 31.08.2010 | Передовая статья. Грамматика и написание фиксируют. |
| 20.01.2006 | Измененный значение ключа CGDisableCoalescedUpdates в Info.plist, перечисляющем к истине CFBoolean. |
| 12.01.2006 | Новый документ, описывающий, как достигнуть максимальной частоты кадров в Вашем приложении Mac OS X |