vSync
-
Ich möchte für mein Projekt den Render - Thread pausieren lassen bis ein neuer Frame nötig ist - vsync halt
Das System besteht aus SDL welches mir des OGL - Fenster liefert und dann OGL - Befehlen.
SDL bietet dafür
int SDL_GL_SetAttribute(SDL_GLattr attr, int value);mit
SDL_GL_SWAP_CONTROL Vsync: Swap buffers every n'th retrace (0 to disable, which is the default).
allerdings scheint das keine Wirkung zu zeigen (ich habs versuchsweise sowohl mit 1 als auch mit 600! ausprobiert, keine veränderung in der Prozessorlast (läuft aktuell alles in einem Thread)
sdl-config --version gibt "1.21" aus,
fglrxinfo "OpenGL version string: 2.0.6747 (8.40.4)"wie kann ich die Wirksamkeit überprüfen / aktivieren?
-
Das muss nicht unbedingt mehr oder weniger Prozessorlast geben. Hol dir mal CodeAnalyst von AMD, damit kannst du alles schön messen.
Edit: Das funktioniert auch auf Intel Prozessoren, habe selber einen und CodeAnalyst funktioniert wunderbar.
-
SDL vsync hat nix mit Prozessorlast zu tun. Das sagt soweit ich weiß nur darüber aus wie of der Bildschirm geupdatet wird. (Also wie oft die zwei Framebuffer vertauscht werden)
lg, bloodycross
-
Ja, es wartet bis der abtast Strahl wieder an der Startposition steht bevor es anfängt zu malen. So kann man tearing umgehen und durch die warterei macht natürlich dann auch das eigene Programm in manchen Frames (nicht allen) kurze zeit nichts. So wird also eventuell die Prozessorlast dann auf andere Programme verteilt von Windows... Also kann man ohne einen Profiler sowieso nicht sagen ob das was bringt. Leistungsmässig bringt es eigentlich sowieso nicht. Wenn das Programm in kleinerer Zeit ein neues Frame berechnen kann als der Bildschirm eines darstellen kann, wird es dadurch etwas ausgebremst. Ist es langsamer, wird es dadurch eventuell auch ausgebremst.
Wenn ich das aber richtig verstanden habe, will der Threadersteller in einem eigenen Thread rendern. So macht das natürlich wieder etwas Sinn, da der Thread der das nächste Frame berechnet weiterarbeiten kann während der Renderer das letzte Frame noch am malen ist.
Aber wie gesagt, es wird ein Profiler gebraucht. Weil wenn das Programm weniger Last braucht, verteilt Windows die Last vielleicht auch anders und die CPU ist genau gleich ausgelastet wie sonst...
-
Ich weiß schon wie man einen Profiler verwendet, aber bei der aktuellen konstellation hätte ich schlicht und einfach erwartet, dass ich mit vsync und 60Hz nicht 100% Belegung meines 2GHz Cores bekomme, ein Effekt des Befehls also schon mit top sichtbar wären.
Nach meinem Verständniss des ganzen müsste ein SDL_SwapBuffers jetzt so lange blocken, bis die Buffer getauscht wurden. Das würde dann auch im Endeffekt den Logik-Threads, ... einiges an Zeit verschaffen.
P.S.: Nein, das ist kein Windows hier

-
Unter Linux oder andere Unix-Derivaten ist das dasselbe. Wenn Dein Programm soviel Leistung braucht, wird es kaum nur durch ein VSync merkbar weniger Leistung brauchen. top zeigt Dir ja nur die Leistung aller Prozesse im ganzen System an und nicht wo Dein Programm wirklich die Zeit braucht.
-
ermittle das zeitinterval zwischen 2 vsyncs (refreshrate) und geh vor "swapbuffers" schlafen (oder etwas nuetzliches tun) bis kurz vor ende des aktuellen intervals.
-
Andi001 schrieb:
Unter Linux oder andere Unix-Derivaten ist das dasselbe. Wenn Dein Programm soviel Leistung braucht, wird es kaum nur durch ein VSync merkbar weniger Leistung brauchen. top zeigt Dir ja nur die Leistung aller Prozesse im ganzen System an und nicht wo Dein Programm wirklich die Zeit braucht.
Das Programm sollte aktuell nicht die Leistung brauchen, macht bisher nicht mehr als ~20 Colorierte Faces ohne Texturen mit OGL zu zeichnen.
Die Auslastung muss also IMO daher kommen, dass das Programm ein vielfaches der nötigen Frames zeichnet
-
Andi001 schrieb:
Ist es langsamer, wird es dadurch eventuell auch ausgebremst.
Nein, warum das denn?
Wenn Dein Programm soviel Leistung braucht, wird es kaum nur durch ein VSync merkbar weniger Leistung brauchen.
Wenn vorher mehr als z.B. 60 frames pro sekunde gezeichnet wurden und mit vsync auf 60 gebremst wird, dann schon.