
Я не уверен, что это более правильно в stackexchange, но как такие программы, как steam (игровой оверлей) и FRAPS, накладывают данные на окно? Я заметил, что оверлей/fraps может работать только на окнах, которые управляются opengl/directx, или оверлей — это просто функция в api windows? Кроме того, как fraps получает fps окна?
решение1
FRAPS и подобные программы работают, перехватывая вызовы API, используемые для отображения визуализированного кадра (например,IDirect3DDevice9::Присутствуетметод или OpenGLSwapBuffers())
По сути, когда игра собирается отобразить новый кадр, выполнение программы передается в хук, установленный 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, похоже, меняются слишком быстро.