2011-12-13 65 views
2

對於一個學校的項目,我需要(重新)創建的R型全功能的多玩家版本,無需使用以下的外部庫:如何在C++中創建有效的便攜式計時器?

  • 升壓
  • SFML/SDL
  • 的Qt
  • 使用C++ 11不允許

此外,本場比賽必須的Fedora(Linux)的和Windows之間完全可移植的。我負責服務器,嚴禁使用任何圖形庫。

爲了創建一個正確的遊戲循環我需要一個正確定時器類,如那些在SDL發現了類似的,它實現GetTicks()或GetElapsedTime()方法。但是我問自己什麼是創造這樣一個類的最佳方式,到目前爲止,這是我會怎麼開始:

  • 使用並行線程(這是便攜式)
  • ,用函數的時候創建一個線程級()和difftime()循環來確定自上次打勾以來經過了多長時間。

由於知道這個類將被許多實例同時使用,我應該使用Singleton設計模式嗎?這種方法是否準確?

編輯:改變了我的問題的解釋,以適應更多我的需求,並更準確地允許我可以使用或不允許使用。

+3

呃,pthreads是**不是** C++的一部分。 – 2011-12-13 21:38:29

+4

如果你不能使用外部庫,你也無法做圖形。所以基本上,你的要求自相矛盾。 – jalf 2011-12-13 21:41:27

+0

你可以使用C++ 11嗎?然後你可以使用新的計時器。另外,我想知道你是如何創建你的圖形的,因爲C++沒有附帶任何圖形庫......所以你可能被允許使用一些你忘記告訴我們的庫? – PlasmaHH 2011-12-13 21:42:15

回答

2

這裏沒有一個簡單的方法做,你在想什麼。幸運的是,有很多簡單的方法可以做你想做的事情。

第一:Using the functions time() and difftime() in a loop to determine how much time was elapsed這是一個可怕的想法。這將使用你的一個CPU的100%,從而減慢你的程序的抓取速度。如果您想等待特定時間(1/60秒或1/10秒的「滴答」),那就等着。不要旋轉線程。

頭:

long long get_time(); 
long long get_freq(); 
void wait_for(long long nanoseconds); 

CPP:

#ifdef _MSC_VER //windows compiler for windows machines 
long long get_time() { 
    LARGE_INTEGER r; 
    QueryPerformanceCounter(r); 
    return r.QuadPart; 
} 
long long get_freq() { 
    LARGE_INTEGER r; 
    QueryPerformanceFrequency(r); 
    return r.QuadPart; 
} 
void wait_for(long long nanoseconds) 
{ 
    Sleep(nanoseconds/1000000); 
} 
#endif 
#ifdef __GNUC__ //linux compiler for linux machines 
long long get_time() { 
    timespec r 
    clock_gettime(CLOCK_MONOTONIC, &r); 
    return long long(r.seconds)*1000000000 + r.nanoseconds; 
} 
long long get_freq() { 
    timespec r 
    clock_getres(CLOCK_MONOTONIC, &r); 
    return r.nanoseconds; 
} 
void wait_for(long long nanoseconds) 
{ 
    timespec r = {nanoseconds/1000000000, nanoseconds%1000000000}; 
    nanosleep(&r, NULL); 
} 
#endif 

這一切都不是完美的(尤其是因爲我沒有爲Linux代碼),但是這是當你要處理的一般概念與操作系統(因爲它不符合標準,你不能使用庫)。在Windows和海灣合作委員會實現可以在單獨的文件,如果你喜歡

0

您可能想要爲Linux創建一個包含gettimeofday的包裝,它將返回自Epoch以來的微秒數,而GetTickCount用於Windows,它返回自系統啓動以來的毫秒數。

您也可以在Windows上使用clock(),該過程啓動後將返回秒* CLOCKS_PER_SEC(是,掛鐘時間不是CPU時間)。

1

鑑於規範並行線程都出來了,不會在Windows中,沒有包括在標準運行。

如果你可以使用C++ 11可以使用std ::計時的計時器,這是一個高精度定時器,一個相當直觀的界面。它基本上已經從boost中解除了(因爲有線程),所以boost的大部分文檔都轉換爲std :: chrono。 (或低精度只使用C時庫)和線程,你可以使用std ::線程。

N.B.這些標準庫的元素,你只是在你的平臺上創建測試,以確保你正在使用的stdlib支持它們(你需要啓用C++ 11 - 通常是--std = C++ 0x)

I確切地知道,gcc 4.6擁有大部分線程和計時器,並且似乎是穩定的。

0

爲了讓您可以在POSIX系統(Linux的CLOCK_MONOTONIC_RAW 2.6.28+)使用QueryPerformanceCounter在Windows和clock_gettime()CLOCK_MONOTONIC牆時間。