下午好,
我有一个可以在主机PC上运行的准系统Direct3D应用,但在通过远程桌面运行时无法初始化DirectX。
我追溯到此调用失败,并以
失败 result = adapterOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &numModes, NULL);
if(FAILED(result))
{
return false;
}
它失败并显示:
result = 0x887a0022 : A resource is not available at the time of the call, but may become available later.
完整的初始化代码来自Rastertek教程,可在此处找到: http://www.rastertek.com/dx11tut03.html
有人知道解决此问题的方法吗?
答案 0 :(得分:0)
从技术上讲不是解决方案,但是问题在于刷新率初始化,使用try {}-catch {}块绕过了它,这使我可以通过远程桌面以默认刷新率运行。其他所有初始化都没有问题
答案 1 :(得分:0)
远程桌面涉及一些极端情况,请记住,有时它使用的是“ Microsoft Basic Renderer”(又称软件WARP驱动程序)。参见this blog post。
您还可以通过首先检测到GetDisplayModeList
来保护您在远程情况下的使用。例如,legacy DXUT sample framework是在其枚举代码中完成的:
// mode for the current screen resolution for the remote session.
if( 0 != GetSystemMetrics( SM_REMOTESESSION) )
{
DEVMODE DevMode;
DevMode.dmSize = sizeof( DEVMODE );
if( EnumDisplaySettings( nullptr, ENUM_CURRENT_SETTINGS, &DevMode ) )
{
NumModes = 1;
pDesc[0].Width = DevMode.dmPelsWidth;
pDesc[0].Height = DevMode.dmPelsHeight;
pDesc[0].Format = DXGI_FORMAT_R8G8B8A8_UNORM;
pDesc[0].RefreshRate.Numerator = 0;
pDesc[0].RefreshRate.Denominator = 0;
pDesc[0].ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE;
pDesc[0].Scaling = DXGI_MODE_SCALING_CENTERED;
}
}
您也不能在远程桌面上使用“全屏独占”模式:
if( GetSystemMetrics(SM_REMOTESESSION) != 0 )
{
sd.Windowed = TRUE;
}
您根本不需要使用
GetDisplayModeList
。只需选择一个合理的起始大小或“最大化”启动窗口即可。请参阅directx-vs-templates,以获取仅使用窗口的“本机分辨率”作为窗口和“假全屏”的方法。对于远程桌面也都很好。
另一个带有远程桌面的“角落情况”是鼠标的“原始输入”。请参见Mouse中DirectX Tool Kit的实现。