语境
在我正在开发的游戏中(一点点点击的图形冒险),游戏世界中发生的几乎所有事情都由动作管理器控制,该动作管理器的结构有点像:
因此,例如,如果检查对象的结果使角色打招呼,走了一下然后坐下,我只需生成以下代码:
var actionGroup = actionManager.CreateGroup();
actionGroup.Add(new TalkAction("Guybrush", "Hello there!");
actionGroup.Add(new WalkAction("Guybrush", new Vector2(300, 300));
actionGroup.Add(new SetAnimationAction("Guybrush", "Sit"));
这将创建一个新的操作组(上图中的整行)并将其添加到管理器中。所有组的并行执行,但动作内各组链接在一起,使得第二一个只有第一个完成之后开始。当组中的最后一个动作完成时,该组将被销毁。
问题
现在,我需要在网络上复制此信息,以便在多人游戏会话中,所有玩家都可以看到同一件事。序列化各个动作不是问题。但是,在联网方面,我绝对是初学者,我有几个问题。为了简化讨论,我认为我们可以将动作管理器组件抽象为简单的:
var actionManager = new List<List<string>>();
如何继续使所有播放器之间的上述数据结构的内容保持同步?
除了核心问题之外,我还涉及其他一些问题(即,上述同一问题的所有可能含义):
- 如果我使用服务器/客户端体系结构(其中一个玩家同时充当服务器和客户端),并且其中一个客户端产生了一组操作,那么他应该将它们直接添加到管理器中,还是只发送请求到服务器,这又将命令每个客户端添加该组?
- 丢包之类的呢?游戏是确定性的,但我认为客户执行的动作顺序中的任何差异都可能导致世界状态不一致。我该如何防范此类问题?
- 如果我一次添加太多操作怎么办,这不会引起连接问题吗?有什么缓解的办法吗?