当一个用户使用多个设备离线或在线生成数据时,如何合并它并尽可能避免冲突?
就像我制作了一个具有离线容量的几个阶段的游戏。一位用户迈克已经在iPad上以第123阶段的离线状态进入第二阶段,但现在他转移到他的iPhone并发现他仍然处于第一阶段。因此他再次进入第一阶段并以得分321进入第二阶段。他的设备都连接到互联网,我们希望将这两个设备同步到一个状态。我们可以这样做:
此解决方案依赖于自己的应用程序。是否有任何解决方案可以使用户数据同步对应用程序透明?
答案 0 :(得分:1)
当几个用户编辑同一个文档时,听起来像是一种协作的东西。
首先,让我们看看应该如何实施协作事项:
如果服务器始终可访问,它运行良好。我写了一个协作电子表格,很高兴看到,当我输入1.9999999进入单元格时,它变为2.00,因为1.9999999只是一个事件,服务器处理并从中发送了2.00数据并发回。
如果没有可用的服务器7/24,您应该
在大多数情况下,官方数据和草案数据是相同的,甚至没有必要警告用户,他或她可以看到的是临时数据。
主要技巧是
因此,当服务器从假日回来时,它将能够以正确的顺序重新播放事件。此外,当另一个客户端在脱机时段之后加入并且它发送过去的事件时,服务器必须重新运行来自其他客户端的一些过去事件以获得正确的最终数据计算。
您可能永远不会确定服务器是否收集了所有事件。你必须制定一个战略,如何应对来自远方的事件。也许放弃它们?
有些情况,比如高分,顺序并不重要。
答案 1 :(得分:0)
我认为最好的解决方案是不要求两台设备同时连接到互联网,同时按下按钮。
你可以这样做:
如果服务器不知道连接的设备,则步骤3无效。解决方案是更改步骤1,以便在启动时应用程序将用户数据推送到服务器(立即执行合并),然后从服务器查询用户数据(可能获得相同或更高的阶段)并启动基于收到的任何东西。
答案 2 :(得分:0)
在服务器上使用transactional database。
来自维基百科:
基于服务器的数据库是客户有效信息的主要来源。当客户想知道最新分数时,他们会查询数据库。在您的客户端上,您可以跟踪local_score
和remote_score
。您向用户显示的内容为local_score+remote_score
,但是当您向服务器提交分数更新时,您只需提交为该游戏的该实例获得的部分({{1} })。心态是你只发送增量。您的数据库只是将它收到的任何新分数添加到其内部总数中,并以上面显示的事务方式进行。
请注意,数据库将按顺序排列并发请求并按顺序执行,因为它会在事务发生时锁定数据库的相关部分。你可以自己构建这个逻辑,但是有很多good,free databases,你可以使用其中一个。
此策略允许您的客户端在服务器更新时保持最新状态,同时将服务器的责任推送到有关游戏状态的权威信息来源。当然,您不仅可以使用分数执行此操作,还可以使用任何需要在多个客户端中跟踪的内容。