天天看點

遊戲随筆之事件系統的設計

  新的一年,新的開始,祝願大家新春快樂!轉載請标明出處:http://www.cnblogs.com/zblade/

  今天,開始寫新的一年的部落格了,我的部落格更新的比較随意,也比較緩慢,哈哈。前段時間一直在看一些D3D11的部落格,自己也在摸索各個API的使用,不過今天要寫的是一篇遊戲中的事件系統的設計,具體的事件系統的設計模式(觀察者模式),我就不再贅述了,網上有很多相關資料,可以自行查閱學習了解一下相關的原理,比較簡單易懂。

  在遊戲開發中,我們經常會和伺服器進行資訊的互動,比如玩家點選了商城裡面的領取獎勵的按鈕,此時用戶端會發送一個領取的協定給伺服器,伺服器校驗通過後,會下發給用戶端,用戶端在收到消息後,會重新重新整理一下相關的資料,那麼這些資料的重新整理怎麼表現在UI上面呢,就需要我們通過事件系統來通知UI層進行相關的重新整理操作了。

  最常見的事件系統,就是我上面說到的,将資料層和UI層進行分離,通過事件系統的調用來實作耦合的拆分。這在遊戲中有較多的應用,那麼,我們今天先說一下這種事件系統的設計模式吧。

一、常見事件系統的設計

  要設計一個事件系統,一般會暴露最常見的三個接口:Add/Remove/Trigger,分别負責事件的添加,移除和觸發。依然用Lua來實作這樣的一個接口,我們可以用幾個table來實作一個基本的事件系統的三個接口:

  巧用lua中的table,我們可以實作一個最基本的事件系統,具體的原理可以參看lua代碼來了解,不是很難。這是最基本的事件系統設計,在此基礎上,我們可以進一步的優化我們的事件系統。我們在進行事件系統的注冊、删除和觸發的時候,并沒有考慮到并發性。比如同時有多個消息過來,要求我們對同一個事件進行處理,這時候事件系統就需要考慮并發性的設計了。

二、處理并發性的事件系統設計

    對于并發性的處理,許多常見的思路都給出了不同的處理辦法,比如加鎖就是一個比較好的處理辦法。在執行觸發的操作的時候,這是就對添加的函數進行滞後處理,這樣可以避免在執行觸發操作的時候,又塞入一個新的監聽,造成觸發隐藏問題。可以這樣處理:

   如果不用lua,改用c#來實作,則需要巧妙的運用c#中的連結清單來實作對應的操作,這兒我也給出一份c#連結清單的相關實作吧:)

  用listenerStatus來标志是否處于事件觸發的狀态, 可以較為巧妙的避開同時對連結清單的操作,當然實際的應用在還會添加一些限定條件,判定條件,避免某些不符合正常的操作帶來的風險,具體需要結合項目來進行相關的實作即可。好了,今天的文章就寫到這兒,後續再繼續更新 :D