请教各位大佬,游戏后端中,如何做防加速呢?

2022-11-14 10:36:37 +08:00
 junwind

如题,希望大佬们给个思路即可

5496 次点击
所在节点    程序员
25 条回复
coderxy
2022-11-14 10:40:21 +08:00
让客户端固定一定时间 ping , 如果 ping 的间隔跟设定的相差太多则判定为加速。
mrzx
2022-11-14 10:53:37 +08:00
我觉得楼主应该问的是“类似变速齿轮”的加速效果

很多网游都可以利用变速齿轮作弊。
Twan
2022-11-14 11:02:17 +08:00
状态类游戏 就服务器写的业务逻辑 / 客户端按服务端推送数据刷新就行.

如果是 fps 游戏. 那就跑帧.
以农药举个例子(举个例子 并不一定是这样做) 大家一起跑帧. 游戏进入场景开始. 每 30ms 打包一次本地数据 + 计算结果提交到服务器(其实每个客户端把自己可见数据(可见玩家)的操作数据 打包上传到服务器) 然后服务器收集结果. 根据所有人上传的数据汇总+投票+ 关键帧验证 提交) 多个人提交基本是一 zhi 的. 比如 A 玩家提交了 瑞文在游戏开始 30ms 处 使用了 Q 技能. B 玩家也提交了瑞文使用了 q 技能在 30ms 处 C.D.E.F 玩家都提交了) 少数服从多数 超时未提交的丢弃. 且服务器在对关键数据跑一遍基础逻辑 是否有异常) 然后统一转发 本次操作有效.
Twan
2022-11-14 11:03:48 +08:00
至于 RPG 有状态的游戏... 客户端本地做加密.该内存数据 服务器关键逻辑判断即可.
插入一个接口 把玩家操作仍到队列. 另起一个线程 跑队列 取出一个玩家 某一段时间的操作数据 做逻辑验证..
xtreme1
2022-11-14 11:06:25 +08:00
补充一下发现某个客户端验算不过不要着急把它踢了, 有几率且随机时间踢
Twan
2022-11-14 11:07:00 +08:00
知道了上述操作吗?
噢, 你知道了. 抱歉,附带一句: 在帧同步游戏中 任何抵制外挂强逻辑 都是搬石头砸自己的脚.
paradoxs
2022-11-14 11:07:51 +08:00
纯后端很难做,而且不足够。 看现在的游戏就知道了,本地客户端对这方面都有很强的校验。 做进程白名单之类的,过不了就不让你玩。
rikimaru
2022-11-14 11:18:35 +08:00
比如角色移动,服务端是知道角色的速度和上一次移动时间,当前位置的。那么当客户端请求移动到一个位置时,服务端计算下 速度*(现在时间-上次移动时间)是否大于等于请求的位置与上一个位置的距离,是的话就移动,否则就不移动
xytest
2022-11-14 11:20:29 +08:00
貌似这玩意儿 很难,我看 tx 的 DNF 现在都存在 加速器。
zapper
2022-11-14 11:22:35 +08:00
秋后算账?
跑数据,发现异常抓到再封号,从政策上打击
kuner0614
2022-11-14 11:34:33 +08:00
你去腾讯开发者社区问问,国内做游戏的大多都在腾讯云。
liuidetmks
2022-11-14 11:52:27 +08:00
工作量证明,让他电脑无法快速提交?
bruce0
2022-11-14 12:06:34 +08:00
状态同步的应该好处理一些吧, 服务器同步跑游戏逻辑, 应该能避免

帧同步的 不清楚怎么弄了, 常见的就像 3 楼说的投票机制?
dcoder
2022-11-14 12:08:47 +08:00
上面基本都没说清楚, 简单的说是这样的:

游戏世界的模拟都在 server 做. server 收到 all/most clients 的 update messages, 然后自己一个个逻辑帧往前模拟计算.
然后把模拟结果发回各个 clients. 虽然单个 client 可以对所有其他 player 做预测(prediction + rollback netcode)来制造本地延迟很地的幻象(提高本地 player 的体验), 但是最终还是要服从 server 的模拟结果 (和 server 冲突的时候要 state rollback).

server 在收到每个 client 的 update message 后, 都要校验, 跟前一个逻辑帧比较, 这个 client 的新 update 是否合理?
如果 client 自己在单方面加速, 那开始加速那几帧的 update 就通不过逻辑校验了 -- 比如违反了游戏世界的物理规律, 移动速度和动作过快.

但是有些东西是比较难反作弊的: 比如 fps 自动爆头, 因为 client 的操作和 update 都在游戏模拟中是合理的, server 不知道是这个玩家作弊了,还是枪法太好.
ragnaroks
2022-11-14 12:24:23 +08:00
这个主要取决于你的游戏类型,作为 unity 主程的经验如下:

如果是 MMORPG 这样的对延迟和时间同步不敏感的游戏,那么直接所有数据都放服务端即可,客户端只是 view 层用于显示服务端推送过来的 state 。

如果是交互优先的 FPS 、ACT 类游戏,也就是玩家体验尽可能没有延迟,那么需要做客户端做运算并交由服务端校验。一般而言使用简单的帧同步就行,又叫“tick”。服务端以固定 tick 运行逻辑,在每个 tick 间隔收到来自客户端的“有限次”输入,校验并混入下一个 tick 用于计算,服务端将最新的正确 state 推送到客户端进行插值渲染。以 CSGO 来说,游戏运行在 128 tick 下,虽然可以通过脚本的方式 1 秒按下几百次按键,但事实上客户端只对那一 tick 的最后几次按键消息被打包并送往服务端。

最后,一般而言在正确设计服务端的情况下,加速都是没啥用的功能,总不能喝药施法都是客户端读条吧。
daysv
2022-11-14 13:34:47 +08:00
AI 反作弊有没有市场的?
yankebupt
2022-11-14 15:44:21 +08:00
你应该问如何做防减速
超级马里奥制造 2.所有用户一起跑帧。只要有一个卡的全部卡成 15 帧或者更低,由于需要精确计算碰撞所有帧都不能跳帧,所以非常忌讳有卡比。
tutou
2022-11-14 16:47:58 +08:00
搜索永劫无间微加速
joesonw
2022-11-14 16:59:28 +08:00
@yankebupt 那是因为使用的最原始的类似于局域网的 lockstep 。一般的都是每一个 tick ,服务器会把上一个间隙收到的广播给其他客户端,卡比没来得及上传,其他客户端看到的表现就是他没操作。
yucao
2022-11-14 17:11:54 +08:00
作为客户端程序回答一下我们的帧同步游戏的防作弊(帧同步基本上防作弊都由客户端来做):
1 、逻辑线程和表现线程拆分开,一般的加速挂只能加速表现线程,对逻辑无法影响,读取输入是逻辑线程去读取上行
2 、如果它加速逻辑线程,则直接与其他正常游玩的角色产生帧同步错误引发不一致,这种情况一旦发生就会上报,我们会从服务器上记录的帧日志事后追查
当然往后讲这个话题还挺多的...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/895033

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX