本发明涉及监控领域,尤其涉及一种帧率动态获取的方法及系统。
背景技术:
帧率是用来分析游戏显示是否出现瞬间卡顿的重要参数。随着信息技术的发展,目前新开发的游戏中大多自带有帧率统计功能。但是,早期开发的游戏大部分没有帧率统计功能,只能靠个人感觉来判断是否出现卡顿的现象。现有技术中,若要在没有帧率统计功能的游戏中添加该功能,需要通过修改源码的方式实现。然而,游戏的源码量大多比较庞大,且早期开发该游戏的程序人员可能早已调离其它项目组,新的工程师对该游戏的源码进行修改需要耗费大量不必要的时间和精力。
技术实现要素:
本发明所要解决的技术问题是:本发明提出一种帧率动态获取的方法及系统,实现无需修改源码即可实时获取当前界面的帧率。
为了解决上述技术问题,本发明采用的技术方案为:
本发明提供一种帧率动态获取的方法,包括:
获取显示画面函数的入口地址,得到第一地址;所述显示画面函数用于将后台绘制好的画面显示在当前界面上;
预设第一函数;所述第一函数用于计算帧率、执行所述显示画面函数的函数体和显示帧率;
获取所述第一函数的入口地址,得到第二地址;
设置所述显示画面函数的函数指针指向所述第二地址;
设置所述第一函数的函数指针指向所述第一地址。
本发明还提供一种帧率动态获取的系统,包括:
第一获取模块,用于获取显示画面函数的入口地址,得到第一地址;所述显示画面函数用于将后台绘制好的画面显示在当前界面上;
第一预设模块,用于预设第一函数;所述第一函数用于计算帧率、执行所述显示画面函数的函数体和显示帧率;
第二获取模块,用于获取所述第一函数的入口地址,得到第二地址;
第一设置模块,用于设置所述显示画面函数的函数指针指向所述第二地址;
第二设置模块,用于设置所述第一函数的函数指针指向所述第一地址。
本发明的有益效果在于:通过调换显示画面函数和第一函数的函数指针所指向的入口地址,实现无需修改源代码即可实时获取当前界面的帧率;所述第一函数用于计算帧率、执行所述显示画面函数的函数体和显示帧率,通过所述第一函数可实时获取当前界面的帧率并显示在当前界面上。
附图说明
图1为本发明一种帧率动态获取的方法的流程框图;
图2为本发明一种帧率动态获取的系统的结构框图;
标号说明:
1、第一获取模块;2、第一预设模块;3、第二获取模块;4、第一设置模块;5、第二设置模块。
具体实施方式
为详细说明本发明的技术内容、所实现目的及效果,以下结合实施方式并配合附图予以说明。
本发明最关键的构思在于:通过调换显示画面函数和第一函数的函数指针所指向的入口地址,实现无需修改源代码即可实时获取当前界面的帧率。
如图1所示,本发明提供一种帧率动态获取的方法,包括:
获取显示画面函数的入口地址,得到第一地址;所述显示画面函数用于将后台绘制好的画面显示在当前界面上;
预设第一函数;所述第一函数用于计算帧率、执行所述显示画面函数的函数体和显示帧率;
获取所述第一函数的入口地址,得到第二地址;
设置所述显示画面函数的函数指针指向所述第二地址;
设置所述第一函数的函数指针指向所述第一地址。
其中,显示画面函数用于将后台绘制好的画面显示在当前界面上;第一函数为自定义的函数,包括计算帧率,执行显示画面函数的函数体和显示帧率的功能。通过交换第一函数和显示画面函数的函数指针所指向的入口地址,使得当程序调用画面显示函数时,由于此时画面显示函数的函数指针实际指向的是第一函数的入口地址,因此,执行的是第一函数的函数体。第一函数先执行计算帧率的操作,再执行显示画面函数的函数体将后台绘制好的画面显示在当前界面上,最后将计算所得的帧率显示在当前界面上。可通过观察帧率直接明了的判断游戏是否卡顿,比如游戏的帧率为60帧/秒时处于稳定状态,当前界面显示的帧率突然变成30帧/秒,则说明游戏发生了卡顿的现象。
进一步地,所述计算帧率,具体为:
获取当前系统时间,得到当前帧的显示时间点;
获取前一帧的显示时间点;
将所述当前帧的显示时间点减去所述前一帧的显示时间点,得到单帧的显示时间差;
将单位时间除以所述单帧的显示时间差,得到帧率。
由上述描述可知,可实现实时计算当前画面的帧率。
显示每一帧画面都需要调用显示画面函数,因此,在执行显示画面函数的函数体之前记录下当前的系统时间,并与为了显示上一帧而调用显示画面函数的时间进行比较,可获得单帧的显示时间差。将单位时间除以所述单帧的显示时间差,可得到每单位时间可显示多少帧,即帧率。优选地,单位时间一般为1秒。
进一步地,执行所述显示画面函数的函数体,具体为:
获取所述第一函数的函数指针指向的入口地址,得到第三地址;
通过所述第三地址调用所述显示画面函数。
由上述描述可知,可实现执行所述显示画面函数的函数体。
由于第一函数和显示画面函数的函数指针所指向的入口地址进行了调换,此时显示画面函数的函数指针所指向的入口地址实际为第一函数的入口地址,若直接通过函数名调用显示画面函数无法执行显示画面函数实际的函数体。由于此时第一函数的函数指针指向的入口地址为显示画面函数的入口地址,因此,需先获得第一函数的函数指针指向的入口地址,再通过该入口地址调用显示画面函数,执行显示画面函数的函数体。
进一步地,所述显示帧率,具体为:
预设颜色匹配表;所述颜色匹配表包含颜色对,所述颜色对中的两种颜色值所表示的颜色互为补色;
获取帧率显示区域的中心点的颜色值,得到第一颜色值;
从所述颜色匹配表中搜索所述第一颜色值对应的补色的颜色值,得到第二颜色值;
设置所述帧率的颜色值为所述第二颜色值;
在当前界面的左上角显示通过第一函数计算得到的帧率的值。
由上述描述可知,可实现动态改变帧率的显示颜色,从而突出显示帧率。
随着游戏的进程,显示帧率区域的颜色会发生变化,若使用单一的颜色显示帧率,难以避免显示帧率的颜色和显示帧率区域的背景颜色相近,从而无法清晰地观察到帧率的变化。补色为反差较大的颜色,因此使用显示帧率区域的颜色的补色来显示帧率,可保证突出显示帧率。
进一步地,所述获取显示画面函数的入口地址,具体为:
获取绘图接口地址;所述绘图接口中包含所述显示画面函数;
获取所述显示画面函数的偏移量;
将所述绘图接口地址加上所述偏移量,得到显示画面函数的入口地址。
由上述描述可知,可实现获取显示画面函数的入口地址。
如图2所示,本发明还提供一种帧率动态获取的系统,包括:
第一获取模块1,用于获取显示画面函数的入口地址,得到第一地址;所述显示画面函数用于将后台绘制好的画面显示在当前界面上;
第一预设模块2,用于预设第一函数;所述第一函数用于计算帧率、执行所述显示画面函数的函数体和显示帧率;
第二获取模块3,用于获取所述第一函数的入口地址,得到第二地址;
第一设置模块4,用于设置所述显示画面函数的函数指针指向所述第二地址;
第二设置模块5,用于设置所述第一函数的函数指针指向所述第一地址。
进一步地,还包括:
第三获取模块,用于获取当前系统时间,得到当前帧的显示时间点;
第四获取模块,用于获取前一帧的显示时间点;
减模块,用于将所述当前帧的显示时间点减去所述前一帧的显示时间点,得到单帧的显示时间差;
除模块,用于将单位时间除以所述单帧的显示时间差,得到帧率。
进一步地,还包括:
第五获取模块,用于获取所述第一函数的函数指针指向的入口地址,得到第三地址;
调用模块,用于通过所述第三地址调用所述显示画面函数。
进一步地,还包括:
第二预设模块,用于预设颜色匹配表;所述颜色匹配表包含颜色对,所述颜色对中的两种颜色值所表示的颜色互为补色;
第六获取模块,用于获取帧率显示区域的中心点的颜色值,得到第一颜色值;
搜索模块,用于从所述颜色匹配表中搜索所述第一颜色值对应的补色的颜色值,得到第二颜色值;
第三设置模块,用于设置所述帧率的颜色值为所述第二颜色值;
显示模块,用于在当前界面的左上角显示通过第一函数计算得到的帧率的值。
进一步地,所述第一获取模块1包括:
第七获取模块,用于获取绘图接口地址;所述绘图接口中包含所述显示画面函数;
第八获取模块,用于获取所述显示画面函数的偏移量;
加模块,用于将所述绘图接口地址加上所述偏移量,得到显示画面函数的入口地址。
本发明的实施例一为:
获取绘图接口地址;所述绘图接口中包含显示画面函数;
获取所述显示画面函数的偏移量;
将所述绘图接口地址加上所述偏移量,得到第一地址,即显示画面函数的入口地址;所述显示画面函数用于将后台绘制好的画面显示在当前界面上;
预设第一函数;所述第一函数用于计算帧率、执行所述显示画面函数的函数体和显示帧率;
获取所述第一函数的入口地址,得到第二地址;
设置所述显示画面函数的函数指针指向所述第二地址;
设置所述第一函数的函数指针指向所述第一地址;
当需要将后台绘制好的画面显示到当前界面时,程序调用显示画面函数,由于此时显示画面函数的函数指针指向的入口地址为所述第一函数的入口地址,此时实际上执行的是第一函数的函数体;
获取当前系统时间,得到当前帧的显示时间点;
获取前一帧的显示时间点;
将所述当前帧的显示时间点减去所述前一帧的显示时间点,得到单帧的显示时间差;
将单位时间除以所述单帧的显示时间差,得到帧率;
获取所述第一函数的函数指针指向的入口地址,得到第三地址;
通过所述第三地址调用所述显示画面函数,将后台绘制好的画面显示到当前界面;
预设颜色匹配表;所述颜色匹配表包含颜色对,所述颜色对中的两种颜色值所表示的颜色互为补色;
获取帧率显示区域的中心点的颜色值,得到第一颜色值;
从所述颜色匹配表中搜索所述第一颜色值对应的补色的颜色值,得到第二颜色值;
设置所述帧率的颜色值为所述第二颜色值;
在当前界面的左上角显示通过第一函数计算得到的帧率的值。
本发明的实施例二为:
第一获取模块中的第七获取模块获取绘图接口地址;所述绘图接口中包含所述显示画面函数;第八获取模块获取所述显示画面函数的偏移量;加模块,用于将所述绘图接口地址加上所述偏移量,得到显示画面函数的入口地址。所述显示画面函数用于将后台绘制好的画面显示在当前界面上;
第一预设模块预设第一函数;所述第一函数用于计算帧率、执行所述显示画面函数的函数体和显示帧率;
第二获取模块获取所述第一函数的入口地址,得到第二地址;
第一设置模块设置所述显示画面函数的函数指针指向所述第二地址;
第二设置模块设置所述第一函数的函数指针指向所述第一地址;
第三获取模块获取当前系统时间,得到当前帧的显示时间点;
第四获取模块获取前一帧的显示时间点;
减模块将所述当前帧的显示时间点减去所述前一帧的显示时间点,得到单帧的显示时间差;
除模块将单位时间除以所述单帧的显示时间差,得到帧率。
第五获取模块获取所述第一函数的函数指针指向的入口地址,得到第三地址;
调用模块通过所述第三地址调用所述显示画面函数;
第二预设模块预设颜色匹配表;所述颜色匹配表包含颜色对,所述颜色对中的两种颜色值所表示的颜色互为补色;
第六获取模块获取帧率显示区域的中心点的颜色值,得到第一颜色值;
搜索模块从所述颜色匹配表中搜索所述第一颜色值对应的补色的颜色值,得到第二颜色值;
第三设置模块设置所述帧率的颜色值为所述第二颜色值;
显示模块在当前界面的左上角显示通过第一函数计算得到的帧率的值。
本发明的实施例三为:
获取DirectX的接口地址;
获取Direct3DDevice9_Present_HookProc函数的偏移量;在DirectX的9.0版本中,Direct3DDevice9_Present_HookProc函数的偏移量为17;
将DirectX的接口地址加上Direct3DDevice9_Present_HookProc函数的偏移量,得到第一地址;Direct3DDevice9_Present_HookProc函数用于将后台绘制好的画面显示在当前界面上;
预设第一函数;第一函数用于计算帧率、执行显示画面函数的函数体和显示帧率;
获取第一函数的入口地址,得到第二地址;
设置Direct3DDevice9_Present_HookProc函数的函数指针指向第二地址;
设置第一函数的函数指针指向第一地址;
当需要将后台绘制好的画面显示到当前界面时,程序调用Direct3DDevice9_Present_HookProc函数,由于此时Direct3DDevice9_Present_HookProc函数的函数指针指向的入口地址为第一函数的入口地址,此时实际上执行的是第一函数的函数体;
获取当前系统时间,得到当前帧的显示时间点;
获取前一帧的显示时间点;
将当前帧的显示时间点减去前一帧的显示时间点,得到单帧的显示时间差;
将单位时间除以单帧的显示时间差,得到帧率;
获取第一函数的函数指针指向的入口地址,得到第三地址;
通过第三地址调用Direct3DDevice9_Present_HookProc函数,将后台绘制好的画面显示到当前界面;
预设颜色匹配表;颜色匹配表包含颜色对,颜色对中的两种颜色值所表示的颜色互为补色;
获取当前帧率显示区域的中心点的颜色为紫色;
从颜色匹配表中搜索到紫色的补色为黄色;
设置帧率的颜色值为黄色;
在当前界面的左上角显示通过第一函数计算得到的帧率的值。
综上所述,本发明提供的一种帧率动态获取的方法及系统,通过调换显示画面函数和第一函数的函数指针所指向的入口地址,实现无需修改源代码即可实时获取当前界面的帧率;所述第一函数用于计算帧率、执行所述显示画面函数的函数体和显示帧率,通过所述第一函数可实时获取当前界面的帧率并显示在当前界面上;进一步地,可实现实时计算当前画面的帧率;进一步地,可实现动态改变帧率的显示颜色,从而突出显示帧率。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等同变换,或直接或间接运用在相关的技术领域,均同理包括在本发明的专利保护范围内。