请教各位大佬,游戏后端中,如何做防加速呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
junwind
V2EX    程序员

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

  •  
  •   junwind 2022-11-14 10:36:37 +08:00 5940 次点击
    这是一个创建于 1062 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    游戏世界的模拟都在 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
        15
    ragnaroks  
       2022-11-14 12:24:23 +08:00   1
    这个主要取决于你的游戏类型,作为 unity 主程的经验如下:

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

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

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

    pc 上作弊太容易了。。。
    MMMMMMMMMMMMMMMM
        22
    MMMMMMMMMMMMMMMM  
       2022-11-14 18:29:34 +08:00
    @coderxy 一直 ping 客户端一多不得把服务器 ping 崩了
    coderxy
        23
    coderxy  
       2022-11-14 18:54:25 +08:00
    @MMMMMMMMMMMMMMMM 30s 一个,怎么可能把服务器 ping 崩
    documentzhangx66
        24
    documentzhangx66  
       2022-11-14 23:32:49 +08:00
    客户端只发送操作,就像游戏机只发送按键。具体业务逻辑都放在服务端做。

    这种除了透视外挂与自动操作外挂没办法防之外,其他的作弊项目基本上都可以防。
    lovegoogle
        25
    lovegoogle  
       2022-11-15 08:48:03 +08:00
    @coderxy 用 ping 有个明显问题就是如果用户的网络环境发生变化,也是有可能误伤的,比如典型场景就是用户从无线网切换成有线网。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2474 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 01:38 PVG 09:38 LAX 18:38 JFK 21:38
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86