Принудительное аппаратное ускорение для приложения WPF через RDP на Win10 / Server2016 - PullRequest
0 голосов
/ 25 марта 2020

У нас есть приложение WPF, к которому некоторые из наших пользователей подключаются и используют. Приложение не очень интенсивно графически c, но мы наблюдаем большое отставание / отсутствие отклика по RDP, когда приложение выполняет рендеринг.

Мы можем повторить проблему по RDP, но не при локальном запуске. Исходя из этого, мы думаем, что есть два подхода:

  • Отчасти проблема заключается в объеме данных, которые должны быть отображены после определенных событий пользовательского интерфейса (будет некоторая оптимизация кода, чтобы, надеюсь, решить ее в некоторой степени). )
  • При работе через RDP приложение WPF использует полный программный рендеринг, а не ускорение графического процессора

Есть ли способ с помощью Win10 и WPF поверх RDP форсировать аппаратное ускорение и рендеринг GPU?

Ниже приведены некоторые технические характеристики системы и наблюдения из того, что мы попробовали. На данный момент мы предполагаем, что это невозможно с RDP и Win10, но я бы хотел оказаться ошибочным.

Во-первых, то, как мы проверяем, как приложение WPF использует .NETs RenderCapability.Tier enum.

0: графическое аппаратное ускорение для приложения на устройстве недоступно. Все графические функции используют программное ускорение. Уровень версии DirectX меньше версии 9.0.

1: большинство графических функций WPF будут использовать аппаратное ускорение, если необходимые системные ресурсы доступны и не исчерпаны. Это соответствует версии DirectX, которая больше или равна 9.0.

2: большинство графических функций WPF будут использовать аппаратное ускорение при условии, что необходимые системные ресурсы не были исчерпаны. Это соответствует версии DirectX, которая больше или равна 9.0.

Мы пробовали варианты следующих параметров реестра и параметров GPO

Registry Settings
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Avalon.Graphics\DisableHWAcceleration
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\Terminal Services\AVCHardwareEncodePreferred
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\Terminal Services\fEnableVirtualizedGraphics
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\Terminal Services\MaxCompressionLevel
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\Terminal Services\VisualExperiencePolicy
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\Terminal Services\VGOptimization_CaptureFrameRate
Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows NT\Terminal Services\VGOptimization_CompressionRatio

GPO
Windows Components/Remote Desktop Services/Remote Desktop Session Host/Remote Session Environment
Configure H.264/AVC hardware encoding for Remote Desktop Connections
Prioritize H.264/AVC 444 graphics mode for Remote Desktop Connections
Use hardware graphics adapters for all Remote Desktop Services sessions

Независимо от комбинации, мы обнаружили, что по протоколу RDP наше приложение всегда находится в режиме полной программной визуализации, но с той же конфигурацией, если мы запускаем локально, оно использует графическое ускорение уровня 2.

Пример запуска RDP:

enter image description here

Пример локального прогона:

enter image description here

Код оболочки для получения вышеуказанной информации:

 public MainWindow()
{
    InitializeComponent();

    int displayTier = (RenderCapability.Tier >> 16);
    bool shader1HardwareSupported = RenderCapability.IsPixelShaderVersionSupported(1, 0);
    bool shader2HardwareSupported = RenderCapability.IsPixelShaderVersionSupported(2, 0);
    bool shader1SoftwareSupported = RenderCapability.IsPixelShaderVersionSupportedInSoftware(1, 0);
    bool shader2SoftwareSupported = RenderCapability.IsPixelShaderVersionSupportedInSoftware(2, 0);

    StringBuilder sbMessage = new StringBuilder($"WPF Tier = {displayTier + Environment.NewLine}");
    sbMessage.Append($"Hardware PixelShader Version 1.0 Support: {shader1HardwareSupported + Environment.NewLine}");
    sbMessage.Append($"Hardware PixelShader Version 2.0 Support: {shader2HardwareSupported + Environment.NewLine}");
    sbMessage.Append($"Software PixelShader Version 1.0 Support: {shader1SoftwareSupported + Environment.NewLine}");
    sbMessage.Append($"Software PixelShader Version 2.0 Support: {shader2SoftwareSupported + Environment.NewLine}");

    ManagementClass c = new ManagementClass("Win32_VideoController");
    foreach (ManagementObject o in c.GetInstances())
    {
        sbMessage.Append($"GPU Name: {o["Name"] + Environment.NewLine}");
        sbMessage.Append($"AdapterRam: {o["AdapterRam"] + Environment.NewLine}");
        sbMessage.Append($"DeviceID: {o["DeviceID"] + Environment.NewLine}");
        sbMessage.Append($"AdapterDACType: {o["AdapterDACType"] + Environment.NewLine}");
        sbMessage.Append($"InstalledDisplayDrivers: {o["InstalledDisplayDrivers"] + Environment.NewLine}");
        sbMessage.Append($"DriverVersion: {o["DriverVersion"] + Environment.NewLine}");
        sbMessage.Append($"VideoProcessor: {o["VideoProcessor"] + Environment.NewLine}");
        sbMessage.Append($"VideoArchitecture: {o["VideoArchitecture"] + Environment.NewLine}");
        sbMessage.Append($"VideoMemoryType: {o["VideoMemoryType"] + Environment.NewLine}");
    }

    MessageBox.Show(sbMessage.ToString());
}

Некоторые настройки среды. Дайте мне знать, если вам нужно больше

Client OS: Windows 10
Remote OS: Windows 10
Remoting Software: RDP
.NET Target Framework: 4.5.2 (persists on 4.7.1 as well)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...