
我不確定這在 stackexchange 中是否更合適,但是 steam(遊戲覆蓋)和 FRAPS 等程式如何在視窗上覆蓋資料?我注意到overlay/fraps只能在opengl/directx驅動的Windows上工作,或者overlay只是windows api中的功能?另外,fraps如何取得視窗的fps?
答案1
FRAPS 和類似程式透過掛鉤用於顯示渲染幀的 API 呼叫來運作(例如IDirect3DDevice9::存在方法或OpenGL交換緩衝區())
本質上,當遊戲即將顯示新幀時,程式執行會轉移到 FRAPS 安裝的鉤子上。該程式碼可以以任何想要的方式修改幀,在其上繪製 FPS 計數器、更改顏色或拍攝視訊錄製螢幕截圖。完成後,FRAPS 呼叫原始 API 來顯示框架。
不同的圖形 API 需要不同的鉤子,因此 FRAPS 必須對 OpenGL 和 Direct3D 8 / 9 / 10 等有單獨的實作。
實際安裝和拆卸鉤子的過程相當複雜;您可以在此 StackOverflow 問題中找到更多資訊:
或在這裡:案例研究:Fraps
計算 FPS 很簡單;程式只需要幀之間經過的時間。例如:幀時間=20ms; FPS = 1000 毫秒 / 20 毫秒 = 50;
如果幀時間變化很大,FPS 值就會大幅波動。更好的方法是計算最後 10 幀的平均值或計算最後一秒繪製的幀數。儘管FRAPS中的數字似乎變化得太快了。