
Não tenho certeza se isso é mais adequado no stackexchange, mas como programas como o Steam (a sobreposição do jogo) e o FRAPS sobrepõem dados em uma janela? Percebi que a sobreposição/fraps só pode funcionar em janelas controladas por opengl/directx ou a sobreposição é apenas um recurso da API do Windows? Além disso, como o fraps obtém o fps da janela?
Responder1
FRAPS e programas similares funcionam conectando as chamadas de API usadas para exibir o quadro renderizado (por exemploIDirect3DDevice9::Presentemétodo ou OpenGLSwapBuffers())
Essencialmente, quando um jogo está prestes a exibir um novo quadro, a execução do programa é transferida para o gancho instalado pelo FRAPS. Esse código pode modificar o quadro da maneira que quiser, desenhando o contador FPS sobre ele, alterando as cores ou fazendo uma captura de tela para gravação de vídeo. Quando terminar, o FRAPS chama a API original para exibir o quadro.
APIs gráficas diferentes precisam de ganchos diferentes, então o FRAPS deve ter implementações separadas para OpenGL e Direct3D 8/9/10 etc. Isso também significa que quando novas tecnologias (como Direct2D) são lançadas, o FRAPS precisa de atualizações para lidar com elas.
O processo real de instalação e remoção de ganchos é bastante complicado; você pode encontrar mais informações nesta pergunta do StackOverflow:
Conectando DirectX EndScene de uma DLL injetada
ou aqui:Estudo de caso: Fraps
Contar FPS é simples; os programas só precisam do tempo decorrido entre os quadros. Por exemplo: tempo de quadro = 20 ms; FPS = 1000ms / 20ms = 50;
Se os tempos de quadro variarem muito, o valor do FPS irá flutuar bastante. Um método melhor seria calcular a média dos últimos 10 quadros ou contar o número de quadros desenhados no último segundo. Embora os números no FRAPS pareçam mudar muito rápido.