Niin, siis miten sitä hillitään?
Yksinkertaisin tapa rajoittaa FPS tiettyyn lukuun on laskea yhteen frameen kuluva aika, ja tämän jälkeen odottaa niin kauan, että aikaa on kulunut yhteensä tietyn verran, esim. 33 ms.
Miten lasketaan niin tarkka aika?
Jos käytät SDL:ää, SDL_GetTicks() palauttaa SDL:n alustamisesta kuluneen ajan millisekunteina, tietotyyppinä Uint32, eli Unsigned int, joka on 32-bittinen.
Eli siis includetan SDL:n kirjaston ja sieltä sitten? Vai onko se jossain muussa kuin SDL.h:ssa?
Jep, SDL.h on includettava ja SDL:n kirjastot linkitettävä. Lisäksi SDL on alustettava (SDL_INIT_TIMER-lippu taitaa riittää jos et tarvitse muuta kuin SDL_GetTicksin()).
SDL:ää kannattaa hyödyntää myös mm. ikkunan luomiseen ja syötteiden lukemiseen, jolloin saat koodistasi täysin porttaantuvaa.
Onkos tuon ajan mittaamisen tarkempaa metodia kuin tuo SDL_GetTicks? Tai tarkoitan että antaako tuo aina 100% varmasti ja tarkasti sen ajan, ilman mitään heittoja? Jostain kuulin että olisi tarkempikin funktio.
WinApissa oli joku, kai törkyisen hidas.
QueryPerformanceCounter() antaa periaatteessa tarkimman mahdollisen ajan; SDL_GetTicks() :n tarkkuus riittää kyllä useimmissa tapauksissa aivan hyvin.
Njaa, WinApia en voi käyttää koska ohjelma on Linuxille.
Jos et ole aikeissa tehdä ohjelmastasi muilla kuin unixeilla toimivaa, niin SDL:n laittaminen depencyksi pelkästään tuosta syystä on tarpeetonta. Glibc:stä(GNU:n c-standardikirjasto, joka tulee joka ohjelmaan joka tapauksessa) löytyy tuohon tarkoitukseen funktio gettimeofday
, joka antaa ajan sekuntaina ja mikrosekunteina. Tietoa käytöstä löytyy man-sivulta.
Jos SDL:lää kuitenkin käytät, niin hidastus onnistuu millisekuntaja odottavalla SDL_Delay
-funktiolla. Glibc:stä taas löytyy mikrosekunteja odottava usleep
tuohon hommaan (tai nanosleep jos ei mikrosekuntien tarkkuus riitä).
Aihe on jo aika vanha, joten et voi enää vastata siihen.