while(Playing) { updateGame(); System.pause(delayTime); }
which is fine as long as the game code executes in a time much less than the refresh period (i.e. 1/(refresh rate)). However, when the game loop takes a longer time so that the delay you need to give is quite small, then the computer optimized for a slower computer (as I have at home) will run way too fast on a less ancient computer (as I have at work.)
This can be partially overcome (assuming that you computer can at least run the program with zero delay) by implementing a feedback loop which adjusts the delay time to keep a fixed number of cycles per second.
This is actually quite easy to do: say we want x cycles/s and we get y cycles/s -
int t = getCurrentTime(); int tickCounter = 0; while(Playing) { tickCounter++; time = getCurrentTime()-t; if(time > 1000ms) { delay = updateDelay(tickCounter); t = getCurrentTime(); // reset time tickCounter=0; } updateGame(); System.pause(delay) } public int updateDelay(int y) { return delay*y/x; }... and that's it.
A simple implementation of this can be found here: basically, it is an Applet which runs a stopwatch (it has to do something) and adjusts the delay per loop so that the program executes a specified number of iterations per second. The functionality of the stopwatch is unaffected by the background feedback loop as desired.
... and the source code is here.
No comments:
Post a Comment