看流星社区

 找回密码
 注册账号
查看: 7881|回复: 4

浅解FPS方框透视原理

[复制链接]

该用户从未签到

发表于 2019-6-17 15:28:31 | 显示全部楼层 |阅读模式


任何的网络游戏都有服务器端与客户端。
通常情况下客户端负责的是我们玩游戏的一切交互,服务器负责的是数据的验证,分发,处理等的工作

1.jpg


FPS射击类网络游戏的特殊性

射击类网络游戏就比较特殊了,这一类的游戏对数据的实时性要求是很高的,比如枪支的种类,与敌人的距离,击中身体的不同部位有不同的伤害等等数据,都是通过计算得出来的。如果这个计算量交给服务器来处理的话,不仅对服务器的性能要求很高而且会有很高的延时。
假设 数据交给服务器处理,你打了对方一枪,客户端会把从你打出子弹到子弹飞行,对方飙血等这一系列的数据发给服务器,服务器再去对这些进行计算,然后将处理的结果发送给你和被打中的敌人,在这可以设想一下,一台服务器上有很多场比赛,此时这台服务器需要同时处理每个人比赛中千变万化的数据,这中间哪怕产生半秒钟的处理时间,都会让让你觉得这游戏真的“好卡”啊!
玩家要看到的 是打中了敌人,对方立刻飙血,容不得半秒的等待。
所以射击类游戏为了保证游戏体验,只能把数据放在客户端处理也就是你自己的计算机上,以你打了对方一枪为例,在本地计算机处理完这些数据,服务器只需要对你处理完之后产生的结果进行接收,也就是你打中了敌人,再将相应的结果转发给敌人,这中间的“延时”就会非常低了,这样才能保证游戏流畅经行。

辅助的原理
正是因为数据的本地处理,才让辅助有了可乘之机,辅助可以通过修改客户端处理 的数据来欺骗服务器。


假期没事,所以研究了一下FPS游戏中的透视作弊原理,市面上的透视主要有两种,一种是方框透视 就是在角色模型上画一个框,另外一种就是Z缓冲区透视。

2.jpg
方框透视(图片来自网络,仅供参考)

3.jpg
Z缓冲区透视(图片来自网络,仅供参考)


辅助通过跨进程读取游戏内玩家的坐标信息,进行转换,创建透明窗口覆盖主用户的整个电脑桌面,在该透明窗口上进行绘制。

4.jpg


一.读取
我们可以通过CE工具搜索
自己角色的地址(x1,y1,z1)
敌人的坐标(x2,y2,z2)
鼠标角度 x ,y
视场角FOV   FOV
人物的数量,敌人的状态 死亡  存活

假设 一下如果是自己设计这样一个游戏一定会为游戏中的角色 设置一个结构体
struct person()
{
  x轴;
  y轴;
  z轴;
  ......
};

所以
          内存地址        对应的数值
x         0x5651               150
y         0x5651+4           120
z         0x5651+4+4        90

二.转换
方框横坐标分析
M 是鼠标所指向的也是我们玩家的视线
FOV视场角就是玩家所能看到的角度范围(百度找来一张图了解一下)

5.jpg

FOV视场角


要想知道敌人在屏幕上横坐标的位置 就必须知道∠β

6.jpg
游戏画面分析

因为游戏画面或者电脑屏幕的分辨率是1024*768  所以当敌人处于FOV角边缘的时候∠β为45°  x就是512.

7.jpg
特殊情况下横坐标转换屏幕坐标

8.jpg
方框横坐标分析

纵坐标同理 这里就不写了


三.关于绘制

9.jpg

FPS方框透视四种绘制方式

GDI外部绘制
创建GDI设备在指定的窗口句柄上绘制,占用CPU很小,但是绘制到游戏里面会闪烁,原因是游戏FPS刷新频率与gdi绘制频率不同导致画出的方框会闪烁。

GDI双缓冲
这种绘制方式有一部分和外部绘制相同,但是又不同,这种绘制方式不会使方框闪烁,但是占用CPU极高,原理是申请一块与游戏高度宽度相同的内存,把这块内存作为内存画布使用,把绘制的方框画到这块内存画布中,然后获取游戏的窗口句柄,使内存画布中的图像和游戏屏幕来回替换,这种绘制方式占用CPU,但是绘制效率很高,方框也不会闪烁

GDI窗口绘制
这种绘制原理和第一种一样,只不过不是绘制到游戏窗口,而是自己创建一个窗口,把方框绘制到这个窗口上,绘制效率快而且不易被检测,内存占用很小,但是有一个缺点,就是窗口不会自己刷新,需要自己写一个刷新窗口,使刷新窗口的频率大于等于gdi绘制频率,这样就窗口上的绘制内容就是连续的了

D3Dhook绘图
大家都知道3D游戏的图形接口有2种,DirectX和OpenGL,大部分的FPS游戏都是用DirectX引擎,所以我们可以通过hook DirectX设备接口函数来绘制方框,这种绘制方式不占CPU,不闪烁,但是易被检测,DX设备会在内存中申请2块空间作为缓存区A和缓存区B,DirectX设备会在缓存区A中绘制图形,绘制图形的原理是通过绘图函数比如DX11的DrawIndexed,通过这个函数的参数我们可以看出它是根据索引缓存绘制一个非实例化的图形,在设备创建到初始化再到绘制图形,这一系列全部完成后DX11设备会用present把缓存区A映射到缓存区B,让缓存区B作为游戏屏幕并呈现场景,这样缓存区A与B来回映射达到游戏画面不断更新,所以我们可以hook掉present函数,并获取设备指针引入自己的绘图函数,这种绘制方式肯定不会闪烁,因为游戏使用的就是d3d图形接口,我们绘制方框的函数是在这个接口内游戏FPS刷新频率和绘制方框频率肯定是一样的,现在大部分FPS游戏都对present加了检测



以上技术仅供兴趣了解,3D射击游戏很容易出现作弊行为,只有了解其工作原理才能从根本上改善游戏环境,扬汤止沸,不如釜底抽薪。

  • TA的每日心情
    开心
    2020-11-9 00:45
  • 发表于 2019-6-18 00:14:32 | 显示全部楼层
    支持楼主,支持看流星社区,以后我会经常来!
  • TA的每日心情
    开心
    2020-12-14 16:12
  • 发表于 2019-6-20 18:46:44 | 显示全部楼层
    楼主加油,我们都看好你哦。

    该用户从未签到

    发表于 2019-6-25 20:20:30 | 显示全部楼层
    来一期CF的教程啊

    该用户从未签到

    发表于 2020-1-1 12:28:34 | 显示全部楼层
    支持楼主,支持看流星社区,以后我会经常来!
    点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
    您需要登录后才可以回帖 登录 | 注册账号

    本版积分规则

    小黑屋|手机版|Archiver|看流星社区 |网站地图

    GMT+8, 2024-3-29 13:34

    Powered by Kanliuxing X3.4

    © 2010-2019 kanliuxing.com

    快速回复 返回顶部 返回列表