【问题标题】:Multiple socket 'handshaking' in UDP network using SFML C++ libraries使用 SFML C++ 库的 UDP 网络中的多个套接字“握手”
【发布时间】:2015-05-04 17:25:48
【问题描述】:

我正在使用 SFML 库编写具有 UDP 协议的实时网络程序。服务器将处理所有处理,向客户端发送数据包,反之亦然。

我需要一个同步屏幕更新的方法,因为网络两端都会有一个实时的用户界面。我的想法是,我会让客户端和服务器打开两个端口,一个用于发送数据包,另一个作为“验证”端口。

一旦更新完成并验证,两个循环都将通过网络发送一个字节,表明他们的一方已经“准备好”。一旦“就绪”端接收到该字节,它将知道屏幕已准备好在两侧更新,然后呈现更新。

我的问题是,我将如何使用 SFML 库在 C++ 中执行此操作。逻辑是否正确,会不会遇到网络错误等问题。

如果有任何需要清理的地方,请发表评论。

【问题讨论】:

标签: c++ sockets network-programming udp sfml


【解决方案1】:

您应该阅读该主题以了解其实际工作原理,例如 How do the protocols of real time strategy games such as Starcraft and Age of Empires look?

在 SFML 方面没有什么具体要知道的,因为该理论适用于每种编程语言(使用套接字)。而且您还没有提供您正在努力解决的代码,所以如果没有Minimal, Complete, and Verifiable example,我将无能为力。

但我要说的一件事是永远不要在网络上等待渲染。这将非常滞后,如果您想要“实时”,则必须在没有真正“实时”的情况下模拟它,因为网络总会存在延迟。

如果您使用 UDP,您别无选择,只能打开 2 个端口,一个在服务器上,一个在客户端上。但我反对使用 "confirmation" 端口,因为这是无用的,因为无论如何你都会每秒发送多次。

how to use sockets with SFML。我想您已经知道这一点,但它可能对来自 google 的人有用。

请参阅SFML networking rts,它比我更好地解释了该怎么做。

来自@muhwu

一般来说,如果您要玩具有时间关键元素的实时游戏,您应该将玩家发出的命令稍微放在未来,以补偿延迟。这最多可能是几百毫秒。

来自@sean-middleditch

还请注意,许多文章确实已经过时了。例如,TCP 是在 RTS 等游戏中联网的完美选择,尤其是在锁步联网的情况下,甚至是许多小型 MMO 的首选协议。尽管如此,几乎所有关于网络的文章都是关于构建自定义 UDP 协议的。

说到gamedev.stackexchange.com,您可能想阅读问题和答案,如果没有帮助,请在那里提问。


在 SO 上询问 the same question 可能不是正确的方法,因为您的问题太宽泛而且已经回答了很多次(就像我链接的第一个问题一样)。 p>

【讨论】:

    猜你喜欢
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 2015-02-22
    相关资源
    最近更新 更多