Re: [問題] 測量執行時間

看板C_and_CPP (C/C++)作者 (Devil)時間16年前 (2009/11/29 09:40), 編輯推噓9(9018)
留言27則, 5人參與, 最新討論串2/3 (看更多)
給你兩個關鍵字 用法請自行問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

11/29 10:14, , 1F
timeGetTime不知道, 但QueryPerformanceCounter是MS Win
11/29 10:14, 1F

11/29 10:15, , 2F
的API, 應該不會有Intel能用, AMD不能用的問題....@_@"
11/29 10:15, 2F

11/29 10:46, , 3F
11/29 10:46, 3F

11/29 11:21, , 4F
我也知道是API, 但事實就是同個程式, 在我intel上跑
11/29 11:21, 4F

11/29 11:22, , 5F
跟在課堂的AMD上跑, 值完全不同, 害得我不得不用tGT
11/29 11:22, 5F

11/29 11:22, , 6F
本來寫好還得意洋洋的, 想說班上FPS功能我的最精確
11/29 11:22, 6F

11/29 11:23, , 7F
誰知道隔天一到課堂...唉
11/29 11:23, 7F

11/29 11:24, , 8F
最X的是, 問老師, 老師也不肯跟我講解原因...
11/29 11:24, 8F

11/29 12:02, , 9F
3樓k兄連結的文章就有解答了啊 不同的CPU頻率不一樣
11/29 12:02, 9F

11/29 12:04, , 10F
要算時間請把頻率加下去算
11/29 12:04, 10F

11/29 12:08, , 11F
第二個例子是不是少了一次QueryPC的call啊?? 而且應該要
11/29 12:08, 11F

11/29 12:08, , 12F
除某個時脈to時間的轉換常數啊(說常數應該也是OS query
11/29 12:08, 12F

11/29 12:08, , 13F
計算頻率周期的情況下啥CPU都一樣 沒有某牌CPU支援某牌
11/29 12:08, 13F

11/29 12:09, , 14F
HW回來的); 另外, FPS通常不是畫幾張, 然後除以總秒數來
11/29 12:09, 14F

11/29 12:09, , 15F
不支援這種情況你可能要先去了解為什麼這麼做可以算出時間
11/29 12:09, 15F

11/29 12:10, , 16F
算的嗎??為什麼要過一秒重新計算啥的?_?
11/29 12:10, 16F

11/29 12:11, , 17F
FPS的話就 固定時間內累加張數/固定的時間
11/29 12:11, 17F

11/29 12:13, , 18F
應該是像樓上K大說的, 這樣說起來其實一秒也是OK啦Orz
11/29 12:13, 18F

11/29 12:14, , 19F
就是以畫完要測的frame數花了多少時間去除一下就是了:)
11/29 12:14, 19F

11/29 12:38, , 20F
QueryPC + Sleep(1000) + QueryPC = 1 秒的 counter
11/29 12:38, 20F

11/29 12:40, , 21F
天啊, 有準到這麼誇張喔@_@" 那sleep(1)好了....XD
11/29 12:40, 21F

11/29 12:41, , 22F
Sleep (1) ~ Sleep (15) 都是 16ms 喔
11/29 12:41, 22F

11/29 12:44, , 23F
結果我忘記有 QueryPerformanceFrequency
11/29 12:44, 23F

11/29 12:44, , 24F
但是我個人還是比較喜歡 GetTickCount
11/29 12:44, 24F

11/29 12:45, , 25F
雖然沒有 QueryPerformanceCount 準
11/29 12:45, 25F

11/29 12:46, , 26F
但是 GetTickCount 的 latency 是最短的
11/29 12:46, 26F

11/29 18:46, , 27F
又新看到了一個GetTickCount了....@_@"
11/29 18:46, 27F
文章代碼(AID): #1B4T4DVi (C_and_CPP)
文章代碼(AID): #1B4T4DVi (C_and_CPP)