当前位置: 首页 > 知识库问答 >
问题:

如何制作一个MMO(服务端)?

强阳曜
2023-03-14

我曾尝试搜索如何制作 MMO,但总是找到相同的回复,这是不可能的或需要很多钱,但从未给出如何制作指南。

我想构建一些非常可扩展的东西,我目前关于如何构建 MMO 的想法如下:

组件:

  • 登录服务器:客户端发送用户名

行动:

  • 登录:
    1. 客户端发送用户名
    < li >客户端在Position DB中检查他当前的位置和动作以及他附近的人(玩家和怪物),收到的数据还包括玩家的上次更新时间(装备或等级)。 < li >客户端将收到的玩家的日期与内存中保存的当前玩家进行比较,如果玩家不在内存中或日期不同,客户端将向帐户数据数据库查询lvl、gears等。 < li >客户端呈现播放器 < li >经过一段时间后,转到1。
  1. 客户端向聊天服务器发送消息(pm/normal/all)
  2. 如果为 pm,则聊天服务器将消息发送到目标
  3. 如果正常,聊天服务器会使用位置服务器检查该区域中的玩家(与主循环(客户端)相同.1 检查附近的玩家时)并将消息发送给这些玩家。
  4. 如果全部,聊天服务器将广播给所有玩家
  5. 确认发件人
  1. 客户端将动作(制作、移动、攻击等)发送到游戏服务器。
  2. 游戏服务器处理操作并使用操作的效果更新位置数据库(客户端将知道主循环操作发生了什么)。
  3. 在制作或掠夺的情况下,游戏服务器会将获得的物品返还给客户端。
  1. 检查从客户端接收到的所有数据并对其进行处理。
  2. 将进程的结果(伤害、xp、获得的物品等)发送给客户端,并使用它的效果(新位置等)更新位置数据库。
  3. 一段时间后转到1。
  1. 检查活跃的怪物是否有玩家在附近,如果没有,则将其从怪物服务器和位置数据库中移除。
  2. 检查位置数据库中的所有玩家是否有任何怪物(来自怪物数据库)并且未激活并激活它(更新位置服务器和怪物服务器)。
  3. 怪物根据存储在怪物DB上的脚本采取行动(攻击、移动、不做任何事情等)。
  4. 一段时间后转到1。

以及我的问题:

  • 这种实施方式行得通吗?(考虑到一张有很多怪物和玩家的大地图)
  • 我有一种感觉,如果事情长大了,位置数据库会有很大的压力。 如果:
    • 制作多个位置数据库
    • 创建一个链接的数据库(玩家/怪物、游戏服务器、位置数据库)
    • 创建一个链接的数据库(位置数据库,区域)
    • 因此,位置数据库基于一个区域(或多个区域),当玩家移动到另一个区域时,他的数据将移动到另一个位置数据库;最后一个数据库(位置DB,区域)将以防如果一个区域有太多玩家,则很少有位置数据库可以共享同一区域(如果区域没有很多人, 一个位置数据库可以容纳一些区域)
    • 登录服务器:scala/django
    • 游戏服务器:C语言的原始编程
    • 位置数据库:scala/django用于通信和SQL数据库
    • 帐户数据数据库:scala/django用于通信和数据库不确定是否使用NoSQL(如mongoDB)或保存在文件中的帐户(哪个更好?)
    • 聊天服务器:C语言的原始编程还是我应该尝试调整IRC服务器
    • 怪物数据库:SQL
    • 怪物服务器:类似游戏服务器
    • 日志数据库:SQL

    而且我认为我暂时没有忘记任何事情要问,并为这个大帖子感到抱歉......

共有2个答案

吴星汉
2023-03-14

克里斯蒂安是对的,你太依赖DB了。通常,游戏及其玩家的当前状态在运行时存储在实际服务器中。你可以制作一个功能,自动频繁更新玩家位置或状态的数据库,这在MMO中很常见,但最终数据库只是启动时提取数据的参考,而不是运行时。

江志业
2023-03-14

我不认为你的解决方案会扩大规模。问题是你的位置数据库需要为每一个球员动作更新。您可能使用这种方法来允许游戏服务器共享数据,这是一个坏主意,因为数据库并不意味着允许系统的分发。将数据库视为真正的离线存储,仅在玩家或对象被激活时加载状态。

您需要摆脱位置数据库并存储分布在游戏服务器中的玩家状态。

还可以考虑让前端服务器始终保持与客户端的一个连接,将消息中继到正确的游戏服务器等。这样,您可以避免客户端必须连接到“正确”的游戏服务器以及该信任级别带来的所有问题。

分布式编程相当困难,但编程语言Erlang比Python/C等更容易实现。

 类似资料:
  • 我正开始为演示游戏编写一个简单的mmo服务器。我正在使用UDP协议(UdpClient ),但我想知道,其他服务器是如何工作的?: 只有 1 个 UDP 客户端处理所有连接的客户端和消息并响应它们 服务器为每个连接的播放器创建一个新的 UDP 客户端实例? 我测试了连接50个发送“Ping”消息的客户端,服务器必须用“Pong”回复。第50个“Pong”发送大约需要10秒(在本地主机上)(同时,服

  • 我正在尝试制作最简单的REST API服务器和客户端,服务器和客户端都用Python编写并在同一台计算机上运行。 来自本教程: https://blog.miguelgrinberg.com/post/designing-a-restful-api-with-python-and-flask 我将此用于服务器: 如果我从命令行运行此命令: 我明白了: 很好,现在我的问题是,如何使用请求来编写Pyt

  • 问题内容: 我如何才能向中添加一堆类,然后再从中检索一个类(派生自,但不是),并使用它来生成实际检索到的类的新对象(即,因为那不是抽象的) 所有需要添加的类都源自同一个 抽象 基类() 我真的想不出另一种方法来实现自己的目标,所以希望这是可能的…? 问题答案: 为了防止使用反射,您可能正在寻找抽象工厂模式。这是一个简单的示例,说明如何使用Java 8实现它:

  • 我使用sw-precache生成Polymer-CLI构建过程中的服务工作,因此它旨在更新更新文件的散列,以表示需要更新缓存。但是缓存中没有替换我更新的内容,因此如果我使用ctrl-r刷新,它将获得旧版本,但如果使用ctrl-shift-r刷新,它将获得新版本。原因可能是我的服务人员没有更新。 这份文件说 如果与当前相比,服务辅助程序文件中甚至有一个字节的差异,它就认为它是新的。 ,但如果我的新服

  • nestjs 一个服务如何既做微服务也做http服务器? 比如一个接口既可以做 http 又可以做微服务.不想再写一个专门的http 服务器. 接口是否可以相同?

  • 我已经使用了ffmpeg和mp4box来获取必要的文件,就像公会制作自己的简单MPEG-DASH服务器一样。然后,我将所有文件(包括MPD和短划线段)放入我的http服务器文件夹(我使用的是nginx,文件夹是**/wwwroot/default/)。 但我无法通过akamai player或dash if reference player等播放器播放我的视频。url是正确的,因为我可以直接使用“