首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为在线多人游戏构造服务器

为在线多人游戏构造服务器
EN

Stack Overflow用户
提问于 2014-06-25 20:18:36
回答 1查看 1.2K关注 0票数 0

我在做一个在线多人游戏。我已经为任何持久存储开发了登录服务器和数据库;它们都是用Python编写的,并将与Google的App一起托管。(就目前而言)

我对两种语言比较满意- Java和Python。我想用其中一种语言编写实际的游戏服务器,我希望客户端到游戏服务器连接的延迟尽可能低,所以我假设大多数游戏数据(例如,精细的玩家移动)都需要通过UDP连接发送。我不熟悉UDP连接,所以我真的不知道从哪里开始设计服务器。

服务器应该如何线程化?保留会话信息的每个客户端连接一个线程,然后一个单独的线程来控制自主的世界变化(NPC移动等等)?

如何传输相对较大的数据包?(例如,附近的25名玩家和他们所有的游戏数据、用户名等)TCP还是UDP?

最后-游戏服务器通过HTTP请求与登录服务器接口安全吗?我如何(从登录服务器的角度)验证游戏服务器的身份-简单密码、加密?

我不想问这样的问题,因为我知道它们通常被标记为没有效率--哪种语言更适合我(作为一个缺乏套接字经验的人)来编写一台足够高效的服务器--假设两者都有相同的经验?

最后--如果这是相关的--我还没有开始在客户端上进行开发--我还不确定我对游戏本身的目标是什么,我只想让服务器具有可伸缩性(超过150名玩家,除此之外,我预计并理解重大重写可能是必要的),并且能够支持相当数量的玩家和开放世界风格的内容。(没有对服务器征税的物理或类似的东西)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-25 21:35:41

“我认为大部分游戏数据(例如,优秀的玩家动作)都需要通过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...if,您还没有读过关于Global解释器锁的一些需要考虑的内容,我会确保这样做。由于GIL,Python在多线程处理方面可能非常无效,除非您调用本机库。您可以使用多进程来绕过它,但随后您必须处理进程之间的通信开销。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24417793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档