op mijn site
|
Games programming: Coding
Op deze pagina wat uitleg over
het eigenlijke programmeren van PinPin.
Het lastigste met spelletjes is de 'game loop': hoe zorg je er voor dat het spel altijd op de juiste snelheid loopt, onafhankelijk van de snelheid van de computer en het beeldscherm? Scherm refresh rates lopen van 50 Hz tot 85 Hz (en zelfs daarbuiten), toch moeten de figuurtjes even snel bewegen, onafhankelijk van het systeem. Dit bereik ik door de snelheid van de figuurtjes op een vaste frequentie te berekenen, onafhankelijk van de beeldscherm frequentie. De main loop van het programma ziet er (iets versimpeld) uit als hier beneden weergegeven. De 'main loop' draait altijd op een snelheid bepaald door de scherm-update, doordat de display-update-routine wacht op een vertical refresh signaal van de beeldschermkaart (dit voorkomt een knipperend beeld). Daarnaast is er een loop (de 'game loop') die zorgt voor het bijwerken van de positie van de spelers etc, de timing hiervoor wordt bepaald door een interrupt signaal dat altijd op bijvoorbeeld 50 Hz (20 miliseconden) loopt, onafhankelijk van de beeldscherm update frequentie (lees verder...). Dit gebeurt via een variabele genaamd Als de display frequentie boven de game loop frequentie ligt, zal de game loop zo nu en dan worden overgeslagen om toch het goede tempo te hebben. Bijvoorbeeld: 75 Hz display (D), 50 Hz game (G): de volgorde zal dan zijn D D G D G D D G D G D D G D G ....., verhouding van 3:2. Mocht de display frequentie juist te traag zijn, dan zal de
game loop juist vaker worden uitgevoerd, zodat deze toch altijd gemiddeld 50
keer per seconde wordt uitgevoerd. Dit kan ook bijvoorbeeld gebeuren op een
trage computer, waarbij zoveel gerekend wordt dat de display update een aantal
beeldjes mist (er zijn al een aantal vertical sync's voorbij voor de volgende
aanroep van void main_loop(void) Mocht de computer erg traag zijn (en het beeld erg knipperend),
dan kan je een aantal 'features' uitschakelen om zo rekentijd te besparen. Dit
zie je ook in de loop: de vissen en de sneeuw (die best nogal wat vragen van
het systeem) kunnen via de variabelen Een paar bijhorende routines rond de interrupts, met wat extra 'code' nodig voor Allegro, bijvoorbeeld om te zorgen dat de interrupt routines in het cache geheugen blijven en niet uitgeswapt worden: void
frame_timer()
/* increment frame_time */ void
init_mytimers()
/* set up game timers etc */ Hopelijk geeft dit voldoende inzicht in de game timing. |
|