为在线多人游戏构建服务器结构
我正在开发一个在线多人游戏。目前我已经搭建好了登录服务器和数据库,用来存储一些持久性的数据;这两个部分都是用Python写的,暂时会托管在谷歌的App Engine上。
我对Java和Python这两种语言比较熟悉。我想用其中一种语言来写游戏的实际服务器,并且希望客户端和游戏服务器之间的连接延迟尽可能低,所以我认为大部分游戏数据(比如玩家的细微动作)需要通过UDP连接来发送。但我对UDP连接不太了解,所以不知道从哪里开始设计服务器。
服务器应该如何进行多线程处理呢?是每个客户端连接一个线程来保持会话信息,然后再用一个或多个线程来控制自动的世界变化(比如NPC移动等)吗?
相对较大的数据包应该如何传输?(比如大约25个附近的玩家及他们的游戏数据、用户名等)应该用TCP还是UDP?
最后,游戏服务器通过HTTP请求与登录服务器进行交互是否安全?我该如何验证(从登录服务器的角度)游戏服务器的身份——用简单的密码,还是加密方式?
我不想问这种问题,因为我知道这类问题通常会被认为不太有建设性——对于我这个对socket编程不太熟悉的人来说,哪种语言更适合写一个足够高效的服务器呢?假设我对这两种语言的经验是相等的。
最后,如果这有关系的话——我还没有开始开发客户端——我还不确定游戏的具体目标是什么,我只是想让服务器能够扩展(最多支持大约150个玩家,超过这个数量我预计可能需要进行重大重写),并且能够支持一定数量的玩家和开放世界风格的内容。(不需要处理复杂的物理效果等)
1 个回答
“我认为大部分游戏数据(比如玩家的细微动作)需要通过UDP连接发送。我对UDP连接不太了解,所以不知道从哪里开始设计服务器。”
UDP连接可以更快,但在游戏中,有时候更重要的是数据包不能丢失。如果你想知道,魔兽世界使用的是TCP。如果你选择使用UDP,就需要想办法处理丢失的数据包。否则,如果玩家使用了一个重要的技能(比如打断法术或治疗),结果数据包丢了,那就麻烦了。你可以同时使用UDP和TCP来传输不同的信息,但这样会增加很多复杂性。魔兽世界只用一个端口来处理所有游戏流量,还有一个UDP端口用于游戏内的语音聊天,但实际上没人用。
“服务器应该如何进行多线程处理?每个客户端连接一个线程来保持会话信息,然后再用一个或多个线程来控制自动的世界变化(比如NPC移动等)?”
每个客户端连接一个线程可能会导致线程数量很多,但如果你使用同步套接字,这样做是必要的。我不太确定这个问题的最佳答案是什么。
“相对较大的数据包应该如何传输?(比如大约25个附近的玩家及他们的游戏数据、用户名等)使用TCP还是UDP?”
这就是为什么MMORPG服务器对CPU和带宽要求很高的原因。每个动作都需要传递给可能几十个玩家,甚至几百个玩家。如果游戏规模扩大,这就成了一个扩展性的问题,而不是TCP和UDP之间的选择。老实说,除非你的游戏火了,真的出现了问题,否则我不会太担心这个。
“最后,游戏服务器通过HTTP请求与登录服务器交互是否安全?我该如何验证(从登录服务器的角度)游戏服务器的身份——简单的密码,还是加密?”
你可以很容易地使用SSL来处理这个问题。
“最后,如果这有关系的话——我还没有开始开发客户端——不确定我对游戏本身的目标是什么,我只想让服务器可扩展(最多支持150个玩家,超过这个我预期并理解可能需要进行重大重写),并能够支持相当数量的玩家和开放世界风格的内容。(不需要什么消耗服务器资源的物理效果)”
我不会用Python来做你的服务器。它非常慢,扩展性也不好。对于延迟不是太重要的网页服务器和应用程序来说,Python还可以,但对于一个需要处理100多个玩家的实时游戏服务器,我想它会崩溃。Java可以用,但即使是Java在扩展性方面也会遇到问题,远不如用原生代码写的服务器好。我建议用Java快速原型开发游戏并让它运行起来,然后再考虑用C/C++重写以提高速度。
另外,关于Python还有一点要考虑……如果你还没了解全局解释器锁(GIL),我建议你去看看。由于GIL的存在,Python在多线程方面可能效率很低,除非你调用的是本地库。你可以通过多进程来绕过这个问题,但那样你就得处理进程间通信的开销。