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接下来的目标之一.