Visual studio 处理DisplayInformation::DisplayContentsInvalidated在D3D12中

Visual studio 处理DisplayInformation::DisplayContentsInvalidated在D3D12中,visual-studio,uwp,direct3d,Visual Studio,Uwp,Direct3d,在C++/CX D3D12的VS2019项目模板中,订阅了DisplayInformation::DisplayContentsInvalidated事件(已记录),当该事件触发时,项目模板中的代码尝试验证D3D12设备。用于验证的标准是默认适配器是否已更改: //在DisplayContentsInvalidated事件的事件处理程序中调用此方法。 void DX::DeviceResources::ValidateDevice() { //如果默认适配器在安装D3D设备后发生更改,则D3D设

在C++/CX D3D12的VS2019项目模板中,订阅了
DisplayInformation::DisplayContentsInvalidated
事件(已记录),当该事件触发时,项目模板中的代码尝试验证D3D12设备。用于验证的标准是默认适配器是否已更改:

//在DisplayContentsInvalidated事件的事件处理程序中调用此方法。
void DX::DeviceResources::ValidateDevice()
{
//如果默认适配器在安装D3D设备后发生更改,则D3D设备不再有效
//已创建或设备已删除。
//首先,从设备创建时获取默认适配器的LUID。
DXGI_适配器_DESC previousDesc;
{
ComPtr-previousDefaultAdapter;
DX::ThrowIfFailed(m_dxgiFactory->EnumAdapters1(0,&previousDefaultAdapter));
DX::ThrowIfFailed(previousDefaultAdapter->GetDesc(&previousDesc));
}
//接下来,获取当前默认适配器的信息。
DXGI_适配器_DESC currentDesc;
{
康普特工厂;
DX::ThrowIfFailed(CreateDXGIFactory1(IID_PPV_ARGS(¤tDxgiFactory));
ComPtr-currentdaultadapter;
DX::ThrowIfFailed(currentDxgiFactory->EnumAdapters1(0,¤tDefaultAdapter));
DX::ThrowIfFailed(currentDefaultAdapter->GetDesc(¤tDesc));
}
//如果适配器LUID不匹配,或者设备报告它已被删除,
//必须创建新的D3D设备。
如果(previousDesc.AdapterUID.LowPart!=currentDesc.AdapterUID.LowPart||
previousDesc.AdapterUID.HighPart!=当前desc.AdapterUID.HighPart||
失败(m_d3dDevice->GetDeviceRemovedReason())
{
m_DeviceMoved=真;
}
}
但是,在我看来,默认适配器可能不是所选的适配器,正如您在本代码中看到的,因为它确保适配器可以在选择之前创建D3D12设备,并且上述验证代码中不存在相同的检查:

//此方法获取第一个支持Direct3D 12的可用硬件适配器。
//如果找不到这样的适配器,*ppAdapter将设置为nullptr。
void DX::DeviceResources::GetHardwareAdapter(IDXGIAdapter1**ppAdapter)
{
ComPtr适配器;
*pAdapter=nullptr;
对于(UINT adapterIndex=0;未找到DXGI错误)=m\U dxgiFactory->EnumAdapters1(adapterIndex,&adapter);adapterIndex++)
{
DXGI_适配器_DESC1 desc;
适配器->获取描述1(&desc);
if(描述标志和DXGI适配器标志软件)
{
//不要选择基本渲染驱动程序适配器。
继续;
}
//检查适配器是否支持Direct3D 12,但不创建
//实际设备还没有。
如果(成功(D3D12CreateDevice(adapter.Get(),D3D_功能_LEVEL_11_0,_uuidof(ID3D12Device),nullptr)))
{
打破
}
}
*pAdapter=adapter.Detach();
}
这是无意中依赖于默认适配器作为所选适配器,还是基于默认适配器已更改,我们可以做出更广泛的假设

如果
DisplayInformation::DisplayContentsInvalidated
,真正的含义是什么?这告诉我什么?为什么这表明该设备可能无效?在什么情况下会触发此事件,并且设备会或不会无效

由于我们也在这里检查
设备移动原因
,是否存在默认适配器未更改但设备因
显示信息::显示内容验证
而被删除的情况


我们真的需要处理这些吗?如果我完全忽略此事件并继续尝试渲染,会发生什么?我是否会处理此事件触发在记录的“设备丢失场景”中指出的任何问题?

我们仍在调查您的问题并获取一些信息

关于何时触发DisplayContentInvalidated事件,它通常在各种活动时调用,包括更改主显示或显示配置以任何其他方式更改。这还包括图形是否出现某些类型的问题,此事件应能够用于处理此类情况

关于模板,我们在我们的终端上运行了一些测试,我们确实看到项目使用了它发现的第一个可以处理DirectX12的适配器,而不是选择的适配器。在进一步的测试中,我们删除了那个特定的检查,并发现应用程序确实继续按预期运行。适配器可能不是用于在应用程序启动时创建设备的适配器。因此,事实上,这项检查似乎确实可以被忽略。但是,在代码中包含此事件可能不会有什么坏处,因为它可以提供任何情况下都需要的额外功能


任何其他详细信息可能会在我们的文档中找到。但是,该模板似乎是为了演示DirextX12及其各种API的某些功能,因此忽略DisplayContentInvalidated事件通常不会导致任何问题。

我们仍在调查您的问题并获取一些信息

关于何时触发DisplayContentInvalidated事件,它通常在各种活动时调用,包括更改主显示或显示配置以任何其他方式更改。这还包括图形是否出现某些类型的问题,此事件应能够用于处理此类情况

关于模板,我们在我们的终端上运行了一些测试,我们确实看到项目使用了