Движок скиннинга в Windows: рисовать только «грязные» области или сразу все окно?

Я хочу создать движок скиннинга, способный рисовать окна нестандартной формы с альфа-смешиванием. То есть будут использоваться многоуровневые окна (UpdateLayeredWindow). Типичное окно будет содержать среди своего фона несколько десятков других растровых изображений в диапазоне от 10 × 10 до, скажем, 300 × 150 пикселей. В худшем случае у большинства этих элементов будет плавная анимация до 30 кадров в секунду. Все будет альфа-смешано, и я собираюсь использовать для этого Direct2D (да, я знаю, что старые версии Windows не поддерживают его). В общем, современный скин-движок Winamp - самый близкий тому пример.

Учитывая все это и принимая во внимание производительность современных ПК, могу ли я просто перерисовывать все окно в каждом кадре или мне нужно ограничиться каким-то прямоугольником клипа?


person Yegor    schedule 14.05.2011    source источник


Ответы (2)


У меня в этом есть некоторый опыт.

Если вам нужна поддержка Windows XP, использование UpdateLayeredWindow - единственный доступный вариант для решения этой проблемы. В документации для этого вызова говорится, что он копирует все растровое изображение на экран каждый раз, когда он вызывается, и это узкое место обнаружилось в моем тестировании как реальный ограничивающий фактор. Если ваше окно имеет размер 300x300, вы платите эту цену за каждое обновление, даже если вы осторожно изменяете только пару пикселей. Было бы очень легко чрезмерно оптимизировать сторону рендеринга без реальной выгоды, поэтому реализуйте что-нибудь простое, измерьте, а затем решите, нужно ли вам оптимизировать.

Если вы можете отказаться от поддержки Windows XP, вы можете полностью отказаться от UpdateLayeredWindow и использовать DwmExtendFrameIntoClientArea для создания того же эффекта, что и многоуровневое окно. Вы будете писать меньше кода, избегать узких мест UpdateLayeredWindow, и с D2D будет легче работать.

person Geoffrey Elliott    schedule 30.05.2011

D2D требовал, чтобы вы выполняли рендеринг с сообщениями WM_Paint Honneslty, использовали интерфейс IAnimation и просто позволяли D2D и окнам беспокоиться о том, как часто перерисовывать, хотя я дам вам знать, Winamp выполняется с Adobe Air, а многослойные окна с d2d вызывают проблемы. (Похоже, что вам нужно использовать цель рендеринга DXGI, но с окном, наложенным слоями, ему нужно, чтобы DC возвращался к вызову завершения рисования, чтобы он мог обновить его альфа-канал)

person johnathan    schedule 30.05.2011