0

当单个用户使用多台设备离线或在线生成数据时,如何进行合并,尽量避免冲突?

就像我制作了一个具有离线容量的多个阶段的游戏。用户 Mike 在他的 iPad 上以离线状态进入第 2 阶段,但现在他移动到他的 iPhone 并发现他仍然处于第 1 阶段。于是他再次玩第 1 阶段,并以 321 的分数到达第 2 阶段。他的两个设备都连接到互联网,我们希望将这两个设备同步到一个状态。我们可以这样做:

  • 用户单击两台设备上的同步按钮,应用程序停止
  • 所有设备都会推送所有用户数据(分数、阶段...)
  • 服务器将用户数据与上次修改时间合并
  • 所有设备拉取合并数据
  • 应用程序回到首页并恢复以避免不一致

该解决方案依赖于它自己的应用程序。是否有任何解决方案可以使用户数据同步对应用程序透明?

4

3 回答 3

2

当几个用户编辑同一个文档时,这听起来像是一种协作的东西。

首先,让我们看看应该如何实现协作:

  • 客户端事件必须发送到服务器,
  • 服务器设置事件的顺序,
  • 服务器对数据应用事件,
  • 服务器向客户端发送数据更改。

如果服务器始终可以访问,它运行良好。我编写了一个协作电子表格,很高兴看到,当我在单元格中输入 1.9999999 时,它变为 2.00,因为 1.9999999 只是一个事件,服务器对其进行处理并从中生成 2.00 数据并发送回。

如果没有可用的服务器 7/24,您应该

  • 保留数据的本地副本,
  • 使用草稿事件->数据转换,
  • 在服务器发送官方数据之前,会显示哪些草稿数据。

在大多数情况下,官方数据和草稿数据是相同的,甚至不需要警告用户,他或她所看到的都是临时数据。

主要技巧是

  • 事件应该有一个时间戳,
  • 客户的时间必须同步。

因此,当服务器从假期回来时,它将能够以正确的顺序重新播放事件。此外,当另一个客户端在离线期后加入并发送过去的事件时,服务器应该必须重新运行来自其他客户端的一些过去的事件,以获得正确的最终数据计算。

您可能永远无法确定,所有事件是否都由服务器收集。你必须制定一个策略,如何处理来自遥远过去的事件。也许放下它们?

在某些情况下,例如高分,顺序并不重要。

于 2013-11-08T14:58:03.427 回答
0

在服务器上使用事务数据库

来自维基百科:

  1. 开始交易
  2. 执行一组数据操作和/或查询
  3. 如果没有发生错误,则提交事务并结束它
  4. 如果发生错误,则回滚事务并结束它

基于服务器的数据库是客户有效信息的主要来源。当客户想知道最新的分数时,他们会查询数据库。在您的客户端上,您跟踪local_scoreremote_score。您向用户显示的是local_score+remote_score,但是当您向服务器提交分数更新时,您只提交为该游戏实例赢得的部分( local_score)。心态是您只发送增量。您的数据库只需将它收到的任何新分数添加到其内部总分中,并以上面显示的事务方式进行。

请注意,数据库将对近乎同时的请求进行排队并按顺序执行它们,因为它会在事务发生时锁定数据库的相关部分。你可以自己构建这个逻辑,但是有这么多好的免费的 数据库,你可以只使用其中的一个。

这种策略允许您的客户端在更新时与服务器一样保持最新状态,同时将责任推给服务器,使其成为有关游戏状态的权威信息源。当然,您不仅可以使用分数来执行此操作,还可以使用您需要跨多个客户端跟踪的任何内容。

于 2013-11-10T12:51:52.363 回答
0

我认为最好的解决方案是不要求两个设备同时连接到 Internet 并且在两个设备上都按下按钮。

你可以这样做:

  1. 启动时,应用程序会检查是否有 Internet 连接。如果不是,则根据自己的数据启动,否则将用户数据推送到服务器。
  2. 当服务器从设备获取用户数据时,它会进行合并:在您的情况下,它应该检查阶段是否高于它已经知道的:如果不是,则忽略新收到的数据,否则覆盖现有数据新收到的数据。
  3. 如果数据被更新,服务器将新数据广播到所有连接的设备(这可能发生在游戏中期)

如果服务器不知道连接的设备,则步骤 3 无法工作。解决方案是更改步骤 1,以便在启动时应用程序将用户数据推送到服务器(立即进行合并),然后从服务器查询用户数据(可能获得相同或更高的阶段)并启动基于它收到的任何东西。

于 2013-11-08T15:58:00.010 回答