Asm♂Event♂Bus

好吧,標題是逗悶子的,這個項目的名字確實是AsmEventBus,但我總是忍不住在裡面插入'♂'.

上一篇日誌提到正在做一個Java庫(如果你真的以為上一篇日誌僅僅是追悼我掛掉的高數的話...就點它的"繼續閱讀"吧),其中提到"一個基於類生成的事件總線系統",在寫完日誌後不久,我決定把事件總線系統從庫中分離出來,單獨作為一個項目.

於是便有了這個AsmEventBus(簡稱AEB),它是一個用到了ASM庫的高性能事件總線系統,它提供了比Guava事件總線還要豐富的功能.作為一個中間件,它擁有高度的可定製性,包括:

  • 可自定義的訂閱者策略. (比如如何甄別一個方法是否是事件訂閱者.)
  • 可自定義的事件在類繼承關係中的傳遞順序. (比如Gaze是See的子類,那麼能接收See事件的訂閱者也能接收Gaze事件,問題是,如果有2個訂閱者分別訂閱See和Gaze事件,現在有一個Gaze事件被發布,那麼誰先接收到?Guava的設定是訂閱Gaze的先收到,因為Graze是See的子類.而在AEB中是可定製的.)
  • 可定製的優先級事件.(就像Forge中的事件那樣,高優先級對低優先級有絕對的優勢.此外,優先級事件的分派策略也是可定製的,是先在子類中走完所有優先級,再交給父類執行,還是高優先級子類-高優先級父類-低優先級子類-低優先級父類? 當然,這裡所說的先子類後父類是可以顛倒的,因為1傳遞策略是可自定義的嘛)
  • "孤兒事件"(即沒有訂閱者處理的事件,Guava稱為DeadEvent,我也照搬了這個名字,但我真的覺得這個名字很奇怪.)和訂閱者異常的處理句柄.好吧這個功能其實在最新版Guava中也提供了.

這個項目目前基本完成了,現在下載地址是在它的CI服務器上:

http://ci.hakugyokurou.net/job/AsmEventBus/ws/AEB/build/libs/

(順便一提,前兩天我添置了一台OpenVZ VPS作為CI服務器,從字面上看配置還不錯(實際上傻子都知道OpenVZ一定會被超售...),如果有人想為自己的Mod掛一個CI的話,可以聯繫我...)

項目構建工具是Gradle,版本庫託管在Github上:https://github.com/szszss/asmeventbus/

有勇氣做小白鼠的人可以試一下...接下來幾天開發仍會進行,基本就是除錯和補文檔.主要功能已經開發完了. (不過,明天就要軍訓了啊,鴨梨山大...看我能不能忙裡偷閒hehe...)

對了,如果你問到性能,那麼我覺得AEB在事件100%命中的情況下性能是Guava的5~10倍.
然而,我也不得不承認,事件總線系統的另一個不容忽視的性能瓶頸是事件分派效率,因為實際使用中事件不會是100%都能被訂閱者捕獲的,沒有經過科學調查,我主觀猜測MC+Forge中只有大約10%的事件能有訂閱者,其餘的都作為"孤兒事件",除了白白佔用事件總線以外,毫無作為.因此,設法提高事件分派效率也是AEB接下來的目標之一.