[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [CPROG] Flushing af stdin



On Wed, 31 May 2000, Peter Seidler wrote:

> >Som jeg forstod det var du igang med at lave et spil. Hvad med at lave din
> >tegn behandling asynkron? Altså at du sådan set læser hver gang du kører
> >rundt i dit "main loop". Noget ala det her (total pseudo):
> >
> >while (spillet kører) {
> >  char sidst_læst = 0;
> >  while(sidst_læst = noget_på_stdin()); /* noget_på_stdin() skal være 
> >                                           non-blocking */	
> >  if (0 != sidst_læst) {
> >    opdater_spil_tilstand(sidst_læst);
> >  }
> >  animer(); /* Whatever */
> >}
> 
> Problemet med ovenstående er at det kører møj-hurtigt (og bruger unødigt
> meget processor-kraft, da det jo kører konstant)
> Jeg har sådan set lavet noget, der er stort set magen til. Jeg venter dog
> 1/20 sek (sleep()) i bunden af lykken. Derudover har jeg en counter, der
> tæller hvor mange gange, jeg har været igennem den. Efter e.g. 20 gange
> er der altså gået 1 sek. og jeg kan rykke klodsen en tand ned
> (forstår du? *g*).

Ja, jeg forstår. Når jeg koder spil, så bruger jeg bare hele CPU'en, og
bruger alle tidsrum til animering.

Jeg vil anbefale dig at bruge f.eks. gettimeofday til at måle tid med, så
du er sikker på at din animation ikke kommer til at afhænge af loaden på
maskinen.

Noget ala

long last_update;
long new_time = gettimeofday_som_long();

/* Læs alle tegn, pånær det sidste fra tastetur buffer */
char sidst_læst = 0;
while(sidst_læst = noget_på_stdin()); 

if ((new_time - last_update) > 1.0) {
   animate();
}
sleep(1/20)



> 
> Her kommer problemet med, at jeg vil tømme stdin. Jeg læser i hvert
> gennemløb kun fra stdin _en_ gang, men hvad hvis brugeren taster to gange
> mens jeg sover? -Så kommer jeg bagefter, og der virker ikke så interaktivt.

Derfor jeg altid ville læse alle tegn, og bruge det sidste.

> 
> I.ø. kan problemet næsten løses ved bare at lave det tidsrum man venter i
> bunden mindre (hurtigere en folk kan taste).

Ej, det er ikke godt.

> >Iøvrigt vil jeg tro at ncurses sætter din stdin/terminal i unbuffered mode
> >når du beder om no-delay og cbreak mode - hvilket er et held og gør det
> >noget nemmere. (Har aldrig brugt ncurses).
> 
> Jeg ved ikke med unbuffered. Alt hvad der indtastes gemmes jo stadig i
> keyboard bufferen. Altså, hvis du bruger getch() to gange i træk for du de
> to sidst indtastede tegn uanset hvornår de blev indtastet.
> (gælder ved brug af cbreak mode og no-delay)

Buffered handler om hvornår terminalen sender inddata til
brugerprogrammet. Typisk sker dette først ved indtastning af et
linieskift, hvilket gør interaktive programmer lidt vanskeligere at lave.
 
curses styrer alt det for dig. 

Mads

-- 
Mads Bondo Dydensborg.                               sslug@sslug
I don't even consider working for MS Shops, or shops with extensive MS
deployment anymore. These companies are rape victims, and too self-abusive to 
get away. Why waste time trying to help those who will not help themselves? 
                                                       - David C. Manchester



 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:08 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *