本发明涉及计算机进程优化技术领域,具体涉及一种优化游戏进程CPU使用率的系统及方法。
背景技术:
目前,对于PC端的游戏直播方法是主播一边运行游戏进程,一边通过一个直播软件来获取游戏的画面,并对画面进行视频编码,再通过网络发送到直播网站的服务器,供观众通过网络下载视频流进行观看。由于大型网络游戏本身对电脑CPU资源的占用率很高,加上视频的编码和解密也比较消耗电脑CPU的资源,要实现流畅的游戏直播对主播的电脑配置,网络配置的要求都相当高。一些主播的电脑配置或网络带宽比较低的情况下,就无法顺畅进行游戏直播。
现有技术存在针对游戏进程源代码开发的降低游戏进程CPU使用率的技术方案,但是,游戏进程源代码一般属于游戏开发商所有,主播或一般游戏用户较难获取,且针对某个游戏源代码开发的CPU使用率的技术方案无法适用于其他游戏,不具有通用性,从而开发成本太高而通用性差。因此,亟需一种能够通用的降低游戏进程CPU使用率的技术方案。
技术实现要素:
针对现有技术中存在的缺陷,本发明的目的在于提供一种优化游戏进程CPU使用率的系统及方法,可有效降低游戏进程CPU使用率且可通用于各种游戏进程。
为达到以上目的,本发明采取的技术方案是:一种优化游戏进程CPU使用率的系统,包括:
地址获取模块,用于获取游戏进程中Present函数的内存地址;
Hook模块,用于在游戏进程中对所述Present函数增加一个MyPresent函数,使用所述Present函数的内存地址将所述Present函数与MyPresent函数进行挂钩;
sleep函数加入模块,用于对所述MyPresent函数增加一个sleep函数;所述sleep函数用于暂停Present函数的执行。
在上述技术方案的基础上,所述Hook模块包括函数加入单元和函数挂钩单元:
所述函数加入单元用于在游戏进程中对所述Present函数增加一个MyPresent函数;
所述函数挂钩单元用于通过系统Detours库的API函数使用所述Present函数的内存地址将MyPresent函数与游戏进程中的Present函数进行挂钩。
在上述技术方案的基础上,所述优化游戏进程CPU使用率的系统还包括时间参数设置模块,用于设置sleep函数的时间参数,所述时间参数为调用所述sleep函数暂停Present函数的时长。
在上述技术方案的基础上,所述时间参数为可调的。
在上述技术方案的基础上,所述时间参数为30毫秒。
一种采用优化游戏进程CPU使用率的系统的优化游戏进程CPU使用率的方法,包括:
S1,通过所述地址获取模块获取游戏进程中Present函数的内存地址;
S2,通过所述Hook模块在游戏进程中对所述Present函数增加一个MyPresent函数,使用所述Present函数的内存地址将所述Present函数与MyPresent函数进行挂钩;
S3,通过所述sleep函数加入模块对所述挂钩函数增加一个sleep函数;所述sleep函数用于暂停Present函数的执行;
S4,通过所述时间参数设置模块设置sleep函数的时间参数,所述时间参数为调用所述sleep函数暂停Present函数的时长。
在上述技术方案的基础上,步骤S1包括:
通过所述地址获取模块查找Present函数在系统的DirectX提供的d3d9.h文件中的函数列表序号,通过该序号可以获取Present函数的内存地址。
在上述技术方案的基础上,步骤S2包括:
通过所述Hook模块在游戏进程中对所述Present函数增加一个MyPresent函数;
通过系统Detours库的API函数使用所述Present函数的内存地址将MyPresent函数与游戏进程中的Present函数进行挂钩。
在上述技术方案的基础上,通过所述Hook模块在游戏进程中增加一个MyPresent函数包括:
通过所述Hook模块在游戏进程的内存空间中分配一个内存;
将MyPresent函数的磁盘路径写入到已经分配的内存中;
在游戏进程中创建一个线程,通过所述线程加载MyPresent函数的磁盘路径。
在上述技术方案的基础上,所述时间参数为30毫秒。
与现有技术相比,本发明的优点在于:
本发明通过在游戏进程中对其Present函数增加一个MyPresent函数,将Present函数与MyPresent函数进行挂钩;再对MyPresent函数增加一个sleep函数,这样每次调用Present函数时,均会调用sleep函数暂停Present函数的执行。由于在游戏进程中每渲染一帧画面的时候会调用一次Present函数,因此通过加入sleep函数暂停Present函数的执行,可以减少Present函数的调用次数,从而减少一秒钟内在游戏进程中渲染画面的次数。由于游戏进程中消耗CPU资源比较高的进程之一便是渲染游戏画面的进程,因此,减少游戏进程中渲染画面的次数可以实现降低游戏进程CPU使用率的目的。同时,修改游戏进程中渲染次数是对绝大部分游戏都通用的一个方法,因此,此方案适用于各种游戏进程。
附图说明
图1为本发明实施例中优化游戏进程CPU使用率的系统的结构示意图;
图2为本发明实施例中优化游戏进程CPU使用率的方法的流程示意图。
具体实施方式
以下结合附图及实施例对本发明作进一步详细说明。
参见图1所示,本发明实施例提供一种优化游戏进程CPU使用率的系统,包括:
地址获取模块,用于获取游戏进程中Present函数的内存地址;
Hook模块,用于在游戏进程中对所述Present函数增加一个MyPresent函数,使用所述Present函数的内存地址将所述Present函数与MyPresent函数进行挂钩;
sleep函数加入模块,用于对所述MyPresent函数增加一个sleep函数;所述sleep函数用于暂停Present函数的执行。
所述Hook模块包括函数加入单元和函数挂钩单元:
所述函数加入单元用于在游戏进程中对所述Present函数增加一个MyPresent函数;
所述函数挂钩单元用于通过系统Detours库的API函数使用所述Present函数的内存地址将MyPresent函数与游戏进程中的Present函数进行挂钩。
所述优化游戏进程CPU使用率的系统还包括时间参数设置模块,用于设置sleep函数的时间参数,所述时间参数为调用所述sleep函数暂停Present函数的时长。所述时间参数为可调的。所述时间参数为30毫秒。
例如,sleep函数的时间参数的数值越大,那么CPU的消耗越小,同时1秒内渲染的游戏画面也越少。只要游戏画面看起来是连贯的,则可以继续改大sleep函数的时间参数,直到游戏画面产生卡顿,则说明sleep函数的时间参数过大,应当相应改小。
本发明通过在游戏进程中对其Present函数增加一个MyPresent函数,将Present函数与MyPresent函数进行挂钩;再对MyPresent函数增加一个sleep函数,这样每次调用Present函数时,均会调用sleep函数暂停Present函数的执行。由于在游戏进程中每渲染一帧画面的时候会调用一次Present函数,因此通过加入sleep函数暂停Present函数的执行,可以减少Present函数的调用次数,从而减少一秒钟内在游戏进程中渲染画面的次数。由于游戏进程中消耗CPU资源比较高的进程之一便是渲染游戏画面的进程,因此,减少游戏进程中渲染画面的次数可以实现降低游戏进程CPU使用率的目的。同时,修改游戏进程中渲染次数是对绝大部分游戏都通用的一个方法,因此,此方案适用于各种游戏进程。
一种采用优化游戏进程CPU使用率的系统的优化游戏进程CPU使用率的方法,包括:
S1,通过所述地址获取模块获取游戏进程中Present函数的内存地址;
S2,通过所述Hook模块在游戏进程中对所述Present函数增加一个MyPresent函数,使用所述Present函数的内存地址将所述Present函数与MyPresent函数进行挂钩;
S3,通过所述sleep函数加入模块对所述挂钩函数增加一个sleep函数;所述sleep函数用于暂停Present函数的执行;
S4,通过所述时间参数设置模块设置sleep函数的时间参数,所述时间参数为调用所述sleep函数暂停Present函数的时长。所述时间参数为30毫秒。
步骤S1包括:
通过所述地址获取模块查找Present函数在系统的DirectX提供的d3d9.h文件中的函数列表序号,通过该序号可以获取Present函数的内存地址。
例如,通过系统的IDirect3D9Ex的接口CreateDeviceEx来创建一个IDirect3DDevice9Ex对象,通过在DirectX提供的SDK的d3d9.h的文件中,查找IDirect3DDevice9Ex对象的Present函数所在函数列表的序号,如序号是17,通过该序号可以获取到Present函数的内存地址,即通过C++虚表函数地址获取,获取IDirect3DDevice9Ex对象的虚表指针的地址,从该地址加上17*4就可以获取到Present函数所在的内存地址。
步骤S2包括:
通过所述Hook模块在游戏进程中增加一个MyPresent函数;
通过系统Detours库的API函数使用所述Present函数的内存地址将MyPresent函数与游戏进程中的Present函数进行挂钩。
例如,(1)首先定义一个MyPresent函数用于调用Present函数:
static HRESULT WINAPI MyPresent(LPDIRECT3DDEVICE9 device,
THIS_CONST RECT*pSourceRect,
CONST RECT*pDestRect,
HWND hDestWindowOverride,
CONST RGNDATA*pDirtyRegion)。
其中,static HRESULT WINAPI MyPresent()表示MyPresent函数的声明,括号内表示其参数和返回值。其中,LPDIRECT3DDEVICE9device表示D3D9的设备指针,参数pSourceRect填入空值。参数pDestRect填入空值。参数hDestWindowOverride填入空值。参数pDirtyRegion填入空值。
(2)然后使用Detours库的API函数来对Present进行HOOK。
DetourAttach(system_present,MyPresent);此函数的意思是将系统的Present函数替换成MyPresent函数。其中system_present则为的Present函数的内存地址,即是步骤S1中获取到的Present函数的内存地址。
通过所述Hook模块在游戏进程中增加一个MyPresent函数包括:
通过所述Hook模块在游戏进程的内存空间中分配一个内存;
将MyPresent函数的磁盘路径写入到已经分配的内存中;
在游戏进程中创建一个线程,通过所述线程加载MyPresent函数的磁盘路径。
例如,通过VirtualAllocEx函数在游戏进程的内存空间中分配一个内存;
通过WriteProcessMemory来将MyPresent函数的磁盘路径写入到已经分配的内存中;
调用CreateRemoteThread函数来在游戏进程中创建一个线程,线程的执行逻辑就是调用LoadLibrary来加载步骤2中通过在游戏进程的内存空间中写入的磁盘路径。这样就实现了在游戏进程中开启一个线程,通过线程来加载MyPresent函数。
本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。