在玩一些很老的单机游戏时,一般会找时间齿轮软件来使游戏中的时间变慢。
但是,现在的时间齿轮的类似软件在国内都是收费的,可以理解。但是,收费的软件(如果不是刚需)是不可能用的。
查资料,看到cheatEngine也有时间齿轮的功能,试了一下,好使。
现在写个测试程序,来演示cheatEngine的时间齿轮的功能是有效的。
同时演示,如何使用cheatEngine来使程序内部使用的时间函数变慢。
vs2019 vc++ console
// @file testTimeCnt_GetTickCount.cpp
#include <iostream>
#include <iomanip>
#include <conio.h>
#include <windows.h> // 添加 GetTickCount 支持
int main()
{
unsigned long long cnt_sec = 0;
unsigned long long cnt_loop = 0;
// 等待用户按'c'键
std::cout << "Press 'c' to start counting..." << std::endl;
while (true) {
if (_kbhit()) {
char ch = _getch();
if (ch == 'c' || ch == 'C') break;
}
Sleep(10); // Windows 休眠函数替换
}
std::cout << "\rStarting counter... " << std::endl;
DWORD lastTick = GetTickCount(); // 记录起始时间
DWORD nextTime = lastTick + 1000; // 初始目标时间:1秒后 (1000ms)
do {
cnt_loop++;
DWORD currentTick = GetTickCount(); // 替换 steady_clock::now()
// 时间回绕检测(49.7天周期)
if (currentTick < lastTick) {
nextTime = currentTick + 1000; // 重置目标时间
}
lastTick = currentTick; // 更新记录值
if (currentTick >= nextTime) {
cnt_sec++;
std::cout << "\rCount: "
<< std::setw(10) << cnt_sec << "s"
<< std::setw(20) << cnt_loop << "loop"
<< std::flush;
nextTime += 1000; // 增加1秒(1000毫秒)
}
Sleep(0); // 替换 std::this_thread::yield()
} while (true);
}
必须直接运行程序(不能在vs2019中运行(开始执行且不调试)),才能看出时间齿轮有效。

此时,没有cheatEngine的干预,秒数是实际的每一秒变一次。
正常运行10秒钟左右时,进入循环次数为666,313,481次。

此时,有cheatEngine的干预(我在cheatEngine中设置的时间系数为0.02, 使时间变慢50倍),秒数是实际的大概50秒才变一次。
正常运行100秒后,程序认为才走了2秒钟,进入循环次数为516,052,621次。
循环的进入次数,我们就不看了,没大用(没参考意义).
从效果上看, 程序中的时间函数(e.g. GetTickCount()), 确实被hook住了。
可以将时间系数用滑杆减慢为0.25.
如果嫌弃0.25的时间系数不够慢,可以自己在编辑框内填写更小的时间系数,填写完回车,然后再应用即可。
先运行目标程序,在目标程序已经运行的前提下,可以随时用cheatEngine来变化目标程序的时间快慢。




有2种操作方法:
cheatEngine是开源的,如果现成的版本你不满意,可以自己编译修改。
对于如何编译CheatEngine,请查看此文章 CE - cheat-engine-7.2/7.5 编译

