0

我正在尝试将 DirectX11/XAML UWP 模板移植到 C++-WinRT 版本......其中一切都通过 C++-WinRT 完成,我可以关闭 CX。

我目前被困在如何ResizeBuffers使用交换链。我不断收到错误消息,提示我尚未释放所有缓冲区引用。如果我注释掉与调整缓冲区大小有关的任何内容并且只是硬编码某个大小,则该应用程序可以正常工作。所以......我可能做错了什么。

我相信这与新的winrt::com_ptr. ResetWRL ComPtr 上没有类似的方法。我已将它们设置为nullptr就像在原始 C++/CX 模板中一样,但这似乎还不够。

我必须做的其他事情可能会影响正在发生的事情:

  1. DeviceResources 类现在是一个 C++/WinRT 类,我默认使用 nullptr_t 参数在所有其他类(SampleScene3DRenderer、DirectXPage 和 Main)中创建它。这样,我可以在 DirectXPage 中创建它,传入 swapChainPanel 引用,然后将这个 DeviceResources 实例传递给我创建的所有其他类。

  2. 在 DirectX 初始化中有一个地方你必须传入一个**IUnknown. C++/WinRT 的文档提到使用调用函数winrt::get_unknown来返回*IUnknown. 我无法让它适用于以下DWriteCreateFactory方法,所以我尝试了这种方式:

     DX::ThrowIfFailed(
        DWriteCreateFactory(
           DWRITE_FACTORY_TYPE_SHARED,
           __uuidof(IDWriteFactory3),
           reinterpret_cast<::IUnknown**>(m_dwriteFactory.put())
        )
    );
    

我不确定还能做什么。只有交换链调整大小不起作用。我在PC(不是Windows Phone)上这样做。

4

1 回答 1

5

DWriteCreateFactory调用使用winrt::com_ptr<T>和上面的成员put是正确的。使用nullptr赋值也是重置 a 的正确方法com_ptr<T>

com_ptr<IUnknown> ptr = ...

assert(ptr);
ptr = nullptr;
assert(!ptr);

如果您希望与 C++/WinRT 报告错误的方式保持一致,也可以使用winrt::check_hresult而不是。ThrowIfFailed这是一个完全使用 C++/WinRT 编写的简单 DirectX 示例:

https://github.com/kennykerr/cppwinrt/blob/master/Store/Direct2D/App.cpp

于 2018-06-11T15:08:58.737 回答