如何在客户端/服务器实时视频游戏中处理速度更快的计算机


15

我正在使用socket.io创建我的第一个在线游戏,我希望它是像agar.io或diep.io这样的实时多人游戏。

但是我遇到了试图弄清楚如何使所有计算机以相同速度工作的问题。

我对模型有三个想法,但似乎都不对,我想知道普通电子游戏是如何做到的。(您可以跳过阅读我的想法;它们只是给您一种查看我遇到的问题的方法。)

  1. 服务器允许客户端自行运行,并将更新传递给服务器,然后服务器将其广播给其余的客户端。这样做的问题是,某些计算机的运行速度比其他计算机要快,因此它们的更新速度更快,并且在屏幕上的移动速度更快。

  2. 让服务器告诉客户端何时更新。然后,我可以等到最后一个客户端做出响应(如果一个人的计算机速度较慢,这是一个糟糕的主意),或者等到第一个客户端做出响应(再次,在每帧之前等待通信),或者尽可能快地发送它们(似乎遇到了与数字1相同的问题。

  3. 在游戏开始时,让服务器告诉客户端更新的速度。这意味着客户将负责限制这段时间之间的移动。例如,如果某人设法在该时间段内两次按下按钮,则只会发送一个按钮按下事件。这样做的问题是某些操作将被忽略(例如,按两次双键),并且交互将依赖于客户端的时钟,而这可能与服务器的时钟不匹配。然后,服务器将必须跟踪每个客户端,并确保在正确的时间提交其更新。

我已经进行了一些研究,但是我阅读的文章似乎并未具体说明如果客户端发送更新的速度比其他客户端快的话该怎么办。

在我的特定情况下,我正在与键盘速度更快的人打交道(他们的计算机比其他计算机发送更多的键盘更新)。

程序员通常如何处理呢?


1
以我的经验,他们没有。这就是存在游戏机的原因。谁付5盛大的艺术火焰的状态的那些运动员自动具有一些的优势仍然在使用一台Commodore 64
罗伯特·哈维

1
所以我的游戏将会慢一些,因为我们必须使用最低的分母进行游戏吗?似乎游戏服务器应该设置速度,这取决于客户端是否要跟上节奏,否则您将不得不落后。
JeffO

3
我可能会误解这个问题,但是您追求的是使用基于刻度的客户端和服务器模型。gamedev.stackexchange.com/questions/81608/... 基本上你只是仅过程输入和逻辑的时间每X量(通常为1 / N秒,诸如1/60为60Hz的逻辑)
克里斯托弗沃特

4
在更仔细地阅读了问题之后,您似乎过于专注于游戏的客户方面。如果您想要一个“公平”的多人游戏,那么您的服务器将必须具有权威性。这意味着客户端发生的所有事情都由服务器验证或完成。然后,您可以从此处限制事物,可能是通过上述基于刻度的系统。
Christopher Wirt,

1
啊,实时网络代码。游戏开发的最深,最黑暗的地方。欢迎来到船上,伙伴!
T. Sar-恢复莫妮卡

Answers:


8

您的第三个想法似乎与我认为是解决此类问题的行业解决方案最接近。

您所描述的通常称为Ticks。在每个刻度中,将为每个客户端依次处理固定数量的操作。通常,游戏服务器在具备能力时会执行一些并行操作,但这是一个复杂得多的问题。

滴答声很可能以1 / N秒的形式出现,N是每秒滴答声的数量,即滴答率。根据您的用例,此滴答率可能非常非常频繁或非常不频繁。我个人的建议是,除非您确定需要更多滴答声,否则应避免超过60个滴答声/秒。你可能不:)

动作应该是原子的。例如,在splither.io中,除非您击中的玩家已经采取了行动,否则诸如移动之类的动作不应立即处理破坏链条之类的事情。对于像素级别的某些东西来说,这似乎微不足道,但是如果您要处理基于图块的运动,它就会变得更加明显,并确保公平。如果玩家A移至图块X,Y,而玩家B当前位于该图块上,则必须确保到刻度线结束时,玩家B仍将位于该图块上,以便在它们之间进行任何操作。

此外,我想避免在客户端进行任何计算,除非它们在服务器端独立完成。这在物理上变得复杂且昂贵(因此,许多游戏选择的物理滴答率低于许多其他动作和事件)

作为参考,这是一个很好的链接,可以补充您自己对游戏服务器和多人游戏网络的理解。

最后,我要说的是不要让公平破坏您的服务器。如果有漏洞导致您的游戏不公平,请修复这些漏洞。如果是一台更好的计算机具有一点优势的问题,我想这可能没什么大不了的。


3
@ProQ值得注意的是,编写良好的网络代码并非易事!如果您的应用程序从一开始就不能很好地运行,并且您的网络代码似乎很烂,请不要放弃。甚至那些每天都这样做的人也有问题。就是那么难!
T. Sar-恢复莫妮卡

0

以下系统可确保所有客户端和服务器随时共享几乎相同的游戏状态。

在客户端和服务器上都具有游戏状态。

当客户端尝试使用命令(鼠标,键盘等其他输入)时,请查看其游戏状态(如果有效)。

如果是,则将命令发送到服务器,而不在发送客户端上执行该命令。

服务器收到命令后,请查看其游戏状态(如果有效)。

如果是这样,则将命令发送回所有客户端,并在服务器上执行完该命令之后,再加上确切的将来日期,然后在等于将命令发送给客户端的最短时间的延迟之后执行命令所请求的操作。 。然后记录日期,这有助于做出将来的预测。如果时间变化太大,请使您的游戏系统更具时间确定性。

当客户端从服务器收到命令时,请查看其游戏状态(如果有效),请立即执行该命令所请求的操作,然后查看当前日期并将其与收到的日期预测进行比较。如果无效,则客户端不同步。(具有类似连接的所有客户端会同时收到)

如果日期是早于日期,则在上一步中遇到问题,请解决该问题。如果日期稍晚,则不执行任何操作;如果日期很久,则客户端不同步,即客户端落后太多。

当客户端不同步时,请求服务器的整个游戏状态的副本,然后使用该副本。如果这种情况经常发生,请修复该问题,因为它比发送命令要昂贵得多。

在客户端上,仅在没有其他事情要做时才在屏幕上呈现内容。在简单的情况下,渲染功能仅将当前游戏状态作为输入。

最重要的是,您可以使用预测系统,对命令进行分组,仅渲染差异等来进行大量优化。

验证应该有所不同,例如,取决于服务器来限制命令请求/时间单位。


0

我不知道这是否是您正在使用的库或环境的问题,但是我认为您完全错误地对待它。

在绝大多数多人游戏中,只有服务器才能进行任何实际的计算。客户端只是笨拙的IO计算机,其真正的性能问题是绘制3D图形。在这种情况下,客户端可以以20或200 FPS的速度运行并不重要,因为这只会影响视觉效果。这意味着“客户端更新”绝对没有意义。客户可能会尝试“预测”服务器可能计算出的内容,但这仅仅是为了使游戏过程更加流畅,对游戏本身没有实际影响。

更快的键盘速度

我什至不知道那意味着什么。大多数人甚至无法跟上低端键盘的速度,那么这将如何影响播放器的性能?

否则,问题似乎过于笼统,您应该专注于单个实际问题,而不是试图弥补您可能根本没有的“一般”问题。


更快的键盘速度与键入无关,它与您按住“前进”键或“拍摄”键时可以发送多少个命令无关。
gbjbaanb

@gbjbaanb怎么回事?您应该只关心按下和释放的命令。您不必在乎更新的速度。
欣快的2016年

您关心是否要在客户端上处理所有类似OP的事件,因此,如果按w键使您向前走了一段距离,并且键盘的速度比其他人的键盘快,那么您的键盘处理速度也会比其他人快。您想要做的最后一件事是制作赛车游戏,您必须不断按下键才能前进!
gbjbaanb

@gbjbaanb不,那是错误的。服务器知道“玩家正在前进”,然后每1/60秒便根据所有玩家的前进来更新所有玩家的位置。这就是所有游戏的工作方式。游戏中所有实体的更新循环都是相同的,并且更新并非基于UI事件。
欣快感'16

1
不,那不是OP的理解,这就是他问的原因,也是您说“我什至不知道那意味着什么”的原因。如果您了解OP的职位,那么他的问题就很有意义。如果OP完全根据客户端发送事件的速度来编码自己的游戏,使其能够与游戏循环配合使用,那么那就是他要问的问题-将某些假设的游戏设计应用于OP实际问的问题是错误的,不管从大多数标准来看他的设计是否错误。
gbjbaanb
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.