GIT https://git.oschina.net/dreamyouxi/XYGame
对应工程为 ClientServer 服务器。
客户服务端 ClientServer
ClientServer 是运行在服务端的软件,用于模拟客户端的运算来校验数据。原则上它只是 UnityClient 的一个场景加上少量修改代码,没有 UI,只保留逻辑,并拥有独立线程负责与 LogicServer 通信。
由于所有游戏逻辑都在客户端执行,诸如战争迷雾错乱、开辅助刷号刷金币等操作型作弊,对手游而言基本没有完美的防御手段。但对于各客户端逻辑的正确性,可以借助 ClientServer 来做校验,具体流程如下:
- 战斗结束后,战斗服务器将游戏帧数据保存到 Redis 或文件中。
- LogicServer 向 ClientServer 发起数据校验请求,附带装备信息、战斗 id 等基本信息。
- ClientServer 维护一个队列,收到请求后立即以与客户端完全一致的算法快速模拟该局游戏,再对比战斗结果是否吻合。
一个小优化是:可以预先判断各客户端的数据是否一致,只有在数据存在差异时才发起校验请求,减少不必要的开销。目前实现的 ClientServer 相比客户端只多出约 100 行代码,日常开发逻辑时无需特别关注,打包时选择 ClientServer 场景即可。该工程已在 GIT 链接的 UnityClient 工程中实现。
因为服务器通常没有显卡,运行 Unity 时可以使用 xxx.exe -batchmode 命令以无头模式启动。
当然,上述方案只是开发阶段的实现。正式运营时还需要大量修改客户端代码,例如移除 View、音效、特效等模块,只保留逻辑层。如果客户端框架设计合理,将 View、Audio 等模块解耦剥离会相对简单。
实时作弊检测
上述校验方式只能在战斗结束后进行。如果需要在游戏过程中实时发现并阻止作弊——例如立刻强制玩家掉线——可以采用以下方案:
让服务端的 ClientServer 与客户端同步模拟游戏,每隔固定 Tick 对整个游戏系统状态做一次信息摘要(例如计算一次 hash)并与客户端对比。这种方式在不需要知道作弊具体内容的情况下效果尚可。也可以让客户端之间互相比对,但这种方案存在所有客户端同时作弊或作弊内容不一致的情况,覆盖不全面。
强制让违规玩家掉线的做法比较粗暴,可以让整局游戏作废,也可以精确到谁作弊谁掉线,视需求而定。
端游还可以额外开一个守护进程监测系统进程活动,类似腾讯的 TP 系统,但同样防不住高端破解手段。