Όντως καλό το άρθρο για το game loop. Ό,τι και αν κάνεις να έχεις υπόψιν σου ότι το ζήτημα του timing είναι εξαιρετικά πολύπλοκο. Γι'αυτό και κάποιοι ονομάζουν τα λειτουργικά τους Real Time. Γιατί εκεί το λειτουργικό εγγυάται όμορφα πράγματα σχετικά με το timing.
Ένα άλλο άρθρο που μπορείς να δει όποιος θέλει να εμβαθύνει στο ζήτημα είναι το http://msdn.microsoft.com/msdnmag/issues/04/03/HighResolutionTimer/
Επιπλέον θα ήθελα να αναφέρω τα εξής:
- Υπάρχει ένα ωραίο φρούτο που λέγεται waitable timers (CreateWaitableTimer). Για όσους τα WM_TIMER δεν εξυπηρετούν. Αυτή και καλά δουλεύει με μεγάλο accuracy αλλά άλλο πράγμα το πότε έγινε set ένα event και άλλο το πότε θα τρέξει το thread που κάνει wait σε αυτό το event. Αν όμως το thread δεν κάνει wait αλλά test μέσα σε ένα tight loop όπου κάνει και άλλα πράγματα τότε ίσως κάτι καλό να παίζεται.
- Υπάρχει η υπεραγαπημένη μου function η MsgWaitForMultipleObjects(Ex) με την οποία σε συνδιασμό με ότι timer χρησιμοποιείς μπορείς να κοντρολλάρεις τα πράγματα με μαγικό τρόπο χωρίς να καλείς την PeekMessage τόσο συχνά ώστε να χτυπά 100% CPU το μηχάνημα.
- Υπάρχει η GetSystemTimeAdjustment με την οποία μπορείς να ανακαλύψεις προγραμματιστικά το timer resolution των windows στο PC σου, δηλαδή κάθε πότε βαράει το clock interrupt (η δεύτερη output parametros). Αυτό είναι στενά συνδεδεμένο με το resolution της GetTickCount. Το σχετικό utility βρίσκεται στο http://www.sysinternals.com/Utilities/ClockRes.html
- Τέλος πολλές φορές μπορείς να βρεις ένα καλό και εξαιρετικά αξιόπιστο hi-res ρολογάκι αν απλά κοιτάξεις μέσα στο PC σου. Π.χ. πλέον όλα τα mobos έχουν 1394 (FireWire) on board. Και το 1394 έχει ένα ρολόι με διακριτικότητα 125μsec, δηλαδή χτυπάει 8125 φορές το δευτερόλεπτο. Και είναι hardware timer που δεν κάνει drift ποτέ των ποτών. Κάνει wrap κάθε 128 sec. Όποιος θέλει πληροφορίες για αυτό ας μου μιλήσει.
Τέλος για όποιον νιώθει γενναίος και του αρέσει να βαδίζει σε παρθένα εδάφη υπάρχει το /TIMERES switch του boot.ini. Αντιγράφω από το http://www.sysinternals.com/Information/bootini.html
/TIMERES= Sets the resolution of the system timer on the standard x86 multiprocessor HAL (Halmps.dll). The argument is a number interpreted in hundreds of nanoseconds, but the rate is set to the closest resolution the HAL supports that isn't larger than the one requested. The HAL supports the following resolutions:
Hundreds of nanoseconds Milliseconds (ms)
9766 0.98
19532 2.00
39063 3.90
78125 7.80
The default resolution is 7.8 ms. The system timer resolution affects the resolution of waitable timers. Example: /TIMERES=21000 would set the timer to a resolution of 2.0 ms.
Όπως καταλαβαίνετε το /TIMERES δεν είναι κάτι που βάζετε ελαφρά τη καρδία στο setup του game σας. Αν όμως έχετε μια εξαιρετικά custom εφαρμογή που είναι timing sensitive τότε μπορεί να βοηθήσει πολύ.
Δημήτρης
The fact that the program works is irrelevant.