游戏在运行中为了隔离硬件差异而导致不同电脑中游戏内物体移动速度不同,一般都还采用通过时间变量来计算每一帧移动的距离。全局加速的关键就在于增加每一帧之间的DeltaTime,从而实现移动速度加快。(本实例用到了MinHook。。。)
我只Hook了GetTickCount, GetTickCount64和TimeGetTime这三个系统函数,下面为GetTickCount hook函数原型
#include "MiniHook/MinHook.h"
#define openlog
#include "Log/Log.h"
#include <windows.h>
#pragma comment(lib, "winmm.lib")
typedef DWORD(WINAPI *pfnHookGetTickCount)();
typedef ULONGLONG(WINAPI *pfnHookGetTickCount64)();
typedef DWORD(WINAPI *pfnHookTimeGetTime)();
pfnHookGetTickCount pfnOldTickCount = nullptr;
pfnHookGetTickCount64 pfnOldTickCount64 = nullptr;
pfnHookTimeGetTime pfnOldTimeGetTime = nullptr;
int dwSpeedTimes = 10;
DWORD newGetTickCount()
{
if (!pfnOldTickCount)
{
return 0;
}
static DWORD g_dwRealTick = pfnOldTickCount();
static DWORD g_dwHookTick = pfnOldTickCount();
DWORD tmpTick = pfnOldTickCount();
g_dwHookTick = g_dwHookTick + dwSpeedTimes * (tmpTick - g_dwRealTick);
g_dwRealTick = tmpTick;
return g_dwHookTick;
}
GetTickCount64和TimeGetTime的实现跟GetTickCount类似就不贴了 在Windows平台上还有一个QueryPerformanceCounter函数没有考虑
防全局加速在32位系统上最简单的方式就是直接重载一份kernel32.dll计算重载之后获取的DeltaTime和在游戏中获取的DeltaTime,判断是否加速。