我正在制作一个小型地下城模拟游戏.游戏非常详细,我计划随着时间的推移,有一个代表"怪物"的类的+ 200k实例.它们包含该怪物的特权,技能和历史.像他使用了多少药水,他住在哪里,他的巡逻路线是什么等等.
我开始用SQLite实现它,并使用一个名为"monsters"的简单表,其中包含所有数据.这允许我使用SQL查询来查找每帧上模拟计算所需的怪物.例如:找到所有巡逻A点的怪物,或找到使用了药水X的所有怪物等等.不幸的是,在每一帧上多次查询SQLite会很快减慢游戏速度.即使它是2D游戏,我也需要宝贵的毫秒来进行模拟计算.
此外,我将来需要JOIN来制作图表:我需要知道怪物是否攻击了另一个怪物,或者怪物是否是另一个怪物团队的一部分.这会使事情进一步减缓.
有没有人对如何处理这个有任何建议?
我的数据类似于以下内容:
如果您不使用实体组件系统,请考虑将游戏迁移到使用一个.每个相关数据位可以存储在一个独立的组件中,实体本身是一个标识该组件的不透明标识符.使用ECS时,不要让游戏实体挂起一堆数据,而是颠倒关系.特定类型的所有组件一起存在于一个大池中,并且您的实体只是一个标识符,用于指定它们关注的池中的哪个组件.这允许您做的是批量组件更新.如果每个具有库存的怪物都有一个库存组件,则所有库存组件可以或多或少地连续存储在内存中.这意味着在处理它们时,您具有高缓存一致性,这可以显着提升性能.
也可能是你只想尝试每帧做太多.使用实体组件系统,您可以根据需要将特定子系统限制为每X帧或每X秒.也许AI组件只需要每秒运行一次以考虑下一步该做什么,但是它们需要不断移动以便每帧更新位置.或者将图表和图形中的一个放在一起需要花费很长时间才能在一个帧中完成,因此您可以每隔一帧计算一次,或者将处理分成两帧,以便在帧上迭代一半以上的实体,其余的在第二帧上迭代帧.有很多方法可以拆分它.
根据之前的答案/评论以及您对他们的回答,我假设您决定继续使用 SQL,但您想要一种更好的方式来阅读/处理它。因此,我的回答仅关注该方面,并且仅与设计相关,而不是其他建议(例如使用不同的 SQL 引擎)。
您的数据库中的主要问题,正如您最初的问题所反映的那样,是给定怪物的所有方面都位于一个记录中,全部位于同一个 table 中。随着时间的推移,这使得桌子变得很大。除此之外,这种设计使您的数据库和代码难以维护和发展。
虽然将怪物的所有细节保存在单个记录中听起来“正确”(也许还有一个在代码本身中反映它的对象),但这很少是一个好的决定。您应该在“世界”中建模的对象属性与软件中建模的属性之间有明确的分离。例如,一个怪物的位置可能经常改变,而它的名字却没有。由于您将所有数据保存在一个表中,因此对位置的任何更改都在保存所有其他属性的同一个表上完成,这使得操作非常繁重。
相反,您应该做的是:
这样,任何读取和更改都只在相关上下文中进行;例如,改变怪物的位置只会改变位置表,不会影响更持久细节的表。联接不应该花费很多时间,只要您有良好的索引并且只过滤那些您感兴趣的数据。除了加快查询速度外,这种设计还更加灵活。例如,如果你想给怪物添加一种新的属性,你可以只添加一个新表,或者使用现有的具有相似数据(例如怪物的装备)的表来添加保持它。
如果您的查询在很大程度上依赖于“地理”位置,并且您仍然希望使用关系数据库来处理它,那么您可能会考虑在空间查询中具有更好支持的其他类型的数据库。
哼!
归档时间: |
|
查看次数: |
1247 次 |
最近记录: |