FPS problemer

Tags:    c++

Jeg er ved at læse en bog om spilprogrammering, den fortæller at jeg skal sørge for at holde min frame rate på max. 30 fps(frames per second ikke first person shooter), ved hjælp af at putte:
while((GetTickCount()-StartTime)<33)

I slutningen af mit message loop, StartTime bliver så i starten af MessageLoopet sat til GetTickCount().
Jeg kan godt se at man i multiplayer spil ikke kan have at den ene player har en frame rate på 75 fps og den anden har en på 20 fps, så hvis de begge holder <pil op> nede bliver det registreret 75 gange i sekundet hos player1 og 20 hos player2 så player1 går næsten 4 gange så langt. Hvordan kan man løse dette problem, ville det være smart bare at lade alle playere vente i slutningen af message loopet både på at "(GetTickCount()-StartTime)<33" bliver falsk og at alle playere er der, altså tvinge alle til at lægge på den frame rate som den player med langsomest frame rate har? Eller er der en anden god måde hvor man måske kan sørge for at alle ikke nødvendigvis skal køre langsomt?
Kunne man ikke også bare gemme fps i en variabel og så fx når <pil op> bliver trykket udføre noget lignende:
MoveForward(this,2.0f/this.fps);
Hvor prototypen er:
MoveForward(CPlayer player, float Distance);
???
Håber at der er nogle erfarne spilprogrammere der kender en god måde, for jeg kan ikke finde rundt i det her:$

PS: ved godt at jeg halvt brugte "Hungarian notation" i det sidste eksempel, men det var bare for at vise at player er en klasse.


[Redigeret d. 22/06-04 14:46:17 af Rasmus(KOEN)]



5 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Jeg tror, det du leder efter, er MultiThreading!
Hvis du ikke rigtigt ved, hvad multi-thread går ud på, kan jeg lige ganske kort fortælle at alle appliktioner under windows har per automatik fået tildelt en Main-Thread (Loop) som køre uafhængigt fra andre applikationer. Med Multi-Thread laver du altså flere uafhængige loops i din applikation. I spiludvikling er dette meget brugt! Man har oftest en thread både for framerate, en for styring, en for AI, en for Loading/Saving processore osv. som alle køre mere eller mindre uafhæninge af hinanden! Det man i grunden gør er popuplært sagt at splitte sin CPU op! Hvis du ikke har arbejdet med Multi-Threads før, er det klart anbefalende at finde nogle artikler på nettet der omhandler dette emne, da det meget hurtigt kan blive et mere kompliseret og "langhåret" affære!

Held og Lykke
Søren Klit Lambæk



Jeg tror, det du leder efter, er MultiThreading!
Hvis du ikke rigtigt ved, hvad multi-thread går ud på, kan jeg lige ganske kort fortælle at alle appliktioner under windows har per automatik fået tildelt en Main-Thread (Loop) som køre uafhængigt fra andre applikationer. Med Multi-Thread laver du altså flere uafhængige loops i din applikation. I spiludvikling er dette meget brugt! Man har oftest en thread både for framerate, en for styring, en for AI, en for Loading/Saving processore osv. som alle køre mere eller mindre uafhæninge af hinanden! Det man i grunden gør er popuplært sagt at splitte sin CPU op! Hvis du ikke har arbejdet med Multi-Threads før, er det klart anbefalende at finde nogle artikler på nettet der omhandler dette emne, da det meget hurtigt kan blive et mere kompliseret og "langhåret" affære!

Held og Lykke
Søren Klit Lambæk

Jeg ved godt hvad multi threading er, men har aldrig rigtig beskæftiget mig med det. Er det så meningen at man laver en en masse threads og bare sørger for at threads som laver ting som fx styring af input skal have samme fps, mens threads som fx opdatere grafikken kan køre på 20 såvel som 80 fps uden at den ene for fordel(Udover det ikke lagger og god grafik)?



Ja. Lad én tråd opdatere grafikken og en anden vente på input fra tastaturet og en tredje på input fra en socket. Måske vil du have flere, men disse tre tråde er gode at have.




Ja. Lad én tråd opdatere grafikken og en anden vente på input fra tastaturet og en tredje på input fra en socket. Måske vil du have flere, men disse tre tråde er gode at have.

Undskyld jeg ikke gav dig nogle point Robert, men du lavede en kommentar, bare sig hvis du gerne vil have point:D



Ja. Lad én tråd opdatere grafikken og en anden vente på input fra tastaturet og en tredje på input fra en socket. Måske vil du have flere, men disse tre tråde er gode at have.

Undskyld jeg ikke gav dig nogle point Robert, men du lavede en kommentar, bare sig hvis du gerne vil have point:D


Jeg overlever :-)



t