Tri*_*mix 2 java sockets data-representation
我正在用java制作游戏,而且进展顺利.我想尽早实现多人游戏,所以我建立在它上面而不是将整个游戏移植到多玩家时,它有很多不同的功能..我想把它变成一个客户端/服务器应用程序.现在我现在确定如何或如何实现多人游戏.我已经阅读了有关套接字和所有内容的java教程,我测试了它们并成功建立了连接(在测试项目中).我不知道从哪里开始.我不知道如何转移例如不同的玩家在地图上的地方,或者甚至只是有任何玩家...我不知道是否使用图书馆或自己做或者做什么......如果有人可以请你给我一些关于如何通过TCP连接传输播放器数据或类似内容的指南,或者可以给我一个使其更简单的库...
这是一个非常广泛的问题,有多种方法可以做,但这是我的看法.免责声明:我是移动多人游戏公司的服务器系统架构师.我不认为自己对这些事情的专家,但我确实有一些都因我的工作和爱好(我写的,在2004年支持高达255级的玩家我的第一个"MMORPG")的经验,觉得我可以捅你在正确的方向.对于这里的大多数概念,我仍然建议你使用Google,Stackoveflow等进行进一步的研究,这只是我对游戏网络所需内容的"10000英尺视图".
根据您正在制作的游戏类型(想想像第一人称射击游戏和像国际象棋这样的回合制游戏等实时游戏),底层传输层协议选择很重要.像Matzi建议的那样,UDP为您提供了更低的延迟(以及更低的数据包开销,因为标头小于TCP),但在不利方面,数据包到目的地的传递永远不会得到保证,即.您永远无法确定您发送的数据是否实际到达客户端,或者,如果您在一行中发送了多个数据包,则数据是否按正确顺序到达.您可以通过确认有独立的消息到达的数据(虽然再次,如果确认使用UDP,他们也丢失)和处理一些额外的数据的顺序实行"可靠的UDP" - 协议,但随后你(在至少部分地)失去较低的延迟和较低的开销.另一方面,TCP保证数据的传递并且订单保持正确,但由于数据包确认和开销(TCP数据包具有更大的报头)而具有更高的延迟.你可以说UDP数据包有点像"独立的实体",而TCP是一个连续的,不间断的流(你需要一些方法来区分一条消息的结束和另一条消息的开始).
有两种游戏同时使用; 单独的TCP连接,用于绝对必须进入客户端的重要数据,如玩家死亡等,以及另一个用于"火与忘记"类型数据的UDP连接,如播放器的当前位置(如果位置确实如此)没有到达另一个客户端,并且播放器正在移动,再次发送数据没有太大意义,因为它可能已经过时了,并且会在短时间内进行另一次更新).
在为传输选择UDP和/或TCP之后,您可能仍需要一个自定义协议,对TCP/UDP数据包移动的数据("有效负载")进行编码和解码.对于游戏,显而易见的选择是一些二进制协议(与基于文本的协议,如HTTP).简单的二进制协议可以例如标记消息中包含的总字节数,然后标记数据类型,数据字段长度和字段的实际数据(重复每个消息的字段数).这可能有点棘手,所以至少对于初学者来说,你可以使用像序列化和反序列化你的消息对象之类的东西,然后查看已有的协议或自己做饭(这真的不那么难).当您获得基本数据类型(如字符串,整数,浮点数......)的编码和解码工作以及一些数据移动时,您需要设计自己的高级协议,这实际上是您的游戏和服务器的消息用来互相交谈.这些消息是"玩家加入游戏","玩家离开游戏","玩家在这个位置,面对那里并以此速度移动","玩家死亡","玩家发送聊天消息"等.
在实时游戏中,你有一些其他的挑战也一样,预测球员的位置(记住,客户端发送的数据很容易被几百毫秒前,当它到达另一个玩家的客户端,所以你需要"猜测",其中玩家在抵达时).尝试使用Google的东西,如"游戏航位推测法"和"网络游戏预测"等,还Gamasutra上有着相当不错的文章:航位推算:对于网络游戏的延迟隐藏,有可能是其他的负载被发现.
您需要考虑的另一件事是服务器端代码的并发性.很多人会使用本地POSIX线程库(NPTL告诉你,你需要使用Java NIO实现良好的性能和使用线程每个连接是坏的,但实际上至少在Linux上,几乎任何现代的Linux分布将有出来的盒子),情况是相反的,供参考,参见下文:编写Java多线程服务器 - 什么是旧的.我们的服务器运行10k +线程,有数千个用户而不是窒息(当然,在任何给定时间,绝大多数线程都将处于休眠状态,等待客户端消息或消息发送给客户端).
最后,您需要测量游戏所需的计算能力和带宽.为此,您需要测量某个(服务器?)硬件可以对您的软件承担多少负载以及您的游戏导致的流量.这对于确定您可以使用服务器支持多少客户端以及您需要多快的网络连接(以及每月多少流量配额)非常重要.
希望这有助于回答您的一些问题.
| 归档时间: |
|
| 查看次数: |
1772 次 |
| 最近记录: |