使用实体ID系统有什么好处?


12

我目前正在阅读《编程游戏AI示例》一书。

该书提到为游戏中的每个实体分配唯一的ID号。通常,当实体A需要联系实体B时A通过将B的ID号发送到EntityDatabase类来获取对B的引用。此类接收ID号并返回对实体的引用。

还可以从包含某些实体(主要游戏角色)的ID的文件中获取某些实体的ID号。

我的问题是:我为什么要这样做?为什么我不能直接使用引用?有时很难直接获得参考?使用ID系统是一种常见方法吗?是否有不使用ID的游戏?

我是游戏开发的新手。请说明使用实体ID系统的好处。优缺点。具体的例子会很棒。谢谢

Answers:


18

参考在许多情况下都能很好地工作。但是,在三种重要情况下,引用无法正常工作:

  • 联网。通过网络发送有关同步实体状态的信息时,不能使用引用。您需要以某种方式标识实体,以便远程计算机知道您在说谁。
  • 保存/加载。在将游戏状态保存到磁盘时,对象引用不能随之进行。这意味着当您加载状态时,以引用为目标的实体B的实体A不再知道目标对象。内存位置不同,对象也不同。

  • 内存管理。将引用存储在中央位置意味着删除实体时,无需遍历所有实体并删除对它的引用即可清理内存。引用仅应在需要时使用,然后在任何其他实体中删除。减少引用计数可确保您没有仅被僵尸实体与其交互的最后事物或其他实体引用的僵尸实体。这也有助于通过标准化的测试方法来避免空引用,如果一个实体仍然存在。


2
最后一段应该是它自己的重点(内存管理)。在某些情况下,一类需要一段时间引用另一实体,但是该实体引用可能变得无效(即,射弹目标实体死亡)。当通过ID请求实体时,通过返回NULL,当实体引用变为无效时,每个类都有责任做正确的事情(而不是崩溃)。
LearnCocos2D 2014年

谢谢回答。有待澄清的问题。一般而言:在实体A需要获得对实体B的引用的情况下(为了对其进行攻击,向其发送消息,检查与它的冲突或根本没有任何其他原因)-我应该使用ID系统来得到它,还是有时可以直接获得参考?含义:实体A是否应始终通过向其发送实体B的ID(交叉引用实体参考和ID号)来从EntityManager获得引用,然后才使用EntityManager的引用联系实体B?我应该一直使用身份证系统吗?
Aviv Cohn 2014年

还是有时可以直接获取参考?换句话说,实体A应该何时使用EntityManager来获取存储在其中的引用,实体A何时可以通过其拥有的任何方式获取对B的引用?
Aviv Cohn 2014年

对此没有真正正确的答案。就个人而言,我会将实体系统设计为独立于游戏逻辑。这将意味着游戏逻辑甚至无法访问直接实体引用。本质上,我将避免在当前方法的本地范围之外维护对实体的任何引用。这意味着在对实体的组件进行操作之前,每次都要使用EntityManager。
MichaelHouse

我知道了。让我举一个例子来看我是否理解你的意思。假设我使用统一网格进行碰撞检测。网格是一个二维数组。仅检查每个实体是否与网格中同一“单元”中的实体发生冲突。使用“常规”方法,每个单元将在其表示的区域中保存对GameEntity对象的引用。使用“ ID系统”方法,每个单元将保存实体的ID号。这些编号将被发送到EntityManager以接收具体的引用,以进行冲突检测。这是一个很好的理解吗?
Aviv Cohn 2014年

2

最后一件事是,如果您正在使用对象池模式,并且由于该生物死亡(例如)死亡并在其他地方重新生成而使实体重置,则引用仍将指向同一实体(故障),并且ID将不再保留有效。

ID 5067指向地址0x8765的生物死亡,并且另一个产生新的生物ID重置为7073有人检查ID 5067,它指向0x8765,但是该生物现在已使用ID 7073注册,因此实体ID数据库知道您使用了过时的ID,并且通知您,您尝试接触的生物不再有效。

这就是Byte56提到的所有奇妙原因,也是为什么避免直接使用引用是一个好的设计。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.