在C中存储和检索复杂对象的高效方法?

前端之家收集整理的这篇文章主要介绍了在C中存储和检索复杂对象的高效方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在做一个小地牢模拟游戏.这个游戏是非常详细的,我打算随着时间的推移,拥有一个代表一个“怪物”的200k个类的实例.它们包含了怪兽的技能和历史.像他用过的药水,他住在哪里,他的巡逻路线等等.

我开始使用sqlite实现,并使用一个名为“怪物”的简单表,其中包含所有数据.这允许我使用SQL查询来查找每个帧上的模拟计算所需的怪物.例如:找到巡逻点A的所有怪物,或者找到所有使用Potion X的怪物等等.不幸的是,在每个框架上多次查询sqlite都会使游戏放缓.即使是2D游戏,我需要精确的毫秒来进行模拟计算.

此外,我将来需要加入JOIN来做图:我需要知道一个怪物是否攻击了另一个怪物,或者怪物是否是另一个怪兽的一部分.这会进一步减缓事情.

有人有任何建议如何处理这个问题?

我的数据类似于这样:

解决方法

如果您不使用实体组件系统,请考虑将游戏迁移到使用一个.相关数据的每一位可以存储在自包含的组件中,实体本身是标识组件的一些不透明标识符.当使用ECS时,不要让一个拥有一大堆数据的游戏实体脱离关系.一个特定类型的所有组件一起存在于一个大型池中,而您的实体只是一个标识符,用于指定该池中他们关心的组件.这允许您做的是批量组件更新.如果您在每个具有广告资源的怪物上都有一个广告资源组件,那么您的所有广告资源组件都可以或多或少存储在内存中.这意味着在处理它们时,您具有高缓存一致性,这可以显着提高性能.

也可能是你只是想要做太多的每一帧.使用实体组件系统,您可以将特定子系统限制为每X个帧或每X秒(如果需要).也许AI组件只需要运行一秒钟就可以考虑下一步该做什么,但是它们需要不间断地移动,以便每帧更新位置.或者也许放在一起,一个图表和图表需要太长时间才能在一帧中完成,所以你每秒钟计算一次,或者将处理分成两帧,以便在帧上迭代一半的实体,其余的在第二帧帧.有很多方法可以拆分.

Here is some more reading on component systems if you haven’t seen them before

猜你在找的C&C++相关文章