分享一则学习到的存储方式,目前也在学习游戏引擎的路上,欢迎指正。
在游戏引擎编写过程中肯定离不开游戏实体Entity与各种组件Component之间的管理,一般都会很直觉的认为一个Entity中存在多个Component所以假如直接编写的话,大概会长这个样子:
其中一个Entity中存在多个Component 如Transform等,会出现一定的问题,如查询的时候你必须找到当前Enity查询他是否有这个Component,一般来讲是没问题的,但当Enity的数量庞大的时候这会增加很多的计算量。
我们考虑这样的一个结构,每一个Entity我们都用一个列表来存储他的Component索引(按位存储)
每一个Entity,对于一个Entity有个不断更新的Component列表不断更换Entity,但这可能会导致一个丢失指向的问题,因为在你换到其他Entity的过程中他的下标变动可能导致他的部分Component被上一个的其他Component覆盖掉,导致cache misses。
然后就是在优化一下
我们把每一个Entity的下标也存储一下把他对应到每一个单独的“Component 位 ”比如第一例中所有存储都是对应的 (图中数字表示的是数量不是存储的数据),这样我们就能很快的并且 单独查找比如Transform,不需要包含另外的Component等。
但如果删除一个存储的数据呢?比如我们删除一个这样的Entity,他的对应就会出现问题
所以我们在添加一个新的用来存储当前Entity的列表,前几位表示当前的Entity号(图中为8bit)后几位为Entity的“版本”
这样就完成了一种比较快的引擎数据的存储方式。
图片来自:TheGameEngineProgrammingSeries with Arash Khatami
2023/4/13补充代码: