Korzystanie regularne stare timeGetTime()
zrobić taktowanie nie jest niezawodny od wielu opartych na systemie Windows systemów operacyjnych ponieważ ziarnistość systemu timera może być tak wysokie, jak 10-15 milisekund , co oznacza, że timeGetTime()
jest dokładna tylko do 10-15 milisekund. [Należy zauważyć, że wysoka rozdzielczość graniczna występuje w systemach operacyjnych opartych na NT , takich jak Windows NT, 2000 i XP. Windows 95 i 98 mają tendencję mieć znacznie lepszą szczegółowość, około 1-5 ms.]
Jednak jeśli zadzwonisz timeBeginPeriod(1)
na początku programu (i timeEndPeriod(1)
na końcu), będzie zazwyczaj timeGetTime()
uzyskają dokładność do 1-2 milisekund, i dostarczą ci bardzo dokładnych informacji na temat czasu w zakresie .
Sleep()
zachowuje się podobnie; długość czasu, Sleep()
rzeczywiście śpi dla idzie ręka w rękę z ziarnistości timeGetTime()
, więc po nazywając timeBeginPeriod(1)
raz Sleep(1)
rzeczywiście spać przez 1-2 milisekund Sleep(2)
2-3, a więc na (zamiast spać w przyrostach tak wysokie, jak 10-15 ms).
Dla większej precyzji czasu (dokładność sub-milisekundy), będziesz prawdopodobnie chciał uniknąć stosując montaż mnemoniczny RDTSC ponieważ jest ciężko skalibrować; zamiast tego należy użyć wartości i QueryPerformanceCounter
z dokładnością do mniej niż 10 mikrosekund (0,00001 sekund).
Do prostego czasu, zarówno timeGetTime i QueryPerformanceCounter działa dobrze, i QueryPerformanceCounter jest oczywiście bardziej dokładne. Jednakże, jeśli trzeba zrobić wszelkiego rodzaju „czasowych przerw” (takie jak te niezbędne dla framerate ograniczenie), trzeba być ostrożny siedzieć w pętli wywołującego QueryPerformanceCounter, czekając na to, aby osiągnąć pewien wartość; to będzie pochłonąć 100% swojego procesora. Zamiast rozważać hybrydowy system, gdzie można zadzwonić do spania (1) (nie zapomnij timeBeginPeriod (1) po raz pierwszy!) Ilekroć trzeba przejść więcej niż 1 ms od czasu, a następnie wprowadź tylko QueryPerformanceCounter 100% -busy pętli , aby zakończyć ostatni < 1/1000th z sekundy opóźnienia, czego potrzebujesz. Ten da Ci wyjątkowo dokładne opóźnienia (z dokładnością do 10 mikrosekund), przy bardzo niewielkim obciążeniu procesora przez . Zobacz kod powyżej.
Należy unikać timeBeginPeriod(); wpływa na systemowy harmonogram i może powodować problemy z oszczędzaniem energii. – MSalters