多人空间分割的有效解决方案?


10

这个问题有点棘手,但我会尽力弄清楚。

可以说我正在构建一个在线游戏(不是MMO规模),但是通过权威的服务器方法可以支持尽可能多的玩家。我想真正的与世界很多 AI模拟敌人。

我知道一些通过细分空间而不处理不需要处理的东西来节省服务器CPU的策略。我已经按地区划分了世界,这需要加载时间和较小的过渡时间,我认为这对于保持本地(单独或什至有几个朋友)玩游戏时的游戏质量至关重要。我不希望球员出现在一个或两个以上的地区。

问题在于,一个区域可能会变得很大,并且一次模拟了很多NPC。在不影响玩家体验的情况下如何处理?表格中没有像每个区域一台服务器之类的方法。

我主要是在寻找能够容纳成群的敌人,甚至是和平的NPC的数据结构。要最终确定问题,请注意,由于存在车辆,因此车辆在某个区域内的行驶速度相当快,会影响“何时”驶向剔除区域。


您是否仅限于一台物理服务器?
Patrick Hughes

最终,没有。但是出于简单性和可实现性的考虑,就目前而言,我无法使该项目更加复杂:)
Grimshaw 2012年

从简单开始。像《魔兽世界》这样的东西确实在每个“服务器”的多个物理盒子上运行,只是将它们的世界划分为一个网格,所有更新都基于与您位于同一盒子中的用户。非常简单,易于调整,运作良好,您只需要一个盒子就可以使用它来控制处理。
Patrick Hughes 2012年

我完全同意您的观点,也许我错过了我的问题。如果框的单元格的最右边有一个玩家,而右侧相邻单元格的最左端有另一个玩家怎么办?他们应该见面!世界一直在寻找类似《魔兽世界》这样的游戏。这是我不明白的,如何建立一个连续的世界网格,同时又保持其效率?当然,在某些情况下,来自两个“服务器”的玩家应该互相见面:)
Grimshaw 2012年

1
是的,如果您要拥有很多东西,并且您周围有很多玩家,则确实必须计划一切都可以随时随地活跃起来,这没有什么神奇的办法。这就是为什么MMO服务器组中的单个盒子最多只能服务200-500个玩家的原因,以及NPC的MMO AI可悲的愚蠢(又名便宜)。
Patrick Hughes

Answers:


5

据我了解,您的服务器上将运行某种物理过程。

如果是这种情况,除了空间分区之外,还有其他一些可用于AI /物理的技术。从最不明显:

  • 优先级:不与玩家直接互动的NPC可以通过降低其刷新率来减少CPU时间。您可以使用优先级队列,并从头到尾运行具有更高优先级的队列,而其他队列每个周期仅运行队列的1 / 2、1 / 4或1/8。这样,您可以确保每个对象都在某个时刻运行,但可以减少它消耗CPU的次数。
  • 物理性也可以降低(在漫游和远离视线时只能使用碰撞盒和球体)。
  • 通过将非常基本的行为分配给玩家远离的NPC和环境,简化AI /模拟。通常它会漫游或扫描敌人,而不是狩猎,聚集,耕种...
  • 一些物理和人工智能也可以委托给客户。如果服务器上确实缺乏CPU,则可以将对象标记为已部分解析,客户端将在本地调整这些对象的物理状态和位置(以避免浮动NPC)。可以给客户端运行AI的责任(在与玩家战斗期间,目标玩家的设备可以直接运行攻击的NPC)
  • 对于玩家而言,物理性能也可以降低到服务器上,客户端将在冲突解决方面承担更多责任。例如:您用车辆撞到一个物体,服务器将仅解决碰撞盒上的碰撞并将该物体标记为潜在碰撞。客户端会将带有时间戳的分辨率发送给服务器,如果标记了对象并且解决方案看起来正确,则时间戳将接受该分辨率。

一旦实现了这些机制,就可以决定需要多少和多少频率。这样做的好处在于,以后您可以添加一些服务器,这些服务器将能够代替客户端应用程序来接管某些任务。

当然,近似的碰撞检测会产生一些像差,但是您可以通过不时增加更高的精度来解决它们。

另外,如果您可以访问支持任一GPGPU系统的库,那么这些库应支持OpenGP或CUDA之类的GPGPU系统。


我需要的是将区域的空间划分与优先级更新结合在一起,对于少量的播放器来说是最佳的,并且在加载许多区域时仍然可以进行优化。谢谢。
Grimshaw 2012年

@DevilWithin应该会有所帮助,并且不需要在客户端进行任何更改。我还为答案添加了更多细节。
郊狼2012年

简化的AI是一个很棒的主意。尽管NPC距离玩家还很遥远,但除了在大多数情况下移动外,他们不需要做任何其他事情。这意味着我只需要大概每1分钟或大约1分钟就可以知道它们的状态,就可以使它们在世界范围内漫游。
Grimshaw 2012年
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.