嗨我用Java编写了一个多人游戏,我想知道我需要学习什么和/或我应该使用什么来使游戏可以通过网络或多台计算机在互联网上播放.我真的很无知从哪里开始所以任何建议都会有所帮助,谢谢.
那些其他答案都是相当高级的,这很好,但是你不需要高级,你想要低级别,如"我如何让它实际发送数据,这意味着什么,我该怎么办发送等." 这是你做的:
首先,TCP还是UDP?如果你不知道这些是什么,请阅读它们,因为我没有足够的空间在这里给出一个好的纲要,但是你知道如下:
TCP适用于基于回合制的游戏或游戏,其中高延迟通常是可以的,因为TCP保证了数据包传输,因此可能需要一些时间来重新传递丢弃的数据包.这对象国际象棋或其他任何轮流的东西都有好处.
UDP非常适合那些你不一定关心消息可靠性的游戏,并且更喜欢数据只是不断发送,如果你错过了什么,那就好吧.这适用于基于实时动作的游戏,例如HALO:Reach或Call of Duty.在那些,如果你发送一个对象的位置,并且对象永远不会到达那里,最好发送一个新位置,而不是重新发送一个旧位置(现在甚至更旧),因此始终保证可靠性并不重要.也就是说,你必须让某些东西100%可靠,所以你仍然需要某些东西来保证交付,比如对象创建和对象破坏.这意味着您需要在UDP之上实现自己的半可靠,基于优先级的协议.这是困难的.
因此,问问自己什么是重要的,了解TCP和UDP如何工作,然后做出明智的选择.
也就是说,现在您必须在网络中同步对象状态.这意味着您的对象需要序列化为可以在字节流中表示并写入套接字的内容.写入套接字很容易; 如果你可以写一个文件,你可以写一个套接字,这真的不难.重要的是确保您能够将对象表示为缓冲区,因此如果您的对象具有指向其他对象的引用/指针,则您将无法发送这些指针,因为它们在其他客户端上是不同的,所以你必须将它们转换为所有主机通用的东西.这意味着ID,尽管对象的ID在所有主机上必须是唯一的,因此您必须有一种方法在主机之间进行协调,这样任何两台主机都不会创建具有相同ID的不同对象.有办法处理执行此操作的主机,但我们不会在此担心(提示:在主机ID和网络ID之间使用某种映射.更大的提示:如果您不需要,请不要这样做).
所以现在你可以发送数据,很好,现在是什么?每次游戏状态发生变化时,您都必须以某种方式向其他计算机发送更新.这是客户端 - 服务器体系结构的来源,或者如果您愿意,可以是点对点.Client-Server更容易实现.此外,作为服务器"主动"的一个主机仍然是客户端 - 服务器,任何说不同的人都是错误的.
因此,服务器的责任是"拥有"所有游戏状态.只有服务器可以明确地说明对象所处的状态.如果要移动对象,则告诉服务器您要移动,但是服务器会告诉您应该移动对象,而不仅仅是这样做(虽然某种客户端预测通常很有用).然后,服务器将更新的对象状态发送给所有其他主机.
所以,你提到了回合制游戏,对吧?非常简单:
您将解决目前轮到它的客户的完整转弯问题.一旦该客户端执行了他们想要执行的操作,请将该回合的结果发送到服务器.然后,服务器验证客户端的移动(不仅仅信任客户端,欺骗就是这样)并将它们应用到其对象状态.
一旦服务器是最新的,它就会向具有新状态的每个其他客户端发送消息,并且这些客户端应用这些更新.这包括刚刚轮到他们的客户; 客户端应该只在服务器告知时更新其世界状态,因为您希望确保与其他主机的一致性并且您希望防止主机作弊.
然后,服务器发出一条消息,指示它的转向.你可以在上一步中的世界状态更新的同时发送它,这没关系.请注意客户试图将他们的故障排除在外.这就是服务器拥有全世界权威的原因; 如果客户端试图作弊,服务器可以将其击败.
这就是回合制游戏所需要的全部内容.提示:使用TCP Bigger提示:TCP实现称为"Nagle算法"的东西,它将您的消息组合成一个数据包.这意味着,如果您发送两个单独的消息,并且两个单独的调用"发送",则其他主机可能在一次调用"接收"时只接收一个数据包,但该数据包将包含两个内容.已发送的数据包.因此,如果您发送两个100字节的数据包,其中有两个要发送的调用,您可以在一次调用中获得一个200字节的数据包来接收.这是正常的,所以你需要能够以某种方式处理这个问题.一个技巧是使每个数据包的大小相同,然后每次检查输入时从套接字中读取多个字节.请记住,您也可以获得部分消息.例如,如果发送两个100字节的消息,它们可以组合成一个200字节的消息.接下来,如果您从另一端的套接字读取,但是您读取的缓冲区大小为150字节,则您将拥有150个字节,其中包含第一个数据包和第二个数据包的一部分.你将不得不拨打第二个电话来接收第二条消息的剩余部分,所以保持跟踪你接收到的数据的数量,这样你就不会错过某个地方的部分数据包.这就是为什么保持您的数据包相同的大小是有用的.
还有一些其他有用的技巧可以减少你的消息的大小和频率,并跟踪那些不是回合制并且实时行动的游戏,但如果你有一个回合制游戏,那么正确的做法是do可能是使用TCP而不担心其他任何东西.以下是一些有用网站和文章的链接,这些链接将为您提供有关如何完成游戏网络编程的更多信息:
Glenn Fiedler的网站,这里有一些很棒的信息.
1500弓箭手,关于如何实现一种称为确定性锁步的技术的伟大论文,这对许多类型的游戏都很有用.
如果您想了解更多有关这些内容的详细信息,或者您有更具体的问题,请与我们联系.