Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Проверьте 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.

Ответ 2

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

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

Подробнее см. этот пост.

Ответ 3

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

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

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

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

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

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

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

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

Ответ 4

На основе ссылок RenderingTier, вот какой-то код:

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

Я все еще тестирую и работаю над этим. Смотрите будущие изменения/ответы для того, что я нахожу.

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Я сделал простое приложение с использованием холста и просто вращал прямоугольник, и RotateTransform использует способ для большого количества процессора для hw-рендеринга. Это и значение "RenderCapability.Tier" равно 2, поэтому для этого достаточно hw.

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