管理裝置資源
更新:2007 年 11 月
在 Managed Mobile Direct3D 程式設計中有兩種基本的資源類型:需要在裝置重設時重新建立的資源,以及不需要重新建立的資源。在裝置重設時,各種物件型別可能會填入資料,也可能不會填入資料。不同於桌上型電腦應用程式中的 Direct3D,對於建立資源時所使用的記憶體集區,在裝置重設時是否必須重新建立資源並沒有任何影響。
記憶體共用
Managed Mobile Direct3D 程式設計中有三種記憶體集區可用:
系統
配置於行動裝置的一般系統記憶體中,使用速度通常比視訊記憶體慢。
視訊
配置的記憶體區主要是由行動裝置的視訊硬體使用。在某些裝置上,視訊記憶體這種資源會受到許多限制。
Managed 記憶體
將視訊記憶體配置為系統記憶體快取區 (Cache)。驅動程式可使用數種演算法,包括 LRU (最近最少使用) 取代演算法,來實作快取配置。
在 Managed 集區中建立紋理或其他資源時,便會在系統記憶體集區中為紋理配置空間。以 SetTexture 方法將紋理指定至紋理階段時,紋理便會上載至視訊記憶體集區,直到成為最少使用的項目之前都會留在該處,然後才會收回以提供空間給其他資源。當需要在視訊記憶體中提供空間以上載 Managed 介面且沒有符合 LRU 定義的項目時,驅動程式應該使用 Priority 屬性來判斷要從視訊記憶體收回哪個 Managed 記憶體資源。
您可以在 Managed 集區中建立 VertexBuffer、IndexBuffer 和 Texture 資源,但不能建立前後緩衝區、深度緩衝區和影像介面。
在建立資源時,您可以使用 SurfaceCaps 結構的執行個體來判斷可以存取的記憶體集區。
行動裝置可以針對不同的資源類型支援不同的記憶體集區。顯示驅動程式會以 SurfaceCaps 的 SupportsManagedPool 屬性,指出自身對於 Managed 資源集區的支援。如果這個屬性是 true,該裝置便支援 VertexBuffer、IndexBuffer 和 Texture 資源的 Managed 集區。如果驅動程式不支援 Managed 集區,應用程式就無法從 Managed 集區建立介面。如果裝置同時針對紋理支援系統和視訊記憶體集區,應用程式就可以藉由使用 UpdateTexture 方法實作本身的記憶體快取配置。
應用程式也能使用 Resource 的 PreLoad 方法,將介面強制預先載入 (Preload) 到視訊記憶體中。這種方法會導致捨棄必要位元組,以及立即載入介面。
最後,應用程式也可以用 Device 的 ResourceManagerDiscardBytes 方法,強制 Managed 資源捨棄指定的位元組數。這種方法採用要捨棄的位元組數做為引數。如果應用程式傳遞 0,便會捨棄視訊記憶體中的所有 Managed 位元組。
控制資源管理員的所有方法都會立即運作;這些方法不會緩衝到命令緩衝區中。同時,如果裝置不支援 Managed 集區,這些方法都會失敗。
物件執行個體和存留期
當管理的裝置重設並使用索引緩衝區或頂點緩衝區時,您必須使用適當的建構函式,才會以適當的存留期來建立物件。
Windows Mobile Direct3D 只會在 Smartphone 或 Pocket PC 上同時支援一個 Device 執行個體。您可以使用 Manager 的 ReleaseD3DMobile 靜態方法,來移除所有的 Direct3D 裝置資源,如此即可在相同的 Pocket PC 或 Smartphone 之上,啟動另一個 Windows Mobile Direct3D 應用程式。
下列物件必須在 Device 重設時重新建立。重新建立的作業可以在 DeviceReset 事件的事件處理常式中執行。
Texture 物件
Mesh 物件
Surface 物件
以 VertexBuffer(Device, Int32, Usage, VertexFormats, Pool) 建構函式建立的 VertexBuffer 物件
以 IndexBuffer(Device, Int32, Usage, Pool, Boolean) 建構函式建立的 IndexBuffer 物件
下列物件不需要在 Device 重設時重新建立:
Font 物件
Sprite 物件
以 VertexBuffer(Type, Int32, Device, Usage, VertexFormats, Pool) 建構函式建立的 VertexBuffer 物件
以 IndexBuffer(Type, Int32, Device, Usage, Pool) 建構函式建立的 IndexBuffer 物件
Font 和 Sprite 物件會回應裝置重設而自動執行所有必要的動作。
IndexBuffer 和 VertexBuffer 物件會在裝置重設時自動重新建立自己,不過在其內部不會具有資料。您可以為 IndexBuffer.Created 事件或 VertexBuffer.Created 事件定義事件處理常式,在裝置重設後用資料填滿索引或頂點緩衝區。