Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: Alkeellinen fps-tasaaja

Grey [08.06.2007 03:50:28]

#

Monellakin on varmaankin ollut reaaliaikaisten pelien kanssa fps-ongelmia. Moista ongelmaa on sitten ratkottu niin viiveellä kuin tietyn näyttösingaalin odottamisella. Vaan kaiken tuon ongelmaksi on sitten muodostunut mm. konenopeudet. Hitailla koneilla viiveestä on ollut harmia ja sillain.

Itse joskus mietin ratkaisua ongelmaan ja sellainen löytyikin vahingossa. Ei monimutkainen ratkaisu loppujen lopuksi. Pitää vain tasata pelin näkymättömien toimintojen nopeus (objektien säätäminen, ym.) sopivaan nopeuteen. Tässä koodissa nopeus tasataan piirtämällä ruudulle nopeammin tavaraa, kun näkymätön toimii nopeasti ja päinvastoin.

Vaikka koodi onkin näppärä, siinä on muuan ongelma. Nopeuden tasaaminen sekunnin välein on hieman liian hidas väli ja voi aiheuttaa kuorman muuttuessa hyppäyksiä. Lagaaminen kyllä toimii kuten pitääkin, eli näkymätön toimii melko normaalilla nopeudella ja se näkyvä minimillä. Ehkä tarkistuksen väliä voisi kasvattaa? Tickien välein tarkistus ja säätö?..

-Grey-

'Koodimössösoppaa..

TYPE SetStars
 X AS INTEGER
 Y AS INTEGER
 C AS INTEGER
END TYPE

REM $DYNAMIC
DEFLNG A-Z
RANDOMIZE TIMER
DIM MaxStars, MaxLoop, I, Fps, Sys, SysMin, SysMax, Sync, Dtimer, S

'*** Säädettävät alapuolella!
MaxStars = 16000: SysMin = 100: SysMax = 120: Sync = 3
'*** Säädettävät yläpuolella!

DIM Stars(MaxStars) AS SetStars
SCREEN 7, , 1, 0: S = 1

DO
 W$ = INKEY$
IF Dtimer > Sync THEN
FOR I = 0 TO MaxLoop
 PSET (Stars(I).X, Stars(I).Y), Stars(I).C
NEXT
 PCOPY 1, 0
 LINE (0, 8)-(319, 199), 0, BF
 Dtimer = 0: Fps = Fps + 1
END IF

IF MaxLoop <= 0 THEN S = 1
IF MaxLoop >= MaxStars THEN S = -1
MaxLoop = MaxLoop + S
FOR I = 0 TO MaxLoop
 IF Stars(I).X <= 0 THEN
  Stars(I).Y = INT(RND * 192 + 8)
   Stars(I).X = 319
  Stars(I).C = INT(RND * 15 + 1)
 END IF
Stars(I).X = Stars(I).X - 1
NEXT

Sys = Sys + 1: Dtimer = Dtimer + 1
IF T$ <> TIME$ THEN
 IF Sys < SysMin THEN Sync = Sync + 1
 IF Sys > SysMax THEN Sync = Sync - 1
 T$ = TIME$
 LOCATE 1, 1: PRINT Fps; "Dsp"; Sys; "Sys"; Sync; "Snc ": Sys = 0: Fps = 0
END IF

LOOP UNTIL W$ = CHR$(27)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta