Share via


管理裝置資源

更新:2007 年 11 月

在 Managed Mobile Direct3D 程式設計中有兩種基本的資源類型:需要在裝置重設時重新建立的資源,以及不需要重新建立的資源。在裝置重設時,各種物件型別可能會填入資料,也可能不會填入資料。不同於桌上型電腦應用程式中的 Direct3D,對於建立資源時所使用的記憶體集區,在裝置重設時是否必須重新建立資源並沒有任何影響。

記憶體共用

Managed Mobile Direct3D 程式設計中有三種記憶體集區可用:

  • 系統

    配置於行動裝置的一般系統記憶體中,使用速度通常比視訊記憶體慢。

  • 視訊

    配置的記憶體區主要是由行動裝置的視訊硬體使用。在某些裝置上,視訊記憶體這種資源會受到許多限制。

  • Managed 記憶體

    將視訊記憶體配置為系統記憶體快取區 (Cache)。驅動程式可使用數種演算法,包括 LRU (最近最少使用) 取代演算法,來實作快取配置。

    在 Managed 集區中建立紋理或其他資源時,便會在系統記憶體集區中為紋理配置空間。以 SetTexture 方法將紋理指定至紋理階段時,紋理便會上載至視訊記憶體集區,直到成為最少使用的項目之前都會留在該處,然後才會收回以提供空間給其他資源。當需要在視訊記憶體中提供空間以上載 Managed 介面且沒有符合 LRU 定義的項目時,驅動程式應該使用 Priority 屬性來判斷要從視訊記憶體收回哪個 Managed 記憶體資源。

    您可以在 Managed 集區中建立 VertexBufferIndexBufferTexture 資源,但不能建立前後緩衝區、深度緩衝區和影像介面。

在建立資源時,您可以使用 SurfaceCaps 結構的執行個體來判斷可以存取的記憶體集區。

行動裝置可以針對不同的資源類型支援不同的記憶體集區。顯示驅動程式會以 SurfaceCapsSupportsManagedPool 屬性,指出自身對於 Managed 資源集區的支援。如果這個屬性是 true,該裝置便支援 VertexBufferIndexBufferTexture 資源的 Managed 集區。如果驅動程式不支援 Managed 集區,應用程式就無法從 Managed 集區建立介面。如果裝置同時針對紋理支援系統和視訊記憶體集區,應用程式就可以藉由使用 UpdateTexture 方法實作本身的記憶體快取配置。

應用程式也能使用 ResourcePreLoad 方法,將介面強制預先載入 (Preload) 到視訊記憶體中。這種方法會導致捨棄必要位元組,以及立即載入介面。

最後,應用程式也可以用 DeviceResourceManagerDiscardBytes 方法,強制 Managed 資源捨棄指定的位元組數。這種方法採用要捨棄的位元組數做為引數。如果應用程式傳遞 0,便會捨棄視訊記憶體中的所有 Managed 位元組。

控制資源管理員的所有方法都會立即運作;這些方法不會緩衝到命令緩衝區中。同時,如果裝置不支援 Managed 集區,這些方法都會失敗。

物件執行個體和存留期

當管理的裝置重設並使用索引緩衝區或頂點緩衝區時,您必須使用適當的建構函式,才會以適當的存留期來建立物件。

Windows Mobile Direct3D 只會在 Smartphone 或 Pocket PC 上同時支援一個 Device 執行個體。您可以使用 ManagerReleaseD3DMobile 靜態方法,來移除所有的 Direct3D 裝置資源,如此即可在相同的 Pocket PC 或 Smartphone 之上,啟動另一個 Windows Mobile Direct3D 應用程式。

下列物件必須在 Device 重設時重新建立。重新建立的作業可以在 DeviceReset 事件的事件處理常式中執行。

下列物件不需要在 Device 重設時重新建立:

FontSprite 物件會回應裝置重設而自動執行所有必要的動作。

IndexBufferVertexBuffer 物件會在裝置重設時自動重新建立自己,不過在其內部不會具有資料。您可以為 IndexBuffer.Created 事件或 VertexBuffer.Created 事件定義事件處理常式,在裝置重設後用資料填滿索引或頂點緩衝區。

請參閱

其他資源

.NET Compact Framework 中的 Mobile Direct3D 程式設計