gpt4 book ai didi

c++ - ComPtr.As() 是做什么的?

转载 作者:行者123 更新时间:2023-11-28 05:51:16 26 4
gpt4 key购买 nike

我正在努力从一些示例中学习 DirectX 12,但我无法理解 ComPtr.As() 方法的作用。

ComPtr<ID3D12Device> device;
ComPtr<ID3D12Device> device2;

// Do Stuff with Device
device.As(&device2); // What does this do?

最佳答案

您在哪里找到这个示例代码?看起来很腥。这是对 As 的无意义使用。如果将它扩展到底层 QueryInterface,这同样很愚蠢:

hr = device->QueryInterface( IID_PPV_ARGS(device2) );

事实上,你的代码最好写成:

device2 = device;

通常,您会使用 As 从现有接口(interface)获取新接口(interface)。例如,对于 Direct3D 11,您将设备创建为 Direct3D 11.0 接口(interface),然后必须 QueryInterface 11.1、11.2、11.3 和/或 11.4 版本才能使用它们:

ComPtr<ID3D11Device> device;
DX::ThrowIfFailed(D3D11CreateDevice(..., device.ReleaseAndGetAddressOf());

ComPtr<ID3D11Device2> device2;
hr = device.As(&device2);
if (FAILED(hr))
// Do whatever handling you do if the system doesn't support 11.2

Direct3D 11 的另一个常见用途是处理可能不存在的调试接口(interface):

#ifndef NDEBUG
ComPtr<ID3D11Debug> d3dDebug;
if (SUCCEEDED(device.As(&d3dDebug)))
{
ComPtr<ID3D11InfoQueue> d3dInfoQueue;
if (SUCCEEDED(d3dDebug.As(&d3dInfoQueue)))
{
#ifdef _DEBUG
d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, true);
d3dInfoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, true);
#endif
D3D11_MESSAGE_ID hide [] =
{
D3D11_MESSAGE_ID_SETPRIVATEDATA_CHANGINGPARAMS,
// TODO: Add more message IDs here as needed.
};
D3D11_INFO_QUEUE_FILTER filter = {};
filter.DenyList.NumIDs = _countof(hide);
filter.DenyList.pIDList = hide;
d3dInfoQueue->AddStorageFilterEntries(&filter);
}
}
#endif

同样重要的是不要忽略从 As 返回的 HRESULT 返回值。您应该使用 SUCCEEDEDFAILED 宏,或者像 ThrowIfFailed 这样的快速失败。 .

参见 ComPtr .

关于c++ - ComPtr.As() 是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35214778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com