【问题标题】:GameServer World Management [closed]GameServer世界管理[关闭]
【发布时间】:2018-05-13 14:51:05
【问题描述】:

我正在用 Java 创建一个 2D 游戏。这个世界是基于多维数组的瓦片,我有服务器-客户端系统的架构。 与客户端的用户/连接是多线程的。

现在我的问题是: 我的客户应该向服务器发送请求以在他的视图范围内询问当前的世界状态(带有实体等),还是应该在我的连接/用户类中创建另一个线程,只是为了在每个 servertick 发送世界数据? 还是有更好的解决方案来发送/请求他的实体的世界?

感谢您的帮助;)

【问题讨论】:

  • 我相信您做出的任何决定都取决于您未与我们分享的因素,例如玩家数量、延迟要求、游戏类型等。但是,一种常见的方法是让客户端请求其自身周围的地图信息,服务器在此类信息出现时将更改和重要数据推送给客户端。
  • 游戏的实时性如何?如果它是一个棋盘游戏,那么一旦有人移动,服务器就发送数据可能是有意义的。如果它是一个具有同时动作的实时策略,它可能会更好地与服务器在每个滴答声中发送数据
  • 另外,“我也创建了包”是什么意思?你是说网络数据包吗?
  • 是的,我的意思是服务器包。我想要一种 mmorpg,它需要实时和更少的延迟
  • 定义“mmorpg”,如果它是 RotMG 之类的东西,mmorpg 子弹地狱,你需要它比 WoW/RuneScape 之类的东西响应更快(更好的例子:Travian)我>。如果您对您想要做的事情和游戏类型更具描述性,那么我们可以更具描述性和帮助

标签: java multithreading server


【解决方案1】:

在游戏中,您通常不想信任客户端。服务器的话就是法律,客户端应该很少依赖它们。

我的客户端是否应该向服务器发送请求以询问当前的世界状态

可能不会,因为客户端不知道什么时候有更新的信息

服务器知道什么时候更新以及提供什么信息,服务器在需要时向客户端发送数据会更有意义


关于发送数据的频率,只要客户端视图中的某些内容发生变化(来自客户端操作或只是移动的内容)就发送数据

这可能经常出现在快节奏的游戏中(例如子弹地狱),或者在慢节奏的游戏中(例如棋盘游戏)较少发生

【讨论】:

  • 所以如果玩家视口中的某些内容发生了变化,我必须检查每个滴答声,并在需要时在他的视口中发送新的世界状态?还是我应该只发送更新(前玩家 123 移动到 2123|312)?这将导致如果许多玩家移动或攻击它必须发送大量数据包...
  • 在这种情况下,按计划更新可能会更好,因此如果有延迟,客户端可以检测到它。在这样的游戏中,客户端视图中几乎没有任何变化(包括生命值恢复、效果计时器......它们应该在客户端上模拟,但与服务器同步)
猜你喜欢
  • 2011-01-15
  • 1970-01-01
  • 2012-03-21
  • 2011-12-29
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
相关资源
最近更新 更多