Diyabya Asked:2024-02-20 18:49:44 +0800 CST2024-02-20 18:49:44 +0800 CST 2024-02-20 18:49:44 +0800 CST 网络游戏中如何移动? 772 我对Unity内部运动过程的理解: FixUpdate 中的更新频率太低,无法显示平滑的图像,因此在 Update 中移动角色更有意义。 我们在其中一个 FixUpdate 调用中将输入发送到服务器。服务器处理传入的输入,将玩家移动 1 传统米。但由于服务器和客户端更新频率的差异,客户端会将其角色进一步移动7个常规米(这个数字取决于网络质量和处理器的负载)。 问题的本质 我的推理哪里有错误?由于《战争雷霆》和《坦克世界》的更新率只有 20-30 赫兹,它们在网络游戏中实际上是如何移动的? unity3d 1 个回答 Voted Best Answer Maxgmer 2024-02-20T19:39:47+08:002024-02-20T19:39:47+08:00 是的,服务器有 FPS(图表上的 Update())和刻度率(类似于固定更新),这种情况比较罕见。 让我纠正一些说法: 服务器处理传入的输入,将玩家移动 1 传统米。但由于服务器和客户端更新频率的差异,客户端会将其角色进一步移动7常规米 这种说法是不正确的,因为。所有的运动都会逐帧乘以时间。假设 Update() 之间的时间为 0.25 秒,FixedUpdate() 之间的时间为 1 秒。如果速度是每秒1米,那么每次Update()都会让角色移动1 * 0.25米,每次FixedUpdate()会让角色每秒移动1 * 1米。4 Update() 将执行与 1 FixUpdate() 相同的操作。但尽管如此,如果在客户端上的移动是在 Update() 中,而在服务器上的移动是在 FixUpdate() 中,则会出现小的、不断累积的差异,所以我们继续阅读。 FixUpdate 中的更新频率太低,无法显示平滑的图像,因此在 Update 中移动角色更有意义。 这个猜测是合乎逻辑的,但事实并非如此)。移动实际上发生在服务器和客户端上的 FixUpdate() 中,但移动的对象不会以任何方式绘制在屏幕上。相反,客户端上有一个单独的“图形对象”,它平滑地跟随跳跃的“真实”对象。在这里,它在 Update() 中更新得更频繁,从而产生平滑的错觉。 一个答案不可能包含所有同步细节;您需要阅读相关文章,但要抓住问题的本质: 滴答率 20-30 Hz 是很多,而不是“仅此而已”:) 是的,在 20 Hz 滴答率下,可能会有长达 50 毫秒的输入延迟(平均约为 25 毫秒),但这非常明显。由于我上面提到的 Update() 中的插值,视觉上一切看起来都非常平滑,因此很难注意到 1-50 毫秒的输入延迟。
是的,服务器有 FPS(图表上的 Update())和刻度率(类似于固定更新),这种情况比较罕见。
让我纠正一些说法:
这种说法是不正确的,因为。所有的运动都会逐帧乘以时间。假设 Update() 之间的时间为 0.25 秒,FixedUpdate() 之间的时间为 1 秒。如果速度是每秒1米,那么每次Update()都会让角色移动1 * 0.25米,每次FixedUpdate()会让角色每秒移动1 * 1米。4 Update() 将执行与 1 FixUpdate() 相同的操作。但尽管如此,如果在客户端上的移动是在 Update() 中,而在服务器上的移动是在 FixUpdate() 中,则会出现小的、不断累积的差异,所以我们继续阅读。
这个猜测是合乎逻辑的,但事实并非如此)。移动实际上发生在服务器和客户端上的 FixUpdate() 中,但移动的对象不会以任何方式绘制在屏幕上。相反,客户端上有一个单独的“图形对象”,它平滑地跟随跳跃的“真实”对象。在这里,它在 Update() 中更新得更频繁,从而产生平滑的错觉。
一个答案不可能包含所有同步细节;您需要阅读相关文章,但要抓住问题的本质:
滴答率 20-30 Hz 是很多,而不是“仅此而已”:)
是的,在 20 Hz 滴答率下,可能会有长达 50 毫秒的输入延迟(平均约为 25 毫秒),但这非常明显。由于我上面提到的 Update() 中的插值,视觉上一切看起来都非常平滑,因此很难注意到 1-50 毫秒的输入延迟。