Вопросы производительности, связанные с взаимодействием Direct3D9 и WPF

Содержимое Direct3D9 можно размещать с помощью класса D3DImage. Размещение содержимого Direct3D9 может повлиять на производительность приложения. В этом разделе описываются рекомендации по оптимизации производительности при размещении содержимого Direct3D9 в приложении Windows Presentation Foundation (WPF). Эти рекомендации охватывают способы использования D3DImage и практические рекомендации при использовании Windows Vista, Windows XP и дисплеев с несколькими мониторами.

Примечание.

Примеры кода, демонстрирующие эти рекомендации, см. в разделе Взаимодействие WPF и Direct3D9.

Редкое использование D3DImage

Отрисовка содержимого Direct3D9, размещенного в экземпляре D3DImage, не выполняется так же быстро, как в чистом приложении Direct3D. Копирование поверхности и очистка буфера команд могут быть весьма затратными операциями. По мере увеличения числа экземпляров D3DImageвыполнятся больший объем очистки, а производительность снижается. Поэтому следует использовать D3DImage как можно реже.

Практические рекомендации по работе в Windows Vista

Для обеспечения оптимальной производительности в Windows Vista при использовании дисплея, настроенного для использования модели драйвера дисплея Windows (WDDM), создайте поверхность Direct3D9 на устройстве IDirect3DDevice9Ex. Это обеспечивает общий доступ к поверхностям. Видеоадаптер должен поддерживать возможности драйвера D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES и D3DCAPS2_CANSHARERESOURCE в Windows Vista. При использовании всех остальных параметров копирование поверхности выполняется с помощью программного обеспечения, что значительно снижает производительность.

Примечание.

Если Windows Vista использует дисплей, настроенный для использования модели драйвера дисплея Windows XP (XDDM), поверхность всегда копируется с помощью программного обеспечения независимо от параметров. При наличии соответствующих параметров и видеоадаптера вы будете наблюдать более высокую производительность в Windows Vista при использовании WDDM, так как копирование поверхности выполняется на оборудовании.

Практические рекомендации по работе в Windows XP

Чтобы обеспечить оптимальную производительность в Windows XP при использовании модели драйвера дисплея Windows XP (XDDM), создайте блокируемую поверхность, которая демонстрирует корректное поведение при вызове метода IDirect3DSurface9::GetDC. Внутри этого метода BitBlt поверхность передается между устройствами на оборудовании. Метод GetDC всегда работает на поверхностях XRGB. Однако если клиентский компьютер работает под управлением Windows XP с пакетом обновления 3 (SP3) или с пакетом обновления 2 (SP2), а у клиента есть исправление для функции многоуровневого окна, этот метод эффективен только для поверхностей ARGB. Видеоадаптер должен поддерживать возможности драйвера D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES.

16-разрядная глубина отображения рабочего стола может значительно снижать производительность. Рекомендуется использовать 32-разрядный рабочий стол.

Если вы разрабатываете решения для Windows Vista и Windows XP, тестируйте производительность в Windows XP. Нехватка видеопамяти на Windows XP представляет собой проблему. Кроме того, D3DImage в Windows XP используется больше видеопамяти и пропускной способности, чем в Windows Vista WDDM, поскольку выполняется обязательное дополнительное копирование видеопамяти. Таким образом, можно ожидать, что производительность будет ниже в Windows XP, чем в Windows Vista при использовании того же видеоустройства.

Примечание.

Драйвер XDDM доступен как в Windows XP, так и в Windows Vista. Однако драйвер WDDM доступен только в Windows Vista.

Общие рекомендации

При создании устройства используйте флаг создания D3DCREATE_MULTITHREADED. Это снижает производительность, однако система отрисовки WPF вызывает методы на этом устройстве из другого потока. Обязательно следуйте протоколу блокировки, чтобы два потока не обращались к устройству одновременно.

Если отрисовка выполняется в управляемом потоке WPF, настоятельно рекомендуется создать устройство с флагом создания D3DCREATE_FPU_PRESERVE. Без этого параметра отрисовка D3D может снизить точность операций двойной точности WPF и привести к проблемам с отрисовкой.

Мозаичное заполнение D3DImage выполняется быстро кроме случаев, когда такое заполнение выполняется для поверхности, отличной от pow2 без аппаратной поддержки или для DrawingBrush либо VisualBrush, которые содержат D3DImage.

Практические рекомендации по работе с дисплеями с несколькими мониторами

Если вы используете компьютер с несколькими мониторами, необходимо следовать описанным выше рекомендациям. Доступны также дополнительные рекомендации по повышению производительности для конфигурации с несколькими мониторами.

Задний буфер создается на определенном устройстве и адаптере, но WPF может отображать передний буфер на любом адаптере. Копирование с одного адаптера на другой для обновления переднего буфера может быть весьма затратной операцией. В ОС Windows Vista, настроенной для использования WDDM с несколькими видеоадаптерами и устройством IDirect3DDevice9Ex, если передний буфер находится на другом адаптере, но использует тот же видеоадаптер, на производительность это не влияет. Однако в Windows XP и XDDM с несколькими видеоадаптерами наблюдается значительное снижение производительности при отображении переднего буфера не на том адаптере, где отображается задний буфер. Более подробную информацию см. в разделе Взаимодействие WPF и Direct3D9.

Сводная информация о производительности

В следующей таблице производительность обновления переднего буфера показана как функция операционной системы, формата пикселей и возможности блокировки поверхности. Предполагается, что передний буфер и задний буфер находятся на одном адаптере. В зависимости от конфигурации адаптера обновления оборудования обычно выполняются гораздо быстрее, чем обновления программного обеспечения.

Формат пикселей поверхности Windows Vista, WDDM и 9Ex Другие конфигурации Windows Vista Windows XP с пакетом обновления 3 (SP3) или с пакетом обновления 2 (SP2) с исправлением Windows XP с пакетом обновления 2 (SP2)
D3DFMT_X8R8G8B8 (неблокируемые) Обновление оборудования Обновление программного обеспечения Обновление программного обеспечения Обновление программного обеспечения
D3DFMT_X8R8G8B8 (блокируемые) Обновление оборудования Обновление программного обеспечения Обновление оборудования Обновление оборудования
D3DFMT_A8R8G8B8 (неблокируемые) Обновление оборудования Обновление программного обеспечения Обновление программного обеспечения Обновление программного обеспечения
D3DFMT_A8R8G8B8 (блокируемые) Обновление оборудования Обновление программного обеспечения Обновление оборудования Обновление программного обеспечения

См. также