当我们在做一些跟网络游戏相关的机器学习任务的时候,有时需要对整个游戏系统的运行机制有所了解才能更好的应对,对于网游而言,首当其冲的机制便是同步了。当然,大部分的机器学习从业者是不会懂游戏开发的,更不会不懂同步机制,此文我将基于我个人的一些研究和理解对网游中的同步机制做一个简单的介绍,以便大家更加顺利的开展游戏相关的机器学习任务。
何为同步
与单机游戏不同,网络游戏有很多人通过远程的方式参与游戏,不管是服务器还是玩家,用的都是自己独立的设备,也就是说所有的客户端和服务器都是各自独立的游戏世界,要让游戏玩下去就得保证所有的游戏世界都是一致的,于是便有了同步。
在理想的情况下,所有人操作的游戏世界,在同一时刻应该是完全步调一致的,但由于网络延迟以及其他不同设备环境的差异,完全一致时不可能的,而同步的目的是希望尽可能的一致,而对一致性的要求,不同的游戏类型也会有不同的要求。
帧同步与状态同步
通常帧同步和状态同步是这样区分的:
传输内容(c2s) | 传输内容(s2c) | 逻辑计算 | 断网重连 | 回访/观战 | |
---|---|---|---|---|---|
帧同步 | 操作 | 操作 | 客户端 | 追历史帧 | 天然支持 |
状态同步 | 操作/结果 | 结果 | 服务端/部分在客户端(FPS) | 下次同步 | 单独实现 |
当然这两种方式并非是非此即彼的,在一些复杂的网络游戏中,混用两种方式也是比较常见的。
尽管为了游戏体验,游戏客户端可能会做很多体验上的改进操作,跟我下面讲的并不会完全一致,但归根揭底,帧同步和状态同步必然会遵循上述几点,在设计算法时无需在意那些为了优化体验的细节。
以下是一些具有代表性游戏的同步方式:
游戏类型 | 帧同步 | 状态同步 |
---|---|---|
FPS | DooM | CSGO/守望先锋/绝地求生.. |
MOBA | 王者荣耀/DOTA | LOL/DOTA2 |
SPT | NBAOnline/街头篮球 | |
FGT/ACT | 街霸/Flash Party | 怪物猎人 |
RTS | 星际争霸/魔兽争霸 | |
MMO | 全民斗战神 | 魔兽世界/天涯明月刀 |
帧同步
帧同步是比较容易理解的,所有的客户端都是一个完整独立的系统,并且我们指导游戏中的随机性均是伪随机,在seed确定的情况下,每个系统的状态的改变只取决于游戏的输入,也就是说我们通过服务器来转发所有玩家的操作输入客户端游戏系统,那么就能保障所有的客户端都是同步的。
比如某个时刻,玩家0做了操作x, 整个同步过程如下:
显而易见的,因为只同步了用户的操作,这个数据传输量其实是很少的,所以很省流量,除非玩家特别多...
状态同步
对于绝大多数的状态同步游戏,它的逻辑计算完全放在服务器上,因此也十分好理解。客户端只是相当于一个表现层,用来展示服务器发送过来的数据。就像我们打开一个网页,网页上的数据都是从服务器发过来的,因此我们本地是没办法作弊的,除非黑了服务器,因此这种状态同步的游戏基本上是没有外挂的。
但是有一种特殊的情况,就是FPS类型的游戏,如果靠服务器来运算,整个延迟下来就没法正常玩了...因此它的战斗逻辑会在客户端,而只向服务器汇报结果,因此类似吃鸡的这种游戏会有很多的外挂。
关于游戏安全性的总结
对于战斗逻辑在服务器的状态同步游戏,它的安全性是十分高的,因为想作弊就得黑入服务器,这个难度可想而知。但是FPS类型游戏部分战斗逻辑在客户端,这个会好被外挂修改,这也是FPS游戏外挂多难以根治的主要原因。
而帧同步的游戏整个计算逻辑在客户端,因此,开挂者因为可以获得全系统的信息,于是就可以很容易做开图之类的外挂。