解决方法
一,TCP或UDP?如果你不知道这些东西是什么,请阅读它们,因为我没有空间在这里给出一个很好的破坏,但是你的选择知道如下:
TCP对于基于回合的游戏或游戏来说是好的,因为高延迟通常是可以的,因为TCP保证数据包传送,所以可能需要一些时间才能重新发送丢弃的数据包.这对于像国际象棋这样的事情或其他任何事情都是有益的.
> UDP对于你不一定关心消息可靠性的游戏是有好处的,并且更喜欢数据只是继续发送,如果你错过了一些东西,哦.这对于基于实时操作的游戏(例如HALO:Reach或使命召唤)来说是有益的.在这些中,如果发送对象的位置,并且对象永远不会在那里,最好发送一个新的位置,而不是重新发送一个旧位置(现在更老),所以一直保证可靠性并不重要.也就是说,你必须有一定的可靠性,所以你仍然需要某些事情来保证交付,如对象创建和对象销毁.这意味着您需要在UDP之上实现自己的半可靠,基于优先级的协议.这是困难的.
所以,问自己什么是重要的,了解TCP和UDP如何工作,然后做出明智的选择.
也就是说,现在您必须通过网络同步对象状态.这意味着您的对象需要序列化为可以在字节流中表示并写入套接字的内容.写入插座很容易;如果你可以写一个文件,你可以写一个套接字,这真的不难.重要的是确保您能够将对象表示为缓冲区,因此如果对象具有对其他对象的引用/指针,那么您将无法发送这些指针,因为它们在其他客户端上不同,所以你必须将它们转换成所有主机通用的东西.这意味着ID,尽管对象的ID在所有主机中必须是唯一的,因此您必须有一种方法来在主机之间进行协调,以使两个主机不会创建具有相同ID的不同对象.有办法处理这样做的主机,但我们不用担心这个(提示:使用主机的ID和网络ID之间的某种映射.更大的提示:不要这样做,如果你不需要).
那么现在你可以发送数据,好了,现在呢?每当游戏状态发生变化时,您必须以其他方式向其他机器发送更新.这是客户端 – 服务器体系结构所在的地方,如果需要,也可以是对等的.客户端 – 服务器更容易实现.此外,一个主机“代理”作为服务器仍然是客户端 – 服务器,任何说不同的人是错误的.
所以,服务器的责任是“拥有”所有的游戏状态.只有服务器可以肯定地说出一个对象的状态.如果你想移动一个对象,你告诉服务器你想移动,然而服务器然后告诉你你应该移动对象,你不只是做(虽然某种客户端预测通常是有用的).因此,服务器将更新的对象状态发送到所有其他主机.
所以,你提到了一个回合制的游戏吧?很简单:
>您将要彻底解决目前转向的客户端.一旦该客户端执行了他们想做的事情,将该转发的结果发送到服务器.然后,服务器验证客户端的移动(不要仅仅信任客户端,以这种方式发生作弊),并将它们应用到其对象状态.
>一旦服务器是最新的,它将向世界上新的状态的其他客户端发送消息,并且这些客户端应用这些更新.这包括刚刚轮到的客户;该客户端只应在服务器通知时更新其世界状态,因为您希望确保与其他主机的一致性,并且您希望防止主机作弊.
>然后,服务器发出一条消息,指示它是谁的转弯.您可以在上一步中的世界状态更新的同时发送,这将是正常的.只要知道客户尝试不合时宜.这就是为什么服务器对世界有权威的原因;如果客户端尝试欺骗,服务器可能会把它们打倒.
这就是你需要做的一个回合制游戏.提示:使用TCP
更大的提示:TCP实现了一种名为“Nagle’s Algorithm”的工具,它将您的消息组合成一个数据包.这意味着如果您发送两个单独的消息与两个单独的“发送”调用,其他主机可能只接收一个数据包单一呼叫“接收”,但该数据包将包含BOTH的内容发送的数据包.因此,如果您发送两个100字节数据包,并发送两个呼叫,则可以在单个呼叫中收到一个200字节的数据包.这是正常的,所以你需要能够处理这个不知何故.一个诀窍是使每个单个数据包的大小相同,然后在每次检查输入时只从套接字读取多个字节.请记住,您也可以获得部分消息.例如,如果发送两个100字节的消息,它们可以组合成一个200字节的消息.接下来,如果从另一端的套接字读取,但是您读取的缓冲区大小为150字节,则将有150个字节,其中包含第一个数据包,第二个数据包的一部分.您必须再次拨打电话才能获得第二条消息的其余部分,因此请保持跟踪您收到的数据量,以免丢失某个数据包的某个部分.这就是为什么保持你的数据包相同的大小是有用的.
还有一些其他有用的技巧可以减少您的邮件的大小和频率,并跟踪不是基于回合的游戏,并且实时执行,但是如果您有一个基于回合制的游戏,那么正确的事情做大概是使用TCP,而不用担心任何其他的东西.这里有一些链接到有用的网站和文章,将为您提供有关如何完成游戏网络编程的更多信息:
http://www.gafferongames.com/ Glenn Fiedler的网站,这里有一些很好的信息.
1500 archers关于如何实现一个称为确定性锁步的技术的伟大论文,这对许多类型的游戏是有用的.
让我知道,如果你想要更多的细节,任何这些东西,或者如果你有更多的具体问题.