在Win10/Server2016上通过RDP强制WPF应用程序的硬件加速

在Win10/Server2016上通过RDP强制WPF应用程序的硬件加速,wpf,windows-10,remote-desktop,rdp,hardware-acceleration,Wpf,Windows 10,Remote Desktop,Rdp,Hardware Acceleration,我们有一个WPF应用程序,我们的一些远程用户可以使用它。该应用程序不是非常图形密集型的,但我们看到在应用程序进行渲染时,RDP存在很多滞后/无响应 我们可以通过RDP复制该问题,但在本地运行时不能。因此,我们认为有两种方法: 部分问题是在某些UI事件之后必须呈现的数据量(将有一些代码优化,希望在某种程度上解决这个问题) 在RDP上运行时,WPF应用程序使用的是完整的软件渲染,而不是GPU加速 Win10和WPF over RDP有没有办法强制硬件加速和GPU渲染? 下面是我们尝试过的一些系统

我们有一个WPF应用程序,我们的一些远程用户可以使用它。该应用程序不是非常图形密集型的,但我们看到在应用程序进行渲染时,RDP存在很多滞后/无响应

我们可以通过RDP复制该问题,但在本地运行时不能。因此,我们认为有两种方法:

  • 部分问题是在某些UI事件之后必须呈现的数据量(将有一些代码优化,希望在某种程度上解决这个问题)
  • 在RDP上运行时,WPF应用程序使用的是完整的软件渲染,而不是GPU加速
Win10和WPF over RDP有没有办法强制硬件加速和GPU渲染?

下面是我们尝试过的一些系统规格和观察结果。我们现在的假设是,使用RDP和Win10是不可能的,但我希望被证明是错误的

首先,我们验证WPF应用程序如何使用.NETs
RenderCapability.Tier
enum的方法

0:应用程序没有可用的图形硬件加速 在设备上。所有图形功能都使用软件加速。这个 DirectX版本级别低于9.0版

1:WPF的大多数图形功能都将使用硬件加速 如果必要的系统资源可用且尚未启用 筋疲力尽的。这对应于大于的DirectX版本 或等于9.0

2:WPF的大多数图形功能将使用硬件加速 前提是必要的系统资源尚未用尽。这 对应于大于或等于9.0的DirectX版本

我们尝试了以下注册表和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,我们的应用程序始终处于完整的软件渲染状态,但如果在本地运行,则使用相同的配置,它使用Tier 2图形加速

RDP运行的示例:

本地运行的示例:

获取上述信息的Shell代码:

 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)

相关:@WaiHaLee-谢谢你的链接。我想我们确实尝试过:基于GPO中“为所有远程桌面服务会话使用硬件图形适配器”的假设,与bEnumerateHWBeforeSW注册表项相同。我会试着用钥匙来确认。从外观上看,它们是等价的。是的,结果是一样的。WPF层仍显示为0。设备上的应用程序没有可用的图形硬件加速。您找到了一种方法吗?相关:@WaiHaLee-感谢链接。我想我们确实尝试过:基于GPO中“为所有远程桌面服务会话使用硬件图形适配器”的假设,与bEnumerateHWBeforeSW注册表项相同。我会试着用钥匙来确认。从外观上看,它们是等价的。是的,结果是一样的。WPF层仍显示为0。设备上的应用程序没有可用的图形硬件加速。您是否找到了一种方法?