【问题标题】:DirectX 11 GetDisplayModeList() fails in Remote Desktop ConnectionDirectX 11 GetDisplayModeList() 在远程桌面连接中失败
【发布时间】:2023-03-08 05:21:02
【问题描述】:

下午好,

我有一个可在主机 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

有人知道这个问题的解决方法吗?

【问题讨论】:

标签: c++ windows directx directx-11 direct3d


【解决方案1】:

远程桌面涉及一些极端情况,请记住它有时会使用“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,了解仅将桌面的“本机分辨率”用于窗口化和“假全屏”的方法。它也适用于远程桌面。

远程桌面的另一个“极端情况”是鼠标的“原始输入”。从DirectX Tool KitMouse的实现。

【讨论】:

    【解决方案2】:

    从技术上讲,这不是一个解决方案,但问题在于刷新率初始化,使用 try{}-catch{} 块绕过它允许我通过远程桌面以默认刷新率运行。其他一切都初始化没有问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 2010-11-01
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多