一种游戏引擎中的数据存储方式

棉花糖星球最可爱的兔兔

 分享一则学习到的存储方式,目前也在学习游戏引擎的路上,欢迎指正。

 在游戏引擎编写过程中肯定离不开游戏实体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补充代码:

7
评论 3
收藏 2
  • MR7
    MR7
    感谢分享~
  • xzben
    没太看明白,能细化讲解下么?或者能给点示例代码么?
    1
    展开1条回复