3

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

1 ответ1

6

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .