2023/8/18
对象池和对象引用
战斗系统中的逻辑层的敌人逻辑单元由于需要经常生成,欲将之加入对象池来减少消耗。加入对象池的操作没有问题,对象本身的数据也能够正常释放。但是战斗系统最初的设计,使得逻辑层之间以及逻辑层和表现层之间直接大量使用逻辑单元的引用进行数据操作,这不仅使得类之间过于耦合,还导致使用的对象池由于没有释放掉对象,其他部分对该对象的引用还是能够正常的访问,这就导致的很多的数据访问问题。
解决方案是将对象之间的直接引用改为索引,用的是逻辑单元本身的唯一uid,在逻辑单元管理器中维护了逻辑单元的对象数组,所有其他类需要访问逻辑单元需要从逻辑单元管理器中通过uid进行查找,这样就避免了逻辑单元被对象池回收后还能被访问的问题,但是由于每次访问需要进行一次查找,增加了计算量。
在将逻辑层和表现层的直接引用拆分的时候,发现有一些表现层的操作只需要逻辑层状态改变时进行一次操作就行,但是却在tick中每帧进行检测,随即将其改为事件驱动,大大减少了计算量。
动画状态机在这次修改中原本也是使用逻辑单元的直接引用,然后每帧访问逻辑单元的状态在状态机中进行tick并作为状态转换的依据。趁着这次修改将逻辑单元的状态在本地储存了一份,并通过事件在逻辑单元改变时进行一次同步。完美完成了将动画系统和逻辑单元的解耦并将其从每帧访问改为了事件驱动。