gpt4 book ai didi

java - 基于组件的游戏对象的数组和映射之间的优缺点

转载 作者:行者123 更新时间:2023-11-30 01:52:15 24 4
gpt4 key购买 nike

我的基于组件的游戏引擎的 GameObject 的抽象实现如下:

游戏对象

  • 唯一标识
  • isActive 标志
  • 组件数组

我一直在阅读基于组件的设计,引起我注意的一件事是由于缓存,数组的线性遍历速度很快,所以这让我决定使用基本数组来保存实体/游戏对象。

现在引起我注意的另一件事是一些资源将组件与游戏对象分开。他们所做的是在实体管理器中有一张 map 。该 map 将游戏对象作为键,将一组组件作为值。在这种情况下,GameObject 只有一个 ID。

将游戏对象附加到组件而不是将组件放在 GameObject 类中是否有优势(性能和/或设计方面)?

此外,GameObject将从Pool对象中池化(回收),以避免频繁分配内存。

最佳答案

在大多数游戏组件系统中,您将需要数组和字典( map )。

对于线性遍历(即在更新期间),数组用于枚举对象和组件。

对于按 ID、名称或其他属性查找,可以使用一个或多个词典按相应类型查找组件。这在对数组进行线性搜索会导致明显的性能损失时最需要。

此外,可能还有其他数组存储按组件排序的游戏对象,例如具有特定组件(如 CombatComponent)的游戏对象数组。

通常这将被包装在一个类中,允许您通过索引访问组件(或游戏对象),枚举它们,或通过一些标准(如 ID)获取它们。然后可以随着时间的推移更新类的实现,以通过使用更高的内存使用量换取更好的性能来加快对特定组件的访问(即引入一个额外的字典以按启用状态索引组件,或按空间位置索引游戏对象)。

简而言之:总是需要权衡取舍。开始使用额外的字典和数组主要是为了方便和性能,但这绝不是一个非此即彼的决定。

如果需要按顺序枚举对象,则默认存储实现应始终以数组开头。字典的主要问题是枚举顺序可能会逐帧改变,这在游戏中必须避免。

关于java - 基于组件的游戏对象的数组和映射之间的优缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24893154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com