GameInput 主要是圍繞輪詢模型設計的,但在某些情況下,以非同步方式通知應用程式是最佳做法。為了支援此需求,IGameInput 介面公開了幾個方法,用於註冊在發生特定相關事件時叫用的回呼函式。
在內部,GameInput 會將回呼的分派序列化,讓一次只執行一個回呼。GameInput 保證回呼會依時間順序分派。這些保證可簡化應用程式需要在其回呼函式中撰寫的程式碼。
GameInput 在任何時間最多允許註冊 64 個回呼,不論類型為何。回呼是從 GameInput 中的內部背景工作執行緒分派。如需此運作方式的詳細資訊,以及手動排程此工作的選項,請參閱 GameInput 工作佇列。
裝置回呼
裝置回呼可讓應用程式得知輸入裝置的狀態何時變更,如下列語法所示。最常見的用途是偵測裝置何時連線和中斷連線,但其他狀態變更也可能值得關注。enumerationKind 參數接受 GameInputEnumerationKind 列舉中的值,指出是否應在回呼註冊過程中執行列舉,如果是,則指出應以封鎖或非同步方式執行列舉。將裝置列舉與後續狀態變更結合成單一不可部分完成的作業,可避免許多應用程式在其輸入程式碼中無意間遭遇的競爭情形。
讀數回呼
透過讀數回呼,每當有新的讀數抵達輸入串流時,應用程式就會收到通知,如下列語法所示。雖然許多應用程式會發現輪詢輸入比較好,但在某些情況下,事件驅動的輸入可能更合適。例如,遊戲的主功能表 UI 可能更適合以事件為基礎的輸入。另一個範例是輸入對應 UI,它必須在提示使用者進行選擇之後等待輸入。取消註冊回呼
成功註冊回呼之後,應用程式必須保證執行回呼所需的任何資源都保持有效。這包括回呼程式碼所使用的資源,以及回呼函式本身,例如,回呼函式裝載在應用程式視需要載入和卸載的 DLL 中時。 若要安全地回收這些資源,應用程式必須先將從Register*Callback 方法收到的權杖傳遞至 UnregisterCallback 方法,以取消註冊回呼。如果呼叫此方法時回呼正在執行,此方法會封鎖直到回呼執行完成。因此,回呼無法從其自身的回呼函式內取消註冊自己。
也可以呼叫 StopCallback 方法來停止回呼。這不會取消註冊回呼,但會確保不會再次呼叫該回呼。由於回呼未取消註冊,因此可以安全地從回呼自身的回呼函式內呼叫此方法。它會完成執行目前的回呼,但不會再次呼叫它。由於任何時間最多只允許 64 個回呼,因此最終仍必須取消註冊回呼。
