更新~ 3008/2/19 (KB945149 SLI&CrossFire Hotfix Updata & KB940105 Hotfix)
遊戲開發中虛擬位址空間的使用方式 (KB940105)
如果您執行的 Windows Vista 電腦具有數張圖形卡,建議您先安裝「Microsoft 知識庫」文件 KB945149 所述的 Hotfix。 如需詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件 ( 單卡的不用安裝KB945149 Hotfix )
在現代的作業系統 (例如 Windows Vista) 上,應用程式會在其私用虛擬位址空間內執行。一般而言,如果是 32 位元的應用程式,虛擬位址空間的大小會固定在 2 GB。可用虛擬位址空間的大小和電腦有多少實體記憶體無關。
每個記憶體配置、檔案對應或應用程式所載入的程式庫,都會取用這個虛擬位址空間中的空間。當應用程式取用所有的虛擬位址空間時,任何其他的這類作業會失敗。雖然所有應用程式應該都是以程式碼編寫來處理記憶體配置失敗,但是許多應用程式並未正確地從這類失敗中復原。因此,程式從這類失敗復原之後,可能變得不穩定或停止回應。
現有的遊戲和其他圖形應用程式,通常會為應用程式所使用的視訊記憶體資源複本配置虛擬記憶體。如果視訊記憶體的內容遺失,應用程式就會使用這個複本快速地還原顯示畫面。例如,如果使用者按下 ALT+TAB 或讓電腦處於待命狀態,應用程式就會使用這個複本。一般而言,在應用程式建立 Managed 資源時,DirectX 執行階段會代替應用程式管理複本。然而,應用程式也可以自行管理複本。複本所使用的虛擬記憶體,與應用程式配置的視訊記憶體資源直接成正比。
現代的圖形處理單元 (GPU) 可以具有 512 MB 以上的視訊記憶體。嘗試運用這麼大量視訊記憶體的應用程式,可以將大部分的虛擬位址空間用於其視訊資源的記憶體中複本。在 32 位元系統上,這類應用程式可能耗用所有可用的虛擬位址空間。
有了 Windows Vista 中引入的 DirectX 10 和 Windows 顯示驅動程式模型 (WDDM),應用程式就再也不需要在系統記憶體中維護資源複本。相反地,視訊記憶體管理員會確定,顯示轉換之間會維護每個視訊記憶體配置的內容。基於相容性的理由,Windows Vista 會為比 DirectX 10 舊的 DirectX 版本模擬「裝置遺失」,以確定沒有任何應用程式可見的 API 行為有所變更。
為了虛擬化視訊記憶體,Windows Vista 中的視訊記憶體管理員會指派虛擬位址範圍給每個視訊記憶體資源。這個範圍在概念上類似於應用程式可能建立的複本。然而,視訊記憶體管理員管理處理程序的效率優於應用程式。視訊記憶體管理員使用虛擬位址範圍,以處理轉換或視訊記憶體的過多已認可頁數。然而,在擁有充足視訊記憶體的系統上,通常未使用此虛擬位址範圍。只要這個虛擬位址範圍保持未使用,就不會配置實體記憶體給這個虛擬位址範圍。相反地,一定會使用實體記憶體,以完整填入較舊驅動程式型號中維護的系統記憶體複本。
如果應用程式建立視訊資源的記憶體中複本,或者使用 DirectX 9 (含) 以前版本,虛擬位址空間就會包含 WDDM 視訊記憶體管理員的虛擬化範圍和應用程式的複本。使用比 DirectX 10 舊的圖形 API 並鎖定有大量視訊記憶體的 GPU 的應用程式,會輕易地耗用其虛擬位址空間。
為了解決這個問題,Microsoft 正著手變更視訊記憶體管理員維護視訊記憶體資源內容的方式。進行這項變更之後,每個虛擬化的配置就不需要使用永久的虛擬位址範圍。有了這個新方法,只有建立為 "lockable" 的配置才會取用應用程式虛擬位址空間的空間。不是建立為 "lockable" 的配置不會取用空間。這個方法大幅地減少所使用的虛擬位址空間。因此,應用程式可以透過大型的視訊記憶體設定執行,而不會達到限制。
雖然這個方法會減少取用虛擬位址,但是不會消除 2 GB 的虛擬位址空間限制,而許多應用程式很快就會達到這個限制。最後,應用程式會因為其他原因而達到限制。
[
本帖最后由 kei8864 于 2008-2-19 18:25 编辑 ]