Оверлей / Получить FPS окна

Я не уверен, является ли это более правильным в stackexchange, но как такие программы, как steam (игровое наложение) и FRAPS, накладывают данные на окно? Я заметил, что оверлей / фрапс может работать только на окнах, управляемых opengl/directx, или оверлей - это просто функция в Windows API? Кроме того, как Fraps получает FPS окна?

1 ответ

Решение

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, похоже, меняются слишком быстро.

Другие вопросы по тегам