| |
|
|
Sven Bader | après que je dans mon letzten Voir le texte source qui Genauigkeit de "Sleep" gefixt habe, ici eh bien un quelque chose umfangreicheres Beispiel pour une konstante Framerate dans Spielen. Bisher J'ai eu avec pro Frame aufsummierten Rundungsfehlern gelebt et Bildberechnung et Logik (Ticks) toujours gemeinsam abgewickelt, ici funktioniert beides besser!
Features: -Verwendung eines präzisen Perfomance Counters -Physik fonctionne plus, aussi si le Bildberechnung hinterherhinkt -Framerate abweichend de Ticks wählbar -ne...aucune Aufsummieren de Zeitabweichungen -Sleep pour verbleibende Frame-Zeit (0% CPU), sauf dernier reste avec genauem Performance Counter
Einschränkungen: -aucun automatische Anpassung qui Framerate, seulement Bilddrops -Framerate seulement comme vielfaches de Ticks wählbar (chacun, chacun Zweite, chacun Dritte,...) -Gar ne...aucune Bild, si Zeit pas einmal pour Physik ausreicht (Drop chaque Frames)
Alles wäre machbar, je voulais es pas trop komplex faire. Zudem devrait chez OpenGL abgefragt volonté, si VSync verwendet wird, là qui FPS ici bereits par OpenGL sur qui Bildrate des Monitors gekappt volonté.
Déclarer qpc#, freq_factor!, qpc_freq#, caps#
Déclarer timeNextFrame!,timeNextFrameSecure!,timeend!,ticks&
Déclarer framedrop&,mod&, frame&,countFramedrops&
Faible qpc#,8'Performance Counter aktuelle Zeit
Faible qpc_freq#,8'Performance Counter Frequenz
Faible caps#,8'Minuteur Intervalle min/max auslesen
Def timeGetDevCaps(2) !"winmm","timeGetDevCaps"
Def timeBeginPeriod(1) !"winmm","timeBeginPeriod"
Def timeEndPeriod(1) !"winmm","timeEndPeriod"
Def QueryPerformanceFrequency(1) !"Kernel32","QueryPerformanceFrequency"
Def QueryPerformanceCounter(1) !"Kernel32","QueryPerformanceCounter"
Fenêtre Style 16'+ 64
Fenêtre (%maxx * 0.5 - 250), (%maxy * 0.5 - 262) - 500,524
QueryPerformanceFrequency(qpc_freq#)'Performance Counter Frequenz
freq_factor! = (1 / (long(qpc_freq#,0) / 1000.0))'pouvoir qui plus tard change lesbarer
'Benutzereinstellungen
ticks& = 120'Ticks sommes Physik-Frames pro seconde
mod& = 1'chacun wievielte Tique wird un Bild gezeichnet? 1 si fps = ticks
timeGetDevCaps(caps#,8)'Auflösung des Timers anfragen (caps# = min ms, max ms)
timeBeginPeriod(long(caps#,0))'minimale Auflösung des Timers mettons, là sur manchen Systemen Sleep sonst seulement 15ms oui c'est ca ist!!
'Physikzeug, Position et Geschwindigkeit
declare x&,y&,speedx&,speedy&
speedx& = 1
speedy& = 1
x& = 77
y& = 299
declare mousekey1&,mousekey2&
timeNextFrameSecure! = 1
mcls 500,500
whilenot iskey(27)'ESC
inc frame&
'Manuelle Changement qui FPS et Ticks
si (iskey(1)) AND not(mousekey1&)
inc mod&
mousekey1& = 1
endif
casenot (iskey(1)) : mousekey1& = 0
cas mod& > 8 : mod& = 1
si (iskey(2)) AND not(mousekey2&)
ticks& = ticks& + 30.0
mousekey2& = 1
endif
casenot (iskey(2)) : mousekey2& = 0
cas ticks& > 240 : ticks& = 30.0
'1. PHYSIK
cas (x& <= 16) OU (x& >= 484) : speedx& = speedx& * (-1)
cas (y& <= 16) OU (y& >= 484) : speedy& = speedy& * (-1)
x& = x&+speedx&
y& = y&+speedy&
'2. GRAFIK
si (frame& = 1) OU (not(framedrop&) AND (frame& MOD mod& = 0))
startpaint -1
cls RGB(192,192,192)
USEP 0,0,RGB(0,128,192)
Couleur du texte RGB(40,40,40),-1
UseBrush 1, RGB(0,128,192)
Ellipse (x&-16),(y&-16) - (x&+16),(y&+16)
DrawText 16, 16, str$(countFramedrops&) + " drops (Bilder übersprungen)"
DrawText 16, 32, str$(int(ticks&)) + " ticks (Physik/Logik pro seconde)"
decimals 1
DrawText 16, 48, str$((ticks& / mod&)) + " fps (Bilder pro seconde, mod& = "+str$(mod&)+")"
DrawText 16, 80, "Linke Bouton de la souris ändert FPS"
DrawText 16, 96, «Les droits Bouton de la souris ändert Ticks"
DrawText 16, 112, "ESC zum Beenden"
endpaint
MCopyBmp 0,0 - 500,500 > 0,0;0
endif
'3. TIMING
'ungenaues Sleep jusqu'à kurz avant gewünschtem Frame-Ende
si int(timeend!) < int(timeNextFrameSecure!)
sleep int(timeNextFrameSecure!) - int(timeend!)
framedrop& = 0
d'autre
framedrop& = 1
inc countFramedrops&
endif
'Restliche Zeit avec genauem Performance-Counter abwarten
'mindestens un Duchlauf, à aktuelle Zeit trop holen
tandis que timeend! < timeNextFrame!
QueryPerformanceCounter(qpc#)'Endzeit des Counters
timeend! = long(qpc#,0) * freq_factor!
'Sollte ausser beim ersten Frame pas passer, wird andernfalls mais aussi hiermit gerettet
si abs(timeend! - timeNextFrame!) > 2000
timeNextFrame! = timeend! + (1000.0 / ticks&)'Versuch es trop retten
endif
endwhile
timeNextFrame! = timeNextFrame! + (1000.0 / ticks&)' Endzeit pour prochain Frame
timeNextFrameSecure! = timeNextFrame! - 2.0' et nochmal 2ms früher
endwhile
timeEndPeriod(long(caps#,0))'zuvor gesetzte minimale Minuteur-Auslösung zurücksetzen
Dispose caps#, qpc_freq#, caps#, qpc#, qpc_freq#
|
|
|
| |
|
|
|
Georg Teles | Nabend,
très bien, nu peux je meinen 144 Hz Monitor aussi avec XProfan testen
Grüße |
|
|
| |
|
|