这些天我正在尝试为我的公司设计一款新的 MMORPG 手机游戏的架构。此游戏类似于 Mafia Wars、iMobsters 或 RISK。基本思想是准备一支军队来与你的对手(在线用户)作战。

虽然我之前曾开发过多个移动应用程序,但这对我来说是新事物。经过一番努力,我想出了一个架构,在高级流程图的帮助下进行了说明:

我们决定采用客户端-服务器模型。服务器上将有一个集中式数据库。每个客户端都有自己的本地数据库,该数据库将与服务器保持同步。该数据库充当缓存,用于存储不经常更改的内容,例如 map 、产品、库存等。

有了这个模型,我不确定如何解决以下问题:

  • 同步服务器和客户端数据库的最佳方式是什么?
  • 在将事件更新到服务器之前,是否应该将其保存到本地数据库?如果应用程序在将更改保存到集中式数据库之前因某种原因终止怎么办?
  • 简单的 HTTP 请求是否可以用于同步?
  • 如何知道当前登录的是哪些用户? (一种方法可能是让客户端在每 x 分钟后继续向服务器发送请求以通知它处于事件状态。否则认为客户端处于非事件状态)。
  • 客户端验证是否足够?如果没有,如果服务器未验证某些内容,如何恢复操作?

  • 我不确定这是否是一个有效的解决方案以及它将如何扩展。如果已经使用过此类应用程序的人可以分享他们的经验,这可能会帮助我提出更好的建议,我将不胜感激。提前致谢。

    附加信息:

    客户端是在名为 marmalade 的 C++ 游戏引擎中实现的。这是一个跨平台游戏引擎,这意味着您可以在所有主要移动操作系统上运行您的应用程序。我们当然可以实现线程化,这也在我的流程图中进行了说明。我打算将 MySQL 用于服务器,将 SQLite 用于客户端。

    这不是回合制游戏,因此与其他玩家没有太多互动。服务器将提供在线玩家列表,您可以通过单击战斗按钮与他们进行战斗,经过一些动画后,将宣布结果。

    对于数据库同步,我有两个解决方案:
  • 存储每条记录的时间戳。还要跟踪本地数据库的时间
    最后更新。同步时,只选择那些
    有一个更大的时间戳并发送到本地数据库。保留一个 isDeleted 标志
    对于已删除的行,因此每次删除都只是一种更新。但
    对于我们的每个同步请求,我都对性能表示严重怀疑
    必须扫描整个数据库并查找更新的行。
  • 另一种技术可能是记录每次插入或更新
    发生在用户身上。当客户端应用程序要求同步时,
    转到此表并找出哪个表的哪些行
    更新或插入。一旦这些行成功转移到
    客户端删除此日志。但后来我想到如果用户
    使用另一个设备。根据日志表,所有更新都已
    为该用户转移,但实际上是在另一个用户上完成的
    设备。因此,我们可能还必须跟踪设备。实现
    这种技术比较耗时,但不确定是否可行
    执行第一个。
  • 最佳答案

    我看到两个潜在问题隐藏在以下事实中:您将所有状态存储在客户端上,然后使用后台线程更新服务器上的状态。

  • 服务器如何验证发布的数据?如果有人入侵了您的应用程序,他们可以修改代码,因此每当他们挥剑(或他们在您的游戏中所做的任何事情)时,总会受到打击。在单人游戏中这样做没什么大不了的,但在 MMORPG 中这样做可能会破坏其他人的体验。所以服务器应该验证数据的每次更新——或者更好的是,服务器应该负责每条业务规则。所以当你挥剑攻击对手时,应该是服务器调用,服务器返回是否命中,以及对手损失了多少生命值。
  • 和其他玩家的互动呢(既然你说是MMORP,那么就会有和其他玩家的互动)?由于您说更新服务器并在后台线程中获取更新,因此交互将变得缓慢。当您与另一个角色通信时,您首先需要等待后台线程同步数据,但您还必须等待其他玩家的后台线程同步数据。
  • 关于mobile - 这是适合我们 MMORPG 手机游戏的架构吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7657678/

    10-16 12:31