Superponer/Obtener FPS de la ventana

Superponer/Obtener FPS de la ventana

No estoy seguro de si esto es más apropiado en StackExchange, pero ¿cómo superponen los datos programas como Steam (la superposición del juego) y FRAPS en una ventana? Me he dado cuenta de que la superposición/fraps solo puede funcionar en ventanas controladas por opengl/directx, ¿o la superposición es solo una característica de la API de Windows? Además, ¿cómo obtiene fraps los fps de la ventana?

Respuesta1

FRAPS y programas similares funcionan conectando las llamadas API utilizadas para mostrar el marco renderizado (por ejemploIDirect3DDevice9::Presentemétodo o OpenGLIntercambiarBuffers())

Básicamente, cuando un juego está a punto de mostrar un nuevo cuadro, la ejecución del programa se transfiere al gancho instalado por FRAPS. Ese código puede modificar el fotograma como quiera, dibujando el contador de FPS sobre él, cambiando colores o tomando una captura de pantalla para grabar vídeo. Cuando termine, FRAPS llama a la API original para mostrar el marco.

Diferentes API de gráficos necesitan diferentes enlaces, por lo que FRAPS debe tener implementaciones separadas para OpenGL y Direct3D 8/9/10, etc. También significa que cuando se lanzan nuevas tecnologías (como Direct2D), FRAPS necesita actualizaciones para manejarlas.

El proceso real de instalación y extracción de ganchos es bastante complicado; Puede encontrar más información en esta pregunta de StackOverflow:

Conexión de DirectX EndScene desde una DLL inyectada

o aquí:Estudio de caso: Fraps

Contar FPS es sencillo; Los programas sólo necesitan el tiempo transcurrido entre fotogramas. Por ejemplo: tiempo de fotograma = 20 ms; FPS = 1000 ms/20 ms = 50;

Si los tiempos de fotograma varían mucho, el valor de FPS fluctuará enormemente. Un mejor método sería calcular un promedio de los últimos 10 fotogramas o contar el número de fotogramas dibujados en el último segundo. Aunque los números en FRAPS parecen cambiar demasiado rápido.

información relacionada