我正在开发一个由单个页面组成的Web应用程序(ASP.NET)游戏,在该页面上,会有一个类似于Monopoly的游戏板。我想确定最好的架构方法是什么。到目前为止我发现的主要要求是:
我已经考虑过将游戏状态保存在数据库中,但是当游戏状态对象(比如在缓存中)可以保持最新时,继续更新数据库似乎有些过分。例如,流程可能如下所示:
考虑单个服务器将为多个并发游戏提供服务。
我无法弄清楚最好的方法是什么。所有人似乎都有自己的缺点。有没有人有这方面的经验并且愿意分享这些经历?如果我太模糊,请随意提出自己的问题!感谢。
更新:根据我上面提到的三个选项,有没有人建议如何实现与服务器的连接?
答案 0 :(得分:4)
您可以使用ASP.Net Cache或Application状态来存储游戏对象,因为这些是在用户之间共享的。缓存可能是最好的位置,因为可以从中删除对象以节省内存。
如果使用唯一键将游戏对象存储在缓存中,则可以将密钥存储在每个访问者会话中,并使用它来检索共享游戏对象。如果已清除缓存,则将从数据库重新创建对象。
答案 1 :(得分:3)
虽然更新数据库似乎有些过分,但在扩展时它具有优势,因为您可以让多个网页与一个后端进行通信。
更大的问题是如何将游戏状态传达给客户。虽然游戏状态的不断更新可确保捕获任何更改并且所有客户端即使错过消息也保持同步,但游戏状态通常非常大。
同时考虑一下,通常你希望游戏状态消息触发动画或其他显示更新来描绘动作(例如,一个棋子移动,它不应该只在大多数情况下出现在目的地......它应该移动全面的)。
正因为如此,一个结合了两全其美的解决方案是保留一个数据库,该数据库收集表中执行的所有操作,并带有顺序ID。当客户端请求更新时,它可以在之后提供所知的最后一个操作,并且客户端可以“完成”移动。这意味着即使请求失败,它也可以简单地重试请求,并且不会丢失任何操作。
然后,服务器也可以从相同的数据维护游戏状态的内部视图。它还可以拒绝非法操作并阻止他们进入游戏操作表(从而防止其他客户端被错误更新)。
最后,因为服务器确实拥有“一个真正的”游戏状态,所以客户端可以定期检查(这将允许您在客户端或服务器代码中查找错误)。因为服务器数据库应该被视为主数据库,所以您可以将整个游戏状态重新传输到任何状态不正确的客户端,因此次要的客户端错误不会(可能)破坏体验(除非在下载状态时暂停)。 / p>
答案 2 :(得分:1)
为什么不创建应用程序级别对象来存储您的详细信息。有关详细信息,请参阅Application State and Global Variables in ASP.NET。您可以使用sessionID作为每个播放器数据的密钥。
你也可以使用Cache来使用很长时间来做同样的事情。这样做的好处是可以在一段时间(即6小时或更长时间)之后从缓存中刷新旧数据。