2011-06-27 84 views
1

有利於每個設計的考慮因素是什麼?基於事件和輪詢組件

假設我正在寫一個輸入組件來收集來自設備(鼠標,遊戲手柄,觸摸等)的輸入。

設計這將是提供的,在給定的時間點測試給定狀態的方法的API的一種方式(是該按鈕在該幀中按下了嗎?)

另一種方式是有一些其它部件不斷調用這個組件每一幀,檢查這些事情,引發事件通知發生的事情(例如 - 定義一個事件MouseClicked,將被API用戶掛鉤)。

爲什麼你會喜歡這些設計?

回答

7

區別在於「推」模型和「拉」模型之間,如消費代碼所見。可以在輸入設備的上下文中工作(在某個級別,設備由操作系統進行輪詢以用作事件的觸發器,或者僅設置一個有效的值直到下一次輪詢)。我認爲使用這個或那個的決定取決於什麼是重要的;它現在點擊了還是被點擊了?這種較小的語義差異可能意味着行爲的重大差異。

如果您要查找的是在檢查時按下按鈕,則將其設置爲輪詢機制。提供一個經常更新的屬性,就像您知道庫中的內容一樣,消費者將檢查以確定按鈕被按下。

如果您需要傳達一個按鈕在某個時間被按下,然後將其設置爲一個事件,它將「推送」這個信息給它的聽衆。

你想使用哪一個取決於你如何構造使用它的程序。一個Windows GUI遊戲,其中程序設計從簡單地等待輸入,最好由基於事件的模型提供服務。一個視頻遊戲,像一個側滾屏,你必須知道輸入的當前狀態以繪製下一幀,這可能更好地由輪詢機制提供。

坦率地說,在像這樣的庫中,並行設置兩種方案都是微不足道的;更新一個屬性,然後如果有人在聽,大聲說出來。這種消費代碼可能會隨着用戶對於他們的目的感到需要而推動或拉動。

+0

我目前實際上並排實施了它的一部分。唯一的問題是該組件的事件永遠不會被提出,除非該組件正在定期輪詢。或者你建議組件本身將執行輪詢? –

+1

我建議組件,庫,任何,執行輪詢的實際硬件設備或抽象層(即DirectInput),然後設置屬性指示設備狀態,它可以輪流消費代碼,然後還會觸發事件時對象狀態發生變化。因此,如果我正在創建一個代表鼠標狀態的「鼠標」對象,則會有一個「LeftButtonDown」布爾屬性和一個「OnLeftButtonDown」事件,並且我的消費者可以訂閱事件或輪詢該屬性。 – KeithS

+0

你如何補救那些依賴於輸入流的側滾動遊戲,其中長按鈕被解釋爲相同輸入的流,並且因爲響應不是原子的,具有延遲的響應感覺並且在長序列似乎沒有及時「檢測到」... –

0

可能更好提供一個API,其中消費者可以指定一個回調,在事件發生時可以使用相關數據調用回調。這樣你的組件的使用者就不會查詢數據。