实体 – 组件 – 系统devise

我读了很多关于ECS(战略)模式的内容,并且有几个问题。 考虑简单的空间游戏。

  1. 那里有星星。 明星是一个entity 。 如果我想做一个星系呢? 让银河成为一个entity看起来是合理的。 另一方面,星系只是一组星星。 在通常的面向对象devise中,我只是把它作为一个拥有星星/星星vector的类。 建立一个只是其他实体的容器的entity是否合法? 在某些时候不会刹车吗?

  2. 现在考虑行星系统。 它看起来像地球也是一个entity 。 但是将一颗行星与它的母星联系起来是明智的。 可能一个实体指的是另一个(有指针,或类似的东西)? 你将如何撰写?

提前致谢。

这是一个XY问题 。 实体组件系统就像您在典型的软件工程中会遇到的一种devise模式。 但实体组件系统是为了解决某种types的问题 。 问题是处理具有无限复杂度的许多组件的对象,例如具有不同效果和能力的RPG项目,其中inheritance将导致潜在数百或数千个类别以包含复杂度和/或恒定的下游客户端更新到实际的代码,以添加新的项目。

ECS并不是一个旨在用于模拟系统或游戏的系统,无限数量的实体(比如数千个)一起玩,其中实体的数量是性能的主要因素。 与简单的inheritance或组合相比,实体组件系统具有非常实际的,非常显着的性能成本,并且不应该轻易地决定使用如此大的系统 。 当实体数量不是系统的主要性能因素时,可以忽略使用ECS的成本。 当你有这样一种情况时,ECS的用例是合法的:“我需要能够获得一个有10种不同元素types的剑和10种其他效果,或者是一些非常大的效果的组合”,而不是一个“我需要创建一个建筑物”。

这是一个问题,并非所有的游戏都有,而且你所说的问题就是你根本没有的。 此外,您可以拥有ECS,并且您的游戏中没有任何实体存在于ECS框架内 。 一些实体可能在ECS内部,而另一些不那么灵活的实体可能只是普通的实体,具有正常的inheritance特性。

你的情况并不要求任何这种复杂的ECS的东西,因为你有一个非常有限的实体types的数量和每个实体(他们没有dynamic组件)的已知configuration。

你有星星,行星,星系,星系。 星系包含太阳系,太阳系包含至less一颗恒星和0至1颗行星。

恒星有一定的特征,而这些特征的清单永远不会改变(温度,大小等等),行星也是一样的。 你不需要ECS来解决这个问题,简单的OOPdevise和数组就可以解决你的问题

所以,在这个项目的这个部分远离ECS,它不会解决你的问题,从你甚至不需要问这个问题就可以看到,它会让你的生活变得更加困难,试图把它放在不适合的地方属于。

为什么不给每个星星一个星系? 如果实体不是明星,而是例如宇航员,则将其设置为-1。

要在星系中find恒星,只需遍历所有实体并检查星系。 如果这是昂贵的,必须每帧经常进行,那么只需caching该信息。

你的实体/星星的数组将保持平坦,这样就不需要遍历容器。

这使得银河星系的成员成为星的属性,而不是实际的容器数据结构。