Как вы определяете, использует ли WPF аппаратное или программное обеспечение?
Я сравниваю приложение WPF на разных платформах, и мне нужен простой способ определить, использует ли WPF аппаратное или программное обеспечение.
Кажется, я вспомнил звонок, чтобы определить это, но не могу сейчас на него надавить.
Кроме того, существует простой, основанный на кодах способ заставить один конвейер рендеринга над другим?
Ответы
Ответ 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.
Почему тогда нет?