C++ 网络游戏?

C++ 网络游戏?,c++,network-programming,C++,Network Programming,我希望我的游戏完全是服务器端的。也就是说,客户端只发送击键。然后,服务器会向它们提供更改对象位置的更新。然后,客户端在每一帧渲染所有内容 这是一个2D游戏 我在想这样的事情: 使用Box2D计算中间帧,不要试图预测服务器实际将要运行的位置 ServerPos->ClientPos->ServerPos-> 如果到了某个特定的时间,我们还没有得到一个数据包(丢弃或其他东西),那么我们就在客户端上模拟下一帧。这样做是为了避免服务器总是纠正我们的位置。我们希望客户端填充中间层,但不要试图预测服务器将在

我希望我的游戏完全是服务器端的。也就是说,客户端只发送击键。然后,服务器会向它们提供更改对象位置的更新。然后,客户端在每一帧渲染所有内容

这是一个2D游戏

我在想这样的事情: 使用Box2D计算中间帧,不要试图预测服务器实际将要运行的位置

ServerPos->ClientPos->ServerPos->

如果到了某个特定的时间,我们还没有得到一个数据包(丢弃或其他东西),那么我们就在客户端上模拟下一帧。这样做是为了避免服务器总是纠正我们的位置。我们希望客户端填充中间层,但不要试图预测服务器将在哪里

我们希望不惜一切代价避免将播放器向相反方向移动,因为客户端过度模拟,因此我们可以将结果向量乘以标量,如0.98,这意味着客户端将比服务器稍慢,并有助于确保平滑过渡到服务器位置


谢谢

只是想一想,但我想你可能忘记了网络延迟

假设您确实每秒发送60次数据以响应客户端发送的内容。您的最大延迟可以是
1秒/60=17ms
。这对于任何internet连接都是一个问题,因为您的应用程序必然会引入一些延迟。所以如果你想让这样的东西工作,你必须有一个小的缓冲窗口来捕捉这个延迟。这会让它感觉不那么灵敏

有一个原因是,大多数在线游戏都有一些预测算法,以防连接下降/暂停

我认为这个主意不错,但实际上可能不会那么好用。


如果你在服务器端控制一切,网络延迟将使游戏无法运行。你只需要看一个已经这样做的游戏,比如。输入延迟非常可怕。

这将并且只能在LAN上工作,或者在某些低跳服务器到客户端的连接上例外。尝试跟踪某个公共服务器-以下是一个示例:

C:\Users\mosh>tracert -d -w 3000 www.google.com

Tracing route to www.l.google.com [209.85.149.104]
over a maximum of 30 hops:

 1    46 ms    99 ms    99 ms  192.168.1.1
 2     *        *        *     Request timed out.
 3    10 ms     9 ms    10 ms  172.29.16.133
 4    10 ms     9 ms    10 ms  195.29.110.230
 5    41 ms    41 ms    95 ms  80.81.193.108
 6    46 ms    47 ms   127 ms  209.85.255.176
 7    49 ms    47 ms    47 ms  216.239.48.11
 8    47 ms    47 ms    47 ms  216.239.48.5
 9    54 ms    53 ms    54 ms  209.85.254.21
10    51 ms    42 ms    40 ms  209.85.149.104

Trace complete.

服务器和客户端之间的每台路由器都会增加几毫秒,根据17ms(一帧)的延迟,游戏将无法使用。

尽可能少地同步。每秒60次太多,也没有必要。对于局域网,每100ms同步一次就足够了;对于广域网,每200ms一次是正常情况


你在做什么样的游戏?对于不同的游戏,政策是非常不同的。您可能需要为游戏自定义同步策略。

您不能这样做,因为您不知道按键到达服务器需要多长时间。鉴于物理会随着时间的推移改变对象的状态,不可预测的时间方面意味着您无法保证服务器的表示将继续与客户端的表示相匹配。一方必须具有权威性——另一方必须预测、等待,或者两者兼而有之。

+1——打败我=)我说的几乎是一样的话,但却是倒退的lol。@Milo——我特别同意延迟是你这里的主要敌人的观点,而不是带宽或服务器/客户端能够处理它。@Milo--请记住:如果我们假设数据以光速传输,那么地球上从A到B的最长通信线路所能达到的最佳延迟是66毫秒--这是非常有限的+我也赢了。我打算建议从客户机到服务器ping*,这将给您一个无法超过的硬fps限制。此外,您忽略了UDP丢弃数据包的问题,或者TCP变得拥挤和滞后,因为您突然一次获得了最后10秒的数据包编辑添加:我想你可以做一些预测性的工作,并在未来一段时间内发送所有可能性。但是你很快就开始谈论一些严肃的带宽问题了!嗯,经过深思熟虑,我想你可能会有一个很长的延迟,从有人点击到它生效。您可以每秒发送60帧,即使鼠标/键盘单击的响应时间为0.25到0.5秒。。。但是游戏。。。可玩性。。。哎哟使用Box2D制作2D沙盒游戏Physics@Milo-看看这个