我正在进行在线多人游戏。我已经为任何持久存储开发了登录服务器和数据库;两者都是用Python编写的,并将托管谷歌的App Engine。 (现在。)
我对两种语言比较熟悉 - Java和Python。我想用其中一种语言编写实际的游戏服务器,我希望客户端与游戏服务器连接的延迟尽可能低,所以我假设大多数游戏玩法数据(例如精细玩家动作)需要通过UDP连接发送。我不熟悉UDP连接,所以我真的不知道从哪里开始设计服务器。
如何对服务器进行线程化?每个客户端连接一个线程,保留会话信息,然后是一个单独的线程来控制自治世界的变化(NPC移动等)?
如何传输相对较大的数据包? (例如,约25个附近的玩家及其所有游戏玩法数据,用户名等)TCP或UDP?
最后 - 游戏服务器通过HTTP请求与登录服务器连接是安全的,我如何验证(从登录服务器的角度来看)游戏服务器的身份 - 简单密码,加密?
我不想问这样的问题,因为我知道他们通常会被标记为非生产性 - 哪种语言对我来说更好(对于没有经验的人来说,写一个足够高效的服务器) - 假设与两者平等的经历?
最后 - 如果这是相关的 - 我还没有开始在客户端开发 - 不确定我的游戏目标是什么,我只是希望服务器可扩展(最多约150名玩家,超出我的预期并且理解重大改写可能是必要的)并且能够支持相当数量的玩家和开放世界风格的内容。 (没有服务器税收物理或任何必要的东西)
答案 0 :(得分:1)
"我假设大多数游戏玩法数据(例如精细玩家 (需要)通过UDP连接发送。我不熟悉 与UDP连接,所以我真的不知道从哪里开始设计 服务器。"
UDP可以降低延迟,但有时候,在游戏中丢弃数据包更为重要。如果它对你有任何影响,魔兽世界使用TCP。如果您选择使用UDP,则必须实现某些操作来处理丢弃的数据包。否则,如果玩家使用重要技能(例如拼写中断或治疗)并且数据包被丢弃会发生什么?您可以同时使用UDP和TCP来传达不同的东西,但这会增加很多复杂性。 WoW仅为所有游戏流量使用单个端口,以及没有人实际使用的游戏内语音聊天的UDP端口。
"如何对服务器进行线程化?每个客户端连接一个线程,保留会话信息,然后是一个单独的线程来控制自治世界的变化(NPC移动等)?"
每个客户端连接一个线程最终可能会有很多线程,但如果使用同步套接字则是必需的。我不能确定最佳答案。
"如何传输相对较大的数据包? (例如,约25名附近的玩家及其所有游戏玩法数据,用户名等)TCP或UDP?"
这使得MMORPG服务器的CPU和带宽变得如此强烈。每个动作都必须转发给潜在的几十个玩家,如果扩展到那么多,可能会有数百个玩家。这更像是一个扩展问题,而不是TCP与UDP问题。说实话,我不会担心它,除非你的游戏赶上并且它实际上成了一个问题。
"最后 - 游戏服务器通过HTTP请求与登录服务器连接是安全的,我如何验证(从登录服务器的角度来看)游戏服务器的身份 - 简单密码,加密?"
您可以轻松使用SSL。
"最后 - 如果这是相关的 - 我还没有开始在客户端开发 - 不确定我的游戏目标是什么,我只是希望服务器可扩展(最多约150名玩家,超出我的预期和理解,重大改写可能是必要的)并能够支持相当数量的球员和开放世界风格的内容。 (没有服务器税收物理或任何必要的东西)"
我不会将Python用于您的服务器。它非常缓慢,并且不会很好地扩展。它适用于网络服务器和应用程序,其中延迟不是太大的问题,但对于处理100多个玩家的实时游戏服务器,我想象它会崩溃。 Java可以工作,但即使这样在本机编码的服务器之前也会遇到扩展问题。我使用Java来快速制作游戏原型并使其正常工作,然后考虑用C / C ++重写以便以后加速。
另外,有关Python的问题......如果您还没有读过Global Interpreter Lock,我一定要确保这样做。由于GIL,Python在多线程中可能非常无效,除非您正在调用本机库。您可以通过多处理来解决这个问题,但是您必须处理进程之间通信的开销。