看板 C_and_CPP 關於我們 聯絡資訊
給你兩個關鍵字 用法請自行問google大神吧@@ 第一個是 timeGetTime(); 大約能取到0.001秒附近 沒有太過精密的需求的話 這個應該很夠用了 第二個是 QueryPerformanceCounter(); 這個聽老師講解是說, 這函式能從CPU取什麼共振時間出來 從共振時間差來計算精密的時間差距 聽兩位指導我的老師都說 遊戲業界好像都用這個在做FPS計算 但是我自己實際做了以後 不知道哪邊寫得不好 寫出來的函式只能適用于intel的CPU 無法適用于AMD的CPU 以下把兩個版本的FPS計算函式貼上 順便請路過此地的高手指教指教小弟@@ 如果有更好的方法, 小弟也非常樂意聆聽教導@@ void c_DLIB::ShowFPSin(int X, int Y) { //取得時間 //DeBugMSG("timeGetTime", (float)timeGetTime(), 20, X, Y); if(!isOnOff) { //主要目的:取得secondTime firstTime = timeGetTime(); secondTime = firstTime + 1000; isOnOff = true; } else if(isOnOff) { firstTime = timeGetTime(); if(secondTime <= firstTime) { //主要目的: 告知系統, 已經過了1秒, 重新統計FPS isOnOff = false; MAX_FPS = FPS; FPS = 0; } } FPS++; std::string MSG = "FPS:"; MSG.append(int2str(MAX_FPS)); DeBugMSG(MSG, 20, X, Y); } void c_DLIB::ShowFPSin(int X, int Y) { //取得時間 QueryPerformanceCounter(&time); if(!isOnOff) { //主要目的:取得secondTime firstTime = time.HighPart; secondTime = firstTime + 1; isOnOff = true; } else if(isOnOff) { firstTime = time.HighPart; if(secondTime <= firstTime) { //主要目的: 告知系統, 已經過了1秒, 重新統計FPS isOnOff = false; MAX_FPS = FPS; FPS = 0; } } FPS++; std::string MSG = "FPS:"; MSG.append(int2str(MAX_FPS)); DeBugMSG(MSG, 20, 1, X, Y); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.133.240
VictorTom:timeGetTime不知道, 但QueryPerformanceCounter是MS Win 11/29 10:14
VictorTom:的API, 應該不會有Intel能用, AMD不能用的問題....@_@" 11/29 10:15
kikiqqp:#164zcwEZ 11/29 10:46
devilarise:我也知道是API, 但事實就是同個程式, 在我intel上跑 11/29 11:21
devilarise:跟在課堂的AMD上跑, 值完全不同, 害得我不得不用tGT 11/29 11:22
devilarise:本來寫好還得意洋洋的, 想說班上FPS功能我的最精確 11/29 11:22
devilarise:誰知道隔天一到課堂...唉 11/29 11:23
devilarise:最X的是, 問老師, 老師也不肯跟我講解原因... 11/29 11:24
jhchou:3樓k兄連結的文章就有解答了啊 不同的CPU頻率不一樣 11/29 12:02
jhchou:要算時間請把頻率加下去算 11/29 12:04
VictorTom:第二個例子是不是少了一次QueryPC的call啊?? 而且應該要 11/29 12:08
VictorTom:除某個時脈to時間的轉換常數啊(說常數應該也是OS query 11/29 12:08
kikiqqp:計算頻率周期的情況下啥CPU都一樣 沒有某牌CPU支援某牌 11/29 12:08
VictorTom:HW回來的); 另外, FPS通常不是畫幾張, 然後除以總秒數來 11/29 12:09
kikiqqp:不支援這種情況你可能要先去了解為什麼這麼做可以算出時間 11/29 12:09
VictorTom:算的嗎??為什麼要過一秒重新計算啥的?_? 11/29 12:10
kikiqqp:FPS的話就 固定時間內累加張數/固定的時間 11/29 12:11
VictorTom:應該是像樓上K大說的, 這樣說起來其實一秒也是OK啦Orz 11/29 12:13
VictorTom:就是以畫完要測的frame數花了多少時間去除一下就是了:) 11/29 12:14
wowtiger:QueryPC + Sleep(1000) + QueryPC = 1 秒的 counter 11/29 12:38
VictorTom:天啊, 有準到這麼誇張喔@_@" 那sleep(1)好了....XD 11/29 12:40
wowtiger:Sleep (1) ~ Sleep (15) 都是 16ms 喔 11/29 12:41
wowtiger:結果我忘記有 QueryPerformanceFrequency 11/29 12:44
wowtiger:但是我個人還是比較喜歡 GetTickCount 11/29 12:44
wowtiger:雖然沒有 QueryPerformanceCount 準 11/29 12:45
wowtiger:但是 GetTickCount 的 latency 是最短的 11/29 12:46
VictorTom:又新看到了一個GetTickCount了....@_@" 11/29 18:46