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)
Aihe on jo aika vanha, joten et voi enää vastata siihen.