V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
junwind
V2EX  ›  程序员

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

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

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

    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   ·   实用小工具   ·   2847 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:20 · PVG 20:20 · LAX 04:20 · JFK 07:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.