組件對象模型(Component Object Model,COM)是一種令DirectX不受編程語言束縛拴疤,并且使之向后兼容的技術簸州。我們通常將COM對象視為一種接口鹏秋,但考慮當前編程的目的究履,遂將它當做一個C++類來使用。用C++語言編寫DirectX時驹饺,COM幫我們隱藏大量的細節(jié)钳枕。我們只需知道:要獲取指向某COM接口的指針,需借助特定函數或另一個COM接口的方法--而不是用C++語言中的關鍵字new去創(chuàng)建一個COM接口赏壹。另外鱼炒,COM對象會統計其引用次數;因此蝌借,在使用完某接口時昔瞧,我們便應調用它的Release方法(COM接口的所有功能提供是從IUnknow這個COM接口繼承而來俐巴,包括Release方法在內),而不是用delete來刪除---當COM對象的引用計數為0時硬爆,它將自行釋放做自己所占用的內存。
為了輔助用戶管理COM對象的生命周期擎鸠,Windows運行時庫(Windows Runtime Library, WRL)專門為此提供了Microsoft::WRL::ComPtr類(#include<wrl.h>),我們可以幫它當作是COM對象的智能指針缀磕。當一個ComPtr實例超出作用域范圍時,它便會自動調用COM對象的Release方法劣光,繼而省掉了我們手動調用的麻煩袜蚕。常用的3個ComPtr方法如下:
1.Get:返回一個指向此底層COM接口的指針。此方法常用于把原始的COM接口指針作為參數傳給函數绢涡。例如:
#include <wrl.h>
ComPtr<ID3D12RootSignature>mRootSignature;
...
//SetGraphicsRootSignature需要獲取ID3D12RootSignature*類型參數
mCommandList->SetGraphicsRootSignature(mRootSignature.Get());
2.GetAddressof:返回指向此底層COM接口指針地址牲剃。憑此方法即可利用函數返回COM接口指針。例如:
#include <wrl.h>
ComPtr<ID3D12RootSignature>mDirectCmdListAlloc;
...
ThrowIfFailed(md3dDevice->CreateCommandAllocator(
D3D12_COMMAND_LIST_TYPE_DIRECT,
mDirectCmdListAlloc.GetAddressof()));
3.Reset:將此ComPtr實例設置為nullptr釋放與之相關的所有引用(同時減少其底層COM接口的引用計數)雄可。此方法的功能與將ComPtr目標實例賦值為nullptr的效果相同凿傅。
當然,與COM有關的知識不止于此数苫,但是對有效地使用DirectX來說足矣聪舒。
注意:
COM的接口都以“I”作為開頭。例如虐急,表示命令列表的COM接口為ID3D12GraphicsCommandList箱残。