Тема: NT Sleep
Свершилось то, о чем многие давно мечтали. Все (ну или многие) наверное знакомы с таким классом утилит как "замедлялки игр". Мне попадалось несколько вариантов этих программ, но работают они по одному и тому же принципу - раскочегарить процессор, чтоб последнему не хватало времени на обработку приложения, вследствии чего и достигается мнимое замедление процесса. Мнимое, потому что:
1. игра начинает "идти" рывками
2. процессор греется как при хорошем benchmark-е, что уменьшает срок его службы
3. вентиляторы гудят так, что создается ощущение что компьютер вот-вот взлетит
Но и без этих горе-замедлителей игры грузят современные процессоры так, будто запущена последняя версия навороченного 3D шутера. Такого быть не должно и где то с год назад я стал изучать "проблему". Одним из вариантов решения и явилась программа которую сегодня я предлагаю вам на рассмотрение.
Суть следующая, создается ждущий таймер установленный на 10 микросекунд, и с помощью недокументированных функций Windows XP (NtSuspendProcess и NtResumeProcess) указанная(ое) игра\приложение попеременно то приостанавливается то возобновляется с интервалом в 10 микросекунд, на выполнение кода приложению отводится 1 микросекунда, что равняется 10 кратному снижению скорости и нагрузки на процессор.
Вот фрагмент того, о чем писал выше.
Тестировал Populous, WipeOut, Heroes of Might and Magic 1 и 2, KKND2 и др. варьируя значение микросекунд от 2 до 32. Получил следующие результаты:
- при установке даже 2мс значительно снижается нагрузка на процессор до 10%, игра работает без замедлений
- при повышении таймера, нагрузка снижается до 2-3%, при этом игра начинает замедлятся
При установке значения в 32мс мне удалось заставить работать Героев так, как если бы я играл на первом пентиуме (фактически я эмулировал его скорость), и процессор при этом оставался в полном покое.
Программу выкладываю с исходными текстами. Запускается она из командной строки и работает только начиная с Windows XP (предположительно XP, 2003, Vista), в качестве параметра указывается EXE файл.