Share via


遺失的裝置

Direct3D 裝置可處於作業狀態或遺失狀態。 作業狀態為裝置的正常狀態,在該狀態中,裝置會如預期般執行並顯示所有轉譯內容。 如有事件 (例如在全螢幕應用程式中失去鍵盤焦點) 導致無法轉譯,裝置就會轉換為遺失狀態。 遺失狀態的特性,在於所有轉譯作業都會發生無訊息失敗,而這也意味著:即使轉譯作業失敗,轉譯方法依舊可傳回作業成功的程式碼。

預設並不會提供可導致裝置進入遺失狀態的完整案例集。 常見的幾個範例會包括失去焦點,例如當使用者按下 ALT+TAB 時,或當系統對話方塊初始化時。 如果發生電源管理事件,或其他應用程式進行全螢幕作業,也有可能讓裝置進入遺失狀態。 此外,任何無法重設裝置的情況,也會讓裝置進入遺失狀態。

IUnknown 衍生的所有方法,皆可保證在裝置遺失後繼續運作。 裝置遺失後,每項功能通常會有以下三個選項:

  • 因為「裝置遺失」錯誤而失敗 - 這表示,應用程式需要體認到裝置已遺失,以便察覺有些情況未如預期般發生。
  • 發生無訊息失敗,並傳回 S_OK 或其他任何傳回碼 - 如果功能發生無訊息失敗,應用程式通常無法區分「成功」和「無訊息失敗」結果的差異。
  • 傳回傳回碼。

因應遺失裝置的情況

遺失的裝置必須在重設後重新建立資源 (包括視訊記憶體資源)。 如果裝置遺失,應用程式就會查詢裝置,以查看裝置是否可還原至作業狀態。 如果無法,應用程式就會等到裝置可還原為止。

如果裝置可還原,應用程式就會終結所有視訊記憶體資源和任何交換鏈結,以進行裝置的準備作業。 重設是裝置遺失時的唯一有效程序,也是應用程式將裝置從遺失變更為作業狀態的唯一途徑。 除非應用程式釋出已配置的所有資源,包括轉譯目標和深度樣板表面,否則重設將會失敗。

在多數情況下,Direct3D 的高頻率呼叫並不會傳回任何有關裝置是否遺失的資訊。 應用程式可在不會收到裝置遺失通知的情況下,持續呼叫轉譯方法。 在裝置重設為作業狀態為止,內部將捨棄這些作業。

封鎖作業

Direct3D 內部會進行足夠的工作,以確保裝置遺失後的封鎖作業可成功執行。 不過,無法保證在封鎖作業期間,視訊記憶體資源的資料將精確無誤。 但可保證不會傳回任何錯誤碼。 這可讓應用程式進行寫入,無需擔憂裝置在鎖定作業期間遺失。

資源

資源可使用視訊記憶體。 由於遺失的裝置會與介面卡擁有的視訊記憶體中斷連線,因此當裝置遺失時,便無法保證視訊記憶體的配置。 基於上述原因,所有資源建立方法都會時做成功,但實際上只會配置虛擬系統記憶體。 由於任何視訊記憶體資源必須先行終結,裝置才能調整大小,因此不會發生過度配置視訊記憶體的問題。 這些虛擬表面可讓鎖定和複製作業看似正常運作,直到應用程式察覺裝置已遺失。

所有視訊記憶體都必須先遭到釋出,裝置才能從遺失狀態重設為作業狀態。 其他狀態資料會透過轉換製作業狀態來自動終結。

建議您使用單一程式碼路徑開發應用程式,以因應裝置遺失。 這個程式碼路徑可能與啟動時用來初始化裝置的程式碼路徑相似 (或完全相同)。

擷取的資料

Direct3D 可讓應用程式依照硬體的單一傳遞來驗證紋理和轉譯狀態。

此外,Direct3D 也可讓應用程式將視訊記憶體資源產生或先前寫入的映像複製至非揮發性系統記憶體資源。 由於這類傳輸的來源映像隨時都有可能遺失,Direct3D 允許這類型的複製作業在裝置遺失時發生失敗。

當裝置遺失時,由於缺乏主要表面之故,複製作業可能會發生失敗。 此外,鑑於裝置遺失時無法建立背景緩衝區,建立交換鏈結也有可能發生失敗。

裝置