如何处理C ++游戏中的大量对象

时间:2012-12-31 18:10:53

标签: c++ game-engine

问题

对标题感到抱歉,似乎无法找到更短/更好的说明..

情况就是这样:我正在制作一个简单的游戏,其中有一张大地图(简单但非常大)。该地图上还有很多敌人,但动作仅限于主角(在某个半径范围内,这是地图的一小部分)。

在每个'tick'(或步骤,或任何你称之为)的情况下,每个对象上都会调用一个函数来确定它们的下一步动作。出于性能原因,由于我不关心在我的视图范围之外发生的事情(或者至少是非常遥远的事情),我不想在非常异物上调用该函数。

如何管理这些对象,以确保我在附近移动地图时始终拥有更新的附近对象列表?

(我知道它是用C ++标记的,但任何语言都可以 - 我不是在寻找那么多的代码 - 更多的是关于这个想法)


我已经尝试了什么

我尝试了一些替代方案:

  • 备选方案1:在“区域”中分隔我的地图,并在每个区域中存储敌人列表。问题就是当我在这些区域的边缘时发生的事情(更糟糕的是)当我在一个角落(我周围的4个不同区域)时。此外,如果我从一个区域跑到另一个区域,那么让敌人更难切换区域(但我已经找到了可以工作的东西......)
  • 备选方案2:每次移动x距离时,扫描整个地图并刷新活动的敌人列表。这有点好,因为我不必担心像备选方案1这样的大量界限,但我每次都必须扫描整个地图。

我现在正在考虑备选方案3 ,即将这两种解决方案混合在一起。

但是,我想确保没有更明显的解决方案。

3 个答案:

答案 0 :(得分:4)

将你的敌人存放在k-d tree并每隔几次迭代进行一次空间范围搜索。但是,您需要一个相当复杂的实现,它支持条目移动和重新平衡 - 有时称为自适应k-d树。

答案 1 :(得分:2)

好的,如果您能回答以下问题,我相信我们中的一些人可以帮助您找到正确的数据结构和程序。 地图有多大?实际尺寸? 告诉我们一些敌人的密度?他们平均有多少?我猜你会为每场比赛使用随机数量的敌人,或者每个级别可能会增加敌人数量。无论如何,这是什么?您计划拥有的最大敌人数量?

只有当所有角色/敌人四处移动而不是围绕主角时才会真的很好。只会让游戏真正令人兴奋。我相信你会使用大量随机数进行动作,但是试着看看你是否可以为他们的动作想出简单而逼真的算法,而不是完全依赖于随机动作。我已经随机使用了一点,他们肯定没有那么有意思。也许你可以把它们移到非常靠近主要的地方。你可以慢慢增加敌人的速度和力量。随着等级的增加,你可以增加敌人的速度和力量。尽量让它变得令人兴奋。你可以试试Caesar III游戏,看看人们的动作有多好,简单的动作但真的很好 底线是考虑你将如何移动敌人,并尽可能尝试移动每个蜱的所有敌人,使游戏真的令人兴奋。

答案 2 :(得分:0)

200x200并不大。 Foreach位置,如果它在范围内,更新敌人将工作,除非你计划在计算器上运行它,或者每秒需要1000次更新。

不要过度工程,保持简单。如果需要,只需轻松更改即可。