Как определить, использует ли WPF аппаратный или программный рендеринг? - PullRequest
31 голосов
/ 29 сентября 2008

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

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

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

Ответы [ 7 ]

34 голосов
/ 29 сентября 2008

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

[ UPDATE ]

  • 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.
11 голосов
/ 19 мая 2010

.NET 4.0 предоставляет возможность форсировать рендеринг программного обеспечения в коде:

public partial class App : Application 
{    
    protected override void OnStartup(StartupEventArgs e)    
    {         
        if (WeThinkWeShouldRenderInSoftware())            
            RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;    
    }
}

См. этот пост для получения дополнительной информации.

6 голосов
/ 01 октября 2008

Может быть, со второй частью вашего вопроса может помочь следующее, то есть, вы можете форсировать один конвейер рендеринга поверх другого:

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

Здесь следует отметить одну очевидную вещь ... это то, что это влияет на все приложения WPF и действительно должно использоваться только для целей тестирования.

Чтобы отключить аппаратное ускорение:

[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000001

Чтобы включить аппаратное ускорение:

[HKEY_CURRENT_USER\Software\Microsoft\Avalon.Graphics]
"DisableHWAcceleration"=dword:00000000

Проверьте эту ссылку MSDN для получения дополнительной информации.

6 голосов
/ 29 сентября 2008

На основе ссылок RenderingTier приведен код:

        logger.InfoFormat("WPF Tier = {0}",RenderCapability.Tier / 0x10000);
        RenderCapability.TierChanged +=
            (sender, args) => logger.InfoFormat("WPF Tier Changed to {0}",
                                                RenderCapability.Tier / 0x10000);

Я все еще тестирую и работаю над этим. Смотрите будущие правки / ответы на то, что я найду.

4 голосов
/ 29 сентября 2008

Или используйте Инструменты профилирования ...

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

1 голос
/ 17 июля 2009

Я согласен со вторым ответом, но он просто говорит о способности машины работать с использованием рендеринга hw, а не в том случае, если приложение действительно рендерится hw.

Я сделал простое приложение, используя холст, и просто вращая прямоугольник с помощью RotateTransform, можно использовать много ресурсов ЦП для приложения, визуализированного как hw. Это и значение 'RenderCapability.Tier' равно 2, так что для этого достаточно hw.

Почему тогда нет?

1 голос
/ 01 октября 2008

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

Если вам нужно протестировать его в режиме программного обеспечения, вам нужно будет использовать компьютер с низкой спецификацией или использовать удаленный рабочий стол для просмотра приложения, запущенного на другом компьютере. Однако, помимо снижения производительности / частоты кадров, между ними не должно быть никаких видимых различий. Используйте класс RenderCapability, чтобы узнать, следует ли отключать такие вещи, как анимация или эффекты, в целях повышения производительности.

...