在Win10/Server2016上通过RDP强制WPF应用程序的硬件加速
我们有一个WPF应用程序,我们的一些远程用户可以使用它。该应用程序不是非常图形密集型的,但我们看到在应用程序进行渲染时,RDP存在很多滞后/无响应 我们可以通过RDP复制该问题,但在本地运行时不能。因此,我们认为有两种方法:在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渲染? 下面是我们尝试过的一些系统
- 部分问题是在某些UI事件之后必须呈现的数据量(将有一些代码优化,希望在某种程度上解决这个问题)
- 在RDP上运行时,WPF应用程序使用的是完整的软件渲染,而不是GPU加速
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。设备上的应用程序没有可用的图形硬件加速。您是否找到了一种方法?