Как определить, использует ли WPF аппаратный или программный рендеринг?

Я тестирую приложение WPF на различных платформах, и мне нужен простой способ определить, использует ли WPF аппаратный или программный рендеринг.

Кажется, я вспоминаю звонок, чтобы определить это, но не могу сейчас на него положиться.

Кроме того, существует ли простой, основанный на коде способ навязывания одного конвейера рендеринга другому?

7 ответов

Решение

Проверьте RenderCapability.Tier

[ОБНОВЛЕНИЕ]

  • 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, чтобы узнать, следует ли отключать такие вещи, как анимация или эффекты, в пользу производительности.

Другие вопросы по тегам