Как определить, использует ли WPF аппаратный или программный рендеринг?
Я тестирую приложение WPF на различных платформах, и мне нужен простой способ определить, использует ли WPF аппаратный или программный рендеринг.
Кажется, я вспоминаю звонок, чтобы определить это, но не могу сейчас на него положиться.
Кроме того, существует ли простой, основанный на коде способ навязывания одного конвейера рендеринга другому?
7 ответов
Проверьте RenderCapability.Tier
- http://msdn.microsoft.com/library/ms742196%28v=vs.100%29.aspx
- http://msdn.microsoft.com/en-us/library/system.windows.media.rendercapability_members.aspx
[ОБНОВЛЕНИЕ]
- RenderCapability.IsPixelShaderVersionSupported - получает значение, указывающее, поддерживается ли указанная версия пиксельного шейдера.
- RenderCapability.IsShaderEffectSoftwareRenderingSupported - получает значение, указывающее, может ли система отображать растровые эффекты в программном обеспечении.
- RenderCapability.Tier - получает значение, указывающее уровень рендеринга для текущего потока.
- RenderCapability.TierChanged - Происходит, когда уровень рендеринга изменился для объекта Dispatcher текущего потока.
RenderCapability.Tier >> 16
- Уровень рендеринга 0 - Нет графического аппаратного ускорения. Уровень версии DirectX меньше версии 7.0.
- Уровень рендеринга 1 - Частичное аппаратное ускорение графики. Уровень версии DirectX больше или равен версии 7.0 и меньше, чем версия 9.0.
- Уровень рендеринга 2 - Большинство графических функций используют аппаратное ускорение графики. Уровень версии DirectX больше или равен версии 9.0.
.NET 4.0 предоставляет возможность форсировать рендеринг программного обеспечения в коде:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
if (WeThinkWeShouldRenderInSoftware())
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
}
}
Смотрите этот пост для получения дополнительной информации.
Может быть, следующее может помочь со второй частью вашего вопроса, то есть, можете ли вы форсировать один конвейер рендеринга поверх другого:
Вы можете изменить параметр реестра, чтобы отключить аппаратное ускорение и заставить рендеринг программного обеспечения происходить постоянно. Мы часто используем это, чтобы увидеть, связана ли конкретная проблема... с драйверами видео. В качестве примера того, о чем я говорю, смотрите этот пост на форуме WPF.
Здесь следует отметить одну очевидную вещь... это то, что это влияет на все приложения WPF и действительно должно использоваться только для целей тестирования.
Чтобы отключить аппаратное ускорение:
[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000001
Чтобы включить аппаратное ускорение:
[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000000
Проверьте эту ссылку MSDN для получения дополнительной информации.
Основываясь на ссылках RenderingTier, вот код:
logger.InfoFormat("WPF Tier = {0}",RenderCapability.Tier / 0x10000);
RenderCapability.TierChanged +=
(sender, args) => logger.InfoFormat("WPF Tier Changed to {0}",
RenderCapability.Tier / 0x10000);
Я все еще тестирую и работаю над этим. Смотрите будущие правки / ответы на то, что я нахожу.
Или используйте инструменты профилирования...
Новый флажок был добавлен для подкрашивания целевых элементов приложения, которые используют устаревшие растровые эффекты, визуализированные SW.
Я согласен со вторым ответом, но он просто говорит о способности машины работать с использованием рендеринга hw, а не в том случае, если приложение действительно рендерится hw.
Я сделал простое приложение, используя холст, и просто вращая прямоугольник с помощью RotateTransform, можно использовать много ресурсов процессора для приложения, визуализированного как hw. Это и значение RenderCapability. Tier равно 2, так что для этого достаточно hw.
Почему тогда нет?
Чтобы ответить на вторую половину вашего вопроса, я не считаю, что на самом деле можно заставить один путь над другим. Аппаратный рендеринг автоматически используется, если доступен, в противном случае, программное обеспечение.
Если вам нужно протестировать его в режиме программного обеспечения, вам нужно будет использовать компьютер с низкой спецификацией или использовать удаленный рабочий стол для просмотра приложения, запущенного на другом компьютере. Однако, помимо снижения производительности / частоты кадров, между ними не должно быть никаких видимых различий. Используйте класс RenderCapability, чтобы узнать, следует ли отключать такие вещи, как анимация или эффекты, в пользу производительности.