FRAPS и подобные программы работают, перехватывая вызовы API, используемые для отображения визуализированного фрейма (например, метод IDirect3DDevice9 :: Present или OpenGL SwapBuffers () )
По сути, когда игра собирается отобразить новый кадр, выполнение программы переносится на хук, установленный FRAPS. Этот код может изменить кадр так, как он хочет, рисуя счетчик FPS поверх него, меняя цвета или делая снимок экрана для видеозаписи. Когда это закончено, FRAPS вызывает оригинальный API для отображения фрейма.
Разные графические API-интерфейсы требуют разных хуков, поэтому FRAPS должны иметь отдельные реализации для OpenGL и Direct3D 8/9/10 и т. Д. Это также означает, что когда новые технологии (например, Direct2D) будут выпущены, FRAPS потребуются обновления для их обработки.
Фактический процесс установки и удаления крючков довольно запутан; Вы можете найти больше информации в этом вопросе StackOverflow:
Подключение DirectX EndScene из внедренной DLL
или здесь: Пример использования: Fraps
Подсчет FPS прост; программам просто нужно время между кадрами Например: время кадра = 20 мс; FPS = 1000 мс / 20 мс = 50;
Если время кадра сильно варьируется, значение FPS будет сильно колебаться. Лучшим методом будет вычисление среднего значения за последние 10 кадров или подсчет количества кадров, нарисованных за последнюю секунду. Хотя числа в FRAPS, похоже, меняются слишком быстро.