【问题标题】:implementing a networked multiplayer game loop in twisted在扭曲中实现网络多人游戏循环
【发布时间】:2019-07-25 13:45:26
【问题描述】:

我正在开发一个游戏项目,我决定在服务器部分使用twisted。

这是一款多人射击游戏。

现在我想将一个主循环集成到游戏中(在服务器端)来处理输入和物理(用于子弹和玩家)。输入是通过 websockets 从客户端接收的。 我想让游戏循环运行游戏让我们说。 50 帧/秒。

如果我遵循in this atricle 中提到的实现游戏循环的方法。我在下面有这段代码

previous = getCurrentTime()

def loop():
    double lag = 0.0
    while True:

      current = getCurrentTime()
      elapsed = current - previous
      previous = current
      lag += elapsed

      processInput()

      while (lag >= MS_PER_UPDATE):
        update()
        lag -= MS_PER_UPDATE
      send_state_to_connected_clients()

在文章中提到:

如果您要制作在网络浏览器中运行的游戏,您几乎无法编写自己的经典游戏循环。浏览器基于事件的特性排除了它

现在我很难理解它,因为这适用于 Twisted,因为它也是基于事件的。(我认为它所说的是while true 语句将永远阻塞反应器。所以我们可以做些什么来实现我们自己的扭曲循环,因为它是基于偶数的)

在同一篇文章的底部,它提到了以下几点:

使用平台的事件循环:
1. 很简单。您不必担心编写和优化游戏的核心循环
2.它与平台配合得很好。您不必担心显式地给主机时间来处理自己的事件、缓存事件或管理平台输入模型与您的输入模型之间的阻抗不匹配。

我正在寻找的是一种在扭曲中实现游戏循环的通用方法(对于网络多人游戏)。

  • 我是否应该使用内置反应器通过LoopingCall 调用 我的Loop?那么它如何处理这些问题 文章中提到。
  • 我应该以某种方式创建自己的循环吗? (例如,通过使用线程/进程或其他一些结构来运行与反应堆分开的游戏循环)
  • 我应该以某种方式创建自己的反应器实现吗?

【问题讨论】:

标签: python twisted


【解决方案1】:

如果我准确地理解了这个问题,你将拥有一个 Python 服务器,玩家将在浏览器中播放实时 FPS。您必须:

  • 实时显示游戏
  • 在浏览器中处理用户事件
  • 将浏览器事件结果发送到服务器
  • 在服务器上解析结果
  • 向浏览器发送服务器事件
  • 在浏览器中处理服务器事件

我们已经知道您将使用 WebSockets。

实时显示游戏

您需要在某处显示图形,可能在画布内。您将需要实现许多功能,例如更新健康栏、显示更改等。这些将在您处理来自服务器的响应时触发。

在浏览器中处理用户事件

如果我们假设点击是射击、空间是激活等等,您将需要一些事件处理程序来处理这些。在浏览器中,您将需要浏览器级别的验证。比如玩家想开枪,但是没有弹药了,那么你甚至不用给服务器发消息,可能会显示枪的音效,表示开枪不成功。如果根据你浏览器中的数据你有弹药,那么你射击的方向应该被发送到服务器。

将浏览器事件结果发送到服务器

当浏览器中发生事件并被评估时,很多情况下结果会被发送到服务器,服务器会处理它们并最终向浏览器发送响应。

在服务器上解析结果

服务器将有一个事件循环,并会从玩家的浏览器接收 WebSocket 消息。例如,如果服务器接收到一个射击事件,那么它将获取玩家的当前坐标和方向,计算子弹的去向并向玩家的浏览器发送消息。如果有人被击中,则将计算伤害并确定玩家是否死亡,随后玩家将从服务器获取 WebSocket 消息,随后将显示子弹的声音以及子弹的图形显示,可能还有一些流血、摔倒的玩家等等。

向浏览器发送服务器事件

浏览器将监听来自服务器的 WebSocket 消息并处理这些消息。

在浏览器中处理服务器事件

我们不能信任用户事件,因为可能涉及一些作弊,所以当你拍摄时,浏览器会处理事件,服务器会收到消息。当服务器发送 WebSocket 消息时,浏览器会“相信”服务器发送了准确的响应。

技术需求

您将需要浏览器中的图形 API、用户事件侦听器和 WebSocket 侦听器。在服务器上,您将监听客户端 WebSocket 消息。

【讨论】:

  • 感谢您的回答,但我对所有方面都很熟悉,我的问题非常具体到为基于事件的系统实现游戏循环,在我的情况下它是扭曲的。我正在寻找扭曲提供的一些原语,以便我可以在我的服务器上实现游戏循环
  • @anekix 您可以根据需要在服务器上实现事件循环。它有线程等等。但是,事件循环问题在浏览器端。我认为如果您在服务器上有一个队列可以接收来自浏览器的事件并处理它们,那就太好了。由于 twisted 在服务器端,而您的问题在浏览器端,因此两者在不同的计算机上运行。您的服务器不必知道正在使用的浏览器,只需知道 WebSocket 消息。
  • @LajosArpand 。 twisted 有其事件循环来处理网络事件(例如,当在套接字上接收到某些数据包时)。我要问的是游戏必须有自己的循环来计算物理。它应该出现在服务器端。我没有浏览器方面的问题,我可以处理。我应该如何将我的游戏循环集成到扭曲的事件循环中是我所困惑的
  • @anekix 您创建了一个队列,当浏览器发送数据或发生某些事件时,您可以在其中推送项目。在你的永远循环中,每次你可以从队列中拉出一个项目并处理它。
  • @anekix 理解。祝您好运,实现您想要实现的集成。
猜你喜欢
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多