我正在尝试将DirectX11 / XAML UWP模板移植到C ++ - WinRT版本......其中一切都是通过C ++完成的 - WinRT我可以关闭CX。
我目前仍然坚持如何在交换链上ResizeBuffers
。我一直收到错误消息说我还没有释放所有的缓冲区引用。如果我注释掉任何与调整大小缓冲区有关的内容,只是在大小上进行硬编码,那么该应用程序可以运行。所以......我可能做错了什么。
我认为这与新的winrt::com_ptr
有关。 WRL ComPtr上没有Reset
方法。我将它们设置为nullptr
就像在原始的C ++ / CX模板中一样,但这似乎还不够。
我必须做的其他事情可能会对正在发生的事情产生影响:
DeviceResources类现在是一个C ++ / WinRT类,我默认使用nullptr_t参数在所有其他类(SampleScene3DRenderer,DirectXPage和& Main)中创建。这样,我可以在DirectXPage中创建它,传入swapChainPanel引用,然后将这个DeviceResources实例传递给我创建的所有其他类。
在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手机)。
答案 0 :(得分:3)
使用上述DWriteCreateFactory
和winrt::com_ptr<T>
成员的put
来电是正确的。使用nullptr
分配也是重置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