ET框架中的Singleton
本文笔者会按照ET中所有Singleton创建的顺利,尝试梳理一下设计到的模块。
Singleton的创建
疑问 已经有一个ASingleton了,为什么还要有一个ASingletonAwake?
所有的Singleton都会继承ASingleton基类。但是不同的Singleton还会继承不同的ISingletonAwake。 一是使用泛型,二是声明几个参数数量不同的ISingletonAwake接口,开发者可以根据需求选择具体的Singleton继承哪个接口,但是所有的Singleton又都会继承ASingleton被Word中的singletons管理起来,相当于把Singleton的初始化和管理的职能拆分交给了两个角色去处理,还是比较巧妙的。疑问 为什么有的Singleton会被打上Code特性,有的不会?
虽然大家都是Singleton,但是各个Singleton之间的优先级不一定一样,单例之间会存在依赖。比如CodeLoader、CodeTypes这两个单例,它们两个需要在其他单例之前先被Awake,然后在CodeType单例内部,再去创建出其他单例出来。因此,如果有一个单例没有被标记为Code特性,那么说明这个单例是一个优先级比较高的单例,它应该在某一比较早的时刻被我们开发者手动调用并创建出来。也就是ET框架通过给不给单例标记CodeAttribute的方式来对单例的创建进行手动或者自动的管理。
World
接着我们来说一下World中的AddSingleton接口,这个接口不仅仅是被World内部的几个泛型AddSingleton接口调用,还被下面几个地方调用了:
- CodeTypes
- ConfigLoader
- EditorLogHelper
CodeTypes
ConfigLoader
EditorLogHelper
AddSingleton的顺序
- Logger
- TimeInfo
- FiberManager
- ResourcesComponent
- CodeLoader
- 接着调用CodeLoader的Start方法创建CodeTypes单例
- 接着通过反射的方式调用Entry中的Start方法创建下面单例:
- IdGenerater
- OpcodeType
- ObjectPool
- MessageQueue
- NetServices
- NavmeshComponent
- LogMsg
- 然后调用CodeTypes单例的CreateCode方法,该方法拿到所有被标记了CodeAttribute的类,自动的创建这些类的单例:
- EntitySystemSingleton
- MessageDispatcher
- EventSystem
- HttpDispatcher
- LSEntitySystemSingleton
- AIDispatcherComponent
- ConsoleDispatcher
- MessageSessionDispatcher
- NumericWatcherComponent
- UIEventComponent
- ConfigLoader
CodeTypes
EventSystem
EventSystem是所有业务能够跑起来的基础
通过继承InvokeHandler, 在Handle方法里会操作其他单例或者component里面面的接口
- MessageSessionHandler MessageSessionDispatcher
- MessageLocationHandler MessageDispatcherSingleton
EventSystem中维护了两个字段allEvents
和allInvokers
EventSystem在Invoke的时候会初始化这两个字段的内容
allEvents字段中 记为Event特性的所有类型,创建这些类型的实例,被标记了Event特性的类必须要继承IEvent接口。
MemberInfo.GetCustomAttributes(Type, bool);
。
看一下AEvent中提供了一个Run接口,
InvokeHandler和MessageHandler的区别是什么
Event和Invoker的区别是什么
MessageHandler 感觉是另外一套逻辑
EntitySystemSingleton
EntitySystem
EntitySystemSingleton里面维护了一个TypeSystems字段
AwakeSystem和Component的IAwake接口之间的关系.
#
ProcessInnerSender、MailBoxComponent、MessageDispatcherSingleton、MessageHandler
EntitySystemSingleton、IUpdateSystem
#
EventSystemSingleton、AEvent、AInvokeHandler