Français
Source/ Codesnippets

Konstante Bildrate / Framerate pour Jeux

 

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#

9 kB
Hochgeladen:02.02.2023
Downloadcounter56
Download
 
02.02.2023  
 




Georg
Teles
Nabend,

très bien, nu peux je meinen 144 Hz Monitor aussi avec XProfan testen

Grüße
 
Alle Sprachen
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

05.02.2023  
 



Zum Quelltext


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

1.551 Views

Untitledvor 0 min.
Sven Bader10.07.2023
Wilfried Friebe28.05.2023
funkheld14.05.2023
Alibre01.05.2023
plus...

Themeninformationen

cet Thema hat 2 participant:

Georg Teles (1x)
Sven Bader (1x)


Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie