ET框架学习——Component基类和几个派生类,管理类

      Init类是ET框架接触的第二个脚本。该类开始就设置了一个SynchronizationContext对象。

     SynchronizationContext类是用于多线程之间通信的一个类,其在通讯中充当了个传输者的角色。详情可以参看这篇文章:http://www.cnblogs.com/lzxianren/p/SynchronizationContext.html。OneThreadSynchronizationContext类继承自SynchronizationContext。内部维护了一个ConcurrentQueue<Action> queue对象。当中有一个Updata()方法,不断的执行队列内部的委托方法。同时重写了Post()方法,在线程通信的时候,可以向队列中添加元素。

       ConcurrentQueue是线程安全的队列。详情可以参见这篇文章:https://blog.csdn.net/liunianqingshi/article/details/79025818。该队列使用了分段存储的概念。ConcurrentQueue分配内存时以段(Segment)为单位,一个段内部含有一个默认长度为32的数组和执行下一个段的指针,有个和Head和Tail指针分别指向了起始段和结束段(这种结构有点像操作系统的段式内存管理和页式内存管理策略)。这种分配内存的实现方式不但减轻的GC的压力而且调用者也不用显示的调用TrimToSize()方法回收内存(在某段内存为空时,会由GC来回收该段内存)。

        Game类中涉及到了4个类,Scene类,EventSystem类,ObjectPool类和Hotfix类。

      Scene类中定义了一个枚举。Scene类继承自Entity类,Entity继承自ComponentWithId类,ComponentWithId继承自Component类。我们倒过来看着几个类。

  • Component类

       Component类中维护了一个长整型的InstanceId和一个bool类型的isFromPool。在设置IsFromPool属性为true的时候,会生成一个随机的InstanceId,将本类的实例添加到EventSystem中维护的一个List中。另外维护了一个Component类型的Parent变量,和获取Parent变量的泛型方法,还有一个返回Entity类型的方法,将Parent变量强制转换成Entity类型返回出去。Dispose()方法会触发EventSystem类中的销毁和移除方法,都是将该类的实例从EventSystem中维护的集合中移除掉。同时将实例的InstanceId设置为0,同时,如果IsFromPool==true是,从ObjectPool中移除该实例。

  • ComponentWithId类

         ComponentWithId类中内容不多,维护了一个Id和重写了基类的Dispose方法

  • Entity类

   Entity类中维护了一个HashSet<Component> components的集。关于HashSet可以参见文章:https://blog.csdn.net/Scalzdp/article/details/27346427。HashSet表是乱序存储不重复元素的表,可以做集合运算(交,并,差等)。维护了一个Dictionary<Type,Component> componentDict字典。重写了Dispose方法,遍历字典,对每个键值调用Dispose方法,同时清空字典。

         Entity类中针对字典和集合维护了几个AddComponent()的重载方法,AddComponent(Component component),将指定的component添加到字典中,和HashSet中,同时将本实例设置为component的Parent。AddComponent(Type type),通过type值,由ComponentFactory类可以创建出一个component,再添加到字典和集合中。

        RemoveComponent()重载方法,根据键或者值,从字典或者集合中移除对应的键值对。同时component调用相关的Dispose()方法。

         GetComponent()重载方法,根据键或者值,从字典中返回相应的component对象。

        重写EndInit()方法,该方法继承自Object类,实现的是ISupportInitialize接口。清空字典,同时,如果集合不为空,将集合中的元素添加到空字典中。这里不是很理解,为什么将集合中的对象添加到清空后的字典中。

  • ComponentFactory类

       ComponentFactory适用于创建Component的类。内部提供各种创建Component的方法。

     CreateWithParent(Type type, Component parent)方法,指定要创建的conmponent的类型和父对象。根据类型创建component,创建出的component默认放在Game.ObjectPool维护的字典中。同时指定该component的父对象,将component对象的InstanceId赋值给componentWithId对象的Id。最后执行EventSystem的Awake方法(执行指定IAwakeSystem接口中的Run方法)。

       CreateWithId<T>(long id) where T : ComponentWithId方法根据id来创建component,T类型继承ComponentWithId,同样也继承Component。根据T的类型创建(在Game.ObjectPool维护的字典中查找)对应的component。同时修改指定component的id,执行EventSystem的Awake方法。

猜你喜欢

转载自blog.csdn.net/Tong1993222/article/details/81747845