覆盖/获取窗口的 F​​PS

agz*_*agz 3 windows steam directx overlay fraps

我不确定这在 stackexchange 中是否更合适,但是诸如 Steam(游戏覆盖)和 FRAPS 之类的程序如何在窗口上覆盖数据?我注意到叠加层/帧只能在由 opengl/directx 驱动的窗口上工作,或者叠加层只是 Windows api 中的一个功能?另外, fraps 如何获得窗口的fps?

小智 6

FRAPS 和类似程序通过挂钩用于显示渲染帧的 API 调用来工作(例如IDirect3DDevice9::Present方法或 OpenGL SwapBuffers()

本质上,当游戏即将显示新帧时,程序执行会转移到 FRAPS 安装的钩子上。该代码可以以任何方式修改帧,在其上绘制 FPS 计数器,更改颜色或截取视频录制的屏幕截图。完成后 FRAPS 调用原始 API 来显示帧。

不同的图形 API 需要不同的钩子,所以 FRAPS 必须有针对 OpenGL 和 Direct3D 8 / 9 / 10 等的单独实现。这也意味着当新技术(如 Direct2D)发布时,FRAPS 需要更新来处理这些。

安装和移除钩子的实际过程相当复杂;您可以在此 StackOverflow 问题中找到更多信息:

从注入的 DLL 中挂钩 DirectX EndScene

或在这里:案例研究:Fraps

计算 FPS 很简单;程序只需要帧之间经过的时间。例如:帧时间 = 20 ms;FPS = 1000 毫秒 / 20 毫秒 = 50;

如果帧时间变化很大,FPS 值会剧烈波动。更好的方法是计算最后 10 帧的平均值或计算最后一秒绘制的帧数。尽管 FRAPS 中的数字似乎变化太快。