簡體   English   中英

用C ++記錄游戲循環中的時間

[英]Keep track of time in a game loop in C++

從游戲/程序開始以來,如何跟蹤以秒和毫秒為單位的時間? 我可以使用clock()函數,但我聽說它不准確。 有沒有更好的辦法?

你可以在C ++中使用chrono庫這是一個代碼示例:

#include <chrono>
#include <iostream>
using namespace std;
using namespace std::chrono;
int main() {                         
    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 
    high_resolution_clock::time_point t2 = high_resolution_clock::now();  
    duration<double> time_span = duration_cast<duration<double>>(t2 - t1);      
    cout << time_span.count() << " seconds\n";
    return 0; 
} 

注意這個c ++ 11,所以要編譯它,你應該使用標志-std = c ++ 11

$ g++ -std=c++11 test.cpp -o test

這段確切的代碼在我的電腦上給了4e-07秒。

希望有所幫助。

跨平台且簡單的解決方案是使用計時庫

例:

#include <iostream>
#include <chrono>

void gameFunction()
{
    // start()
    // end()
}

int main()
{
    auto t1 = std::chrono::high_resolution_clock::now();
    gameFunction();
    auto t2 = std::chrono::high_resolution_clock::now();

    auto elapsed_time = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();

    std::cout << elapsed_time << std::endl;
    return 0;
}

最后請注意,為此需要至少使用C ++ 11,因此請將-std =標志設置為至少c ++ 11。 例如:

g++ -std=c++11 game.cpp -o game

我強烈建議你看看手工制作的英雄 凱西記錄了一系列視頻集中的整個游戲。 其中一篇早期劇集中,他討論了使用QueryPerformanceCounterQueryPerformanceFrequency確定Windows上的掛鍾時間。

他還討論了使用cpu循環計數,盡管只有假設處理器時鍾速度恆定才有用。

他在后面的劇集中再次談到這些問題: https//hero.handmade.network/episode/game-architecture/day113https://hero.handmade.network/episode/game-architecture/day177

由於您正在尋找游戲循環中的解決方案,因此即使您使用@Pranshu的跨平台解決方案,這些視頻也可能至少會引起您的興趣。 對於使用平台相關方法的游戲,您可能無法獲得更准確的時鍾。

我要指出, high_resolution_clock提供了庫所知的系統可用的最高分辨率時鍾,因此它可能不比使用system_clocksteady_clock更精確。 (它在我的OSX盒子上使用steady_clock 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM