Sobreposição / Obter FPS da janela

3

Não tenho certeza se isso é mais apropriado na troca de pilha, mas como programas como o steam (sobreposição de jogos) e FRAPS sobrepõem dados em uma janela? Notei que a sobreposição / fraps só pode funcionar em janelas que são controladas por opengl / directx, ou a sobreposição é apenas um recurso na API do Windows? Além disso, como o fraps obtém os fps da janela?

agz
fonte

Respostas:

6

FRAPS e programas similares funcionam conectando as chamadas de API usadas para exibir o quadro renderizado (por exemplo, método IDirect3DDevice9 :: Present ou OpenGL SwapBuffers () )

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 desejar, desenhando o contador FPS sobre ele, alterando cores ou capturando 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; portanto, o FRAPS deve ter implementações separadas para OpenGL e Direct3D 8/9/10 etc. Isso também significa que quando novas tecnologias (como o 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 o DirectX EndScene a partir de uma DLL injetada

ou aqui: Estudo de caso: Fraps

Contar FPS é simples; programas só precisam do tempo decorrido entre os quadros. Por exemplo: tempo de quadro = 20 ms; FPS = 1000 ms / 20 ms = 50;

Se os tempos de quadro variarem muito, o valor do FPS flutuará bastante. Um método melhor seria calcular uma 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.

Ryck
fonte
Seria também assim que a sobreposição de vapor funciona?
AGZ
Sim, geralmente a cada software que exibe uma sobreposição em aplicativos OpenGL ou D3D tela cheia funciona da mesma maneira
Ryck