c-使用SFML在实时网络上验证发送的数据包
作者:互联网
我正在构建一个可联网程序,该程序使用SFML UDP库在2D屏幕上传输图形更改.
我想在主机服务器上运行所有处理,并且仅将图形更新和命令返回值发送到客户端.
我想在将数据发送到连接两侧的屏幕之前进行验证.我当时正在考虑发送一个0或1字节来表示成功接收数据并进行同步.
(见图)
Server-------( updates )----->Client
| |
( wait for )<---( 1 or 0 )-----Send Byte
| |
( if 1 ) ( if byte received )
| |
Screen Screen
来回ping以确保在更新屏幕之前先对两端的数据进行验证,然后再运行同一事物的另一次迭代(当然是无限期地),这似乎是合乎逻辑的.
我的问题是,使用SFML,发送1/0是否有意义,还是会自行验证,即.发送数据时返回值?
另外,通过网络发送该字节比进行其他操作(例如尝试按时间同步)是否更慢?使用FPS也许有更好的方法吗?
关于SFML的答案可能是最好的.
解决方法:
如果要使用UDP模拟TCP,为什么不使用TCP?
如果您坚持使用UDP,因为性能可能很关键(即使您认为性能很关键,TCP可能会完成这项工作),则客户端应发送其命令/更改/数据,并且仅对收到的数据做出反应,永远不会打扰发送一个布尔值(或单个位),因为有更好的方法可以解决此问题,而这是整个数据包的极大浪费.
简单的方法
>如果客户端从未收到请求的特定返回值,请在给定的时间阈值后将请求重新发送到服务器,并希望达到最佳效果.
>如果客户端没有任何更改,并且服务器没有任何内容,则只需重绘屏幕(或等待客户端更改)
>如果在一个或多个重发请求后服务器没有任何响应,请将该问题告知客户端. (连接丢失或服务器错误)
在我所描述的内容中,服务器只需要响应一次来自客户端的请求,然后就可以了.
>如果服务器从未收到请求(因此也从不响应客户端),则无论如何客户端将发回其请求.
>如果服务器和客户端之间的服务器响应丢失,则客户端将在时间阈值后再次将其请求发送回服务器.
很难为您提供正确的解决方案,因为我们缺少您要实现的项目的信息.
但是,可以说这是一个游戏.
如果是游戏,简单的方法是
在游戏中,您将不信任客户端,因此玩家执行的每个命令都会发送到服务器.服务器处理命令,进行所有计算并跟踪整个游戏的所有玩家.
然后,服务器将新职位返回给客户端.客户端仅显示来自服务器的更改.例如,客户端从不通过键盘输入移动播放器.输入直接按原样发送到服务器,客户端从服务器接收一个新位置,移动指定的图形,然后渲染到屏幕.
而已.
现实世界的方式
实际上,现实世界中的游戏客户端会处理输入,并尝试在向服务器发送请求之前/期间内插更改,然后根据接收到的数据进行调整.即使没有网络通信不可避免的延迟,这也会带来没有延迟的幻觉.由于数据包由于连接不良或间歇性延迟而丢失,因此滞后仍然存在,但插值仍然有帮助.
这样,您仍然不信任客户端,只是在服务器响应之前猜测.
那么,使用TCP还是UDP?
这些策略与协议无关,因为您可以自己处理问题.
UDP
如果您要发送大量仅与发送时间相关的数据,则UDP将完成此工作.想想视频会议或语音聊天,当您丢失数据包时,将其发送回已经为时已晚.
TCP
如果您要发送适量的信息(例如每秒仅发送60次该位置),则接收顺序可能比带宽或延迟更重要,因此TCP可能是解决之道.
而且不要重复自己
如果要使用单独的服务器应用程序,则不要使其也显示在屏幕上,只需在通过本地主机连接的服务器计算机上运行另一个客户端即可.
标签:sfml,frame-rate,c,network-programming 来源: https://codeday.me/bug/20191012/1897074.html