55## 需求
66
77
8- 我们开发一个游戏 ,游戏中有两种人物:普通英雄和超级英雄,他们具有下面的行为:
8+ 我们需要开发一个游戏 ,游戏中有两种人物:普通英雄和超级英雄,他们具有下面的行为:
99普通英雄只能移动
1010超级英雄不仅能够移动,还能飞行
1111
@@ -350,7 +350,7 @@ worldState的superHeroes中有一个超级英雄数据的position为[6,6,6],
350350
351351
352352<!-- 通过下面的改进来解决重复和继承的问题: -->
353- 基于组件化的思想,用组合代替继承,具体如下:
353+ - 基于组件化的思想,用组合代替继承
354354将英雄抽象为GameObject
355355将英雄的行为抽象为组件,并把英雄的相关数据也移到组件中
356356英雄通过挂载不同的组件,来实现不同的行为
@@ -867,7 +867,7 @@ worldState的gameObjects包括了4个gameObject的数据;
867867## 概述解决方案
868868
869869<!-- 通过下面的改进来提高性能: -->
870- 基于Data Oriented的思想进行改进,具体如下:
870+ - 基于Data Oriented的思想进行改进
871871<!-- 基于Data Oriented的思想进行改进,将gameObject所有的数据和每种组件的数据分别集中起来,保存在各自的一块连续空间中 -->
872872<!-- 其中,gameObject的数据是指gameObject挂载了哪些组件,我们将其保存在一个Hash Map中; -->
873873组件可以按角色分为Data Oriented组件和其它组件,前者的特点是每个组件都有数据,且组件的数量较多,后者的特点是每个组件都没有数据,或者组件的数量很少
@@ -876,13 +876,14 @@ worldState的gameObjects包括了4个gameObject的数据;
876876
877877将属于Data Oriented组件的三种组件的所有组件数据分别集中起来,保存在各自的一块连续的地址空间中,具体就是分别保存在三个ArrayBuffer中
878878
879- 将GameObject和各个Component扁平化,使得GameObject不再有数据和逻辑了,而只是一个id;Component也不再有数据和逻辑了,属于“Data Oriented组件”的Component只是一个ArrayBuffer的索引;属于“其它组件”的Component只是一个id
879+ - 将GameObject和各个Component扁平化
880+ 使得GameObject不再有数据和逻辑了,而只是一个id;Component也不再有数据和逻辑了,属于“Data Oriented组件”的Component只是一个ArrayBuffer的索引;属于“其它组件”的Component只是一个id
880881<!-- 其中GameObject是gameObject与挂载的组件的对应关系这个Hash Map的Key;Component既是这个Hash Map的Value,又是ArrayBuffer中的索引 -->
881882
882- 我们增加Component +GameObject这一层,将扁平的GameObject和Componet放在该层中
883+ - 增加Component +GameObject这一层,将扁平的GameObject和Componet放在该层中
883884
884885
885- 我们增加Manager这一层 ,来管理GameObject和组件的数据
886+ - 增加Manager这一层 ,来管理GameObject和组件的数据
886887这一层有GameObjectManager和四种组件的Manager,其中GameObjectManager负责管理所有的gameObject;
887888四种组件的Manager负责管理自己的ArrayBuffer,操作属于该种类的所有组件
888889
@@ -893,7 +894,7 @@ worldState的gameObjects包括了4个gameObject的数据;
893894考虑到为了方便组件直接就近获得自己挂载到的GameObject,所以我们选择后者
894895
895896
896- 我们增加System这一层 ,来实现行为的逻辑。
897+ - 增加System这一层 ,来实现行为的逻辑
897898一个System对应一个行为,比如这一层中的MoveSystem、FlySystem分别实现了移动和飞行的行为逻辑
898899
899900
0 commit comments