Почему OS X не имеет таких же мерцающих проблем, как Windows? - PullRequest
10 голосов
/ 17 сентября 2009

Я читал последнее сообщение в блоге Ларри Остермана о отладке мерцающей проблемы в регуляторе громкости Windows Vista / 7 , и я внезапно понял, что не могу вспомнить, чтобы когда-либо видел мерцание приложения в моей OS X ноутбук. Даже приложения, которые в противном случае кажутся плохо написанными, избегают проблемы мерцания в моем опыте. Без этого превращения в дебаты Apple против Windows (пожалуйста), , почему приложения OS X, кажется, не имеют ту же самую проблему мерцания ?

Мне трудно поверить, что разработчики Apple просто великолепно программируют GUI без мерцания, в то время как программисты Windows отстой, так в чем причина? Требует ли API OS X всех графических интерфейсов для реализации двойной буферизации? В то время как некоторые приложения имеют слегка вялый режим изменения размера с двойной буферизацией, у многих нет, и они по-прежнему избегают мерцания. Чем процесс перерисовки в OS X чем-то принципиально отличается от Windows, полностью избегая проблемы WM_ERASEBKGRND? Или есть какая-то другая возможность, которую я не вижу?

Обновление: спасибо за ваши ответы. Хотел бы я выбрать ответы и ken, и cb160, потому что они оба полезны.

Ответы [ 3 ]

16 голосов
/ 17 сентября 2009

Mac OS X имеет окна с двойной буферизацией .

Вам не нужно ничего делать, чтобы это произошло. Это за кадром.

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

При желании вы можете сделать некоторые обещания, позволяющие платформе использовать ярлыки при перерисовке, но они все согласны. Затрагиваются только смежные виды.

Если ваш подкласс NSView реализует метод isOpaque для возврата YES, то платформа никогда не очистит ничего за вашим представлением и не прорисует ни одно из представлений под ним.

Реализация preservesContentDuringLiveResize для возврата ДА дает вам некоторые дополнительные обязанности, но может улучшить производительность при изменении размера окна.

10.6 добавил еще два новых API этого типа, layerContentsRedrawPolicy и layerContentsPlacement.

Наконец, пользовательский рисунок менее распространен, чем в Windows. Большинство представлений, которые вы видите, поставляются фреймворком, а не подклассами. Среда, поставляемая фреймворком, оптимизирована под яблоко.

10 голосов
/ 17 сентября 2009

В Windows Vista / 7 и OSX используются механизмы компоновки для рисования растровых растровых изображений на экране. Эти механизмы компоновки отвечают за обработку выходных данных из всех окон и создание окончательного изображения экрана. Этот подход к компоновке заключается в том, как OSX может использовать эффект джинна при сворачивании в док и как аэро рисует полупрозрачные границы. Они также предотвращают мерцание, как если бы растровое изображение для заполнения определенной области экрана недоступно, оно будет использовать уже имеющееся изображение вместо рисования пустой области.

OSX имеет механизм компоновки с момента его первой поставки. В то время многие люди восприняли это как сумасшедший подход, поскольку все видеокарты, выпущенные в то время, были оптимизированы для рисования растровых изображений (т. Е. Кнопок и границ окон), а не составных изображений. В более поздних версиях OSX композитинг был перенесен в графический процессор (в Quartz Extreme) и, таким образом, потребовал значительную нагрузку на процессор и сделал возможным большее количество эффектов.

Поскольку компоновщик Windows был добавлен только в Windows Vista и только тогда, когда был доступен графический процессор и у вас была правильная версия ОС, он не настолько распространен, как Quartz Compositer в OSX. Поскольку композитор не всегда используется в Windows, мерцание будет происходить, когда область не отображается, и приложение, ответственное за рисование, не может достаточно быстро перерисовать область.

1 голос
/ 17 сентября 2009

Да, это все автоматически с двойной буферизацией. Конечно, если вы работаете устаревший код из Mac OS 9 или код, перенесенный из windoze, это означает, что вы возможно тройная буферизация, не зная об этом. Эй, циклы дешевы!

...