main函数中加载完dll就是 接下来就是挂载组件 那么加载组件都干了什么事呢
根据frompool参数选择从缓存池取或者反射创建一个组件 创建的组件都有一个instanceid的 属性 组件的唯一表示
component = (T)Activator.CreateInstance(type);
Game.EventSystem.Add(component);
public void Add(Component component) { this.allComponents.Add(component.InstanceId, component);
Type type = component.GetType();
if (this.loadSystems.ContainsKey(type)) { this.loaders.Enqueue(component.InstanceId); }
if (this.updateSystems.ContainsKey(type)) { this.updates.Enqueue(component.InstanceId); }
if (this.startSystems.ContainsKey(type)) { this.starts.Enqueue(component.InstanceId); }
if (this.lateUpdateSystems.ContainsKey(type)) { this.lateUpdates.Enqueue(component.InstanceId); } }
可以看到 Game.EventSystem.Add(component); 就干了2件事
①把组件添加到全局字典
②根据各类 system字典是否包含组件type 加到个格子事件队列中
上一节中有说到加载dll过程中相关代码
遍历程序集所有标记有ObjectSystemAttribute标签的类 =>找实现了相应接口 如实现了IUpdateSystem接口 就把该type加到this.updateSystems字典中
foreach (Type type in types[typeof(ObjectSystemAttribute)]) { object[] attrs = type.GetCustomAttributes(typeof(ObjectSystemAttribute), false);
if (attrs.Length == 0) { continue; }
object obj = Activator.CreateInstance(type);
switch (obj) { case IAwakeSystem objectSystem: this.awakeSystems.Add(objectSystem.Type(), objectSystem); break; case IUpdateSystem updateSystem: this.updateSystems.Add(updateSystem.Type(), updateSystem); break; case ILateUpdateSystem lateUpdateSystem: this.lateUpdateSystems.Add(lateUpdateSystem.Type(), lateUpdateSystem); break; } }
比如下面这个类TimerComponentUpdateSystem UpdateSystem是实现了IUpdateSystem接口的
[ObjectSystem] public class TimerComponentUpdateSystem : UpdateSystem<TimerComponent> { public override void Update(TimerComponent self) { self.Update(); } }
现在知道了 this.updateSystems等字典中数据是在程序开始加载dll时根据type作为key 实例作为value缓存起来的
那么 this.updates.Enqueue(component.InstanceId); 又是为了什么呢? 这里还不清楚
Game.EventSystem.Awake(component);
如果组件实现了IAwake接口的话 调用该接口的Run方法 Run方法调用子类实现的Awake方法
比如上面贴的那个 TimerComponentUpdateSystem类
this.componentDict.Add(type, component
转载于:https://www.cnblogs.com/xtxtx/p/11181745.html
