使用d3d的交換鏈可以方便的實現多渲染窗口結構,類的層次結構如下圖所示:
D3DRes用來定義dx設備丟失的處理,所有需要關心設備丟失的資源都從此類繼承,然後重寫設備丟失回調函數和設備重置回調函數即可方便的處理設備丟失。
RenderTarget用來定義基本的渲染目標,成員包括長寬及大小的定義,及渲染目標的虛接口定義(比如:緩衝區切換等)。
Win32Window封裝win32接口,傳入配置參數創建並註冊windows窗口,並定義消息處理回調,利用監聽器或者事件機制向外部應用層傳遞鼠標鍵盤操作。
RenderWindow從D3DRes及RenderTarget繼承,並聚合Win32Window對象,表示一個可渲染的窗口。在RenderWindow創建的時候,根據外部傳入的D3D對象(IDirect3D9)創建D3D Device;有了D3D Device,對於主窗口可通過接口函數GetSwapChain獲取Device的SwapChain對象,代碼如下:
IDirect3DSwapChain9* pSwapChain = 0; if( d3d_device) { d3d_device->GetSwapChain(0, &pSwapChain); }
對於非主窗口,則需要利用Device的接口CreateAdditionalSwapChain來創建更多的交換鏈對象,此接口需要硬件支持,因此創建之前需要檢查硬件設備能力。 準備好RenderWindow的交換鏈對象後,在渲染幀即可調用Present接口驅動硬件渲染:
void RenderWindow::SwapBuffers() { LPDIRECT3DDEVICE9 d3d_device = Graphics::Inst()->GetD3DDevice(); if(d3d_device) { if (D3DERR_DEVICELOST == mSwapChain->Present(NULL, NULL, mhWnd, NULL, 0)) { this->ResetDevice(); } } }
———-分割線—————
應用層通過創建並管理一個RenderWindow的數組,並在渲染主循環中依次切換渲染,即可實現多渲染窗口結構。