PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Deto: Frames im voraus rendern


Savini
2003-08-15, 15:43:21
Im Detonator kann man sowohl unter D3D als auch unter OGL angeben, wieviel Frames (max) im voraus gerendert werden sollen. Bei OPL sind es mindestens 2, bei D3D kann man bis auf 0 runter.

Wie verträgt sich dies mit den Begriffen Double und Triple Buffering? Ich dachte, man hat entweder 2 Buffer (einen für das anzuzeigende Frame und einen für das gerade zu berechnende Frame) oder 3. Doch im Deto kann man nun auch 5 oder 6 Frames angeben, die im voraus berechnet werden. Hat man jetzt also statt einem Triple Buffering ein 5fach Buffering? Und wozu soll das gut sein?

Razor@Work
2003-08-15, 15:46:03
Was sollen Double- oder Triple Buffer mit deaktiviertem vSync zu tun haben ?
Nun ja... zumindest kostets mehr Video-Speicher...
;-)

Razor

Savini
2003-08-15, 16:04:27
Original geschrieben von Razor@Work
Was sollen Double- oder Triple Buffer mit deaktiviertem vSync zu tun haben ?
Nun ja... zumindest kostets mehr Video-Speicher...
;-)

Razor


Was hat die Anzahl der im voraus berechneten Frames mit VSync zu tun? Ist Vsync on wartet man - bei Double Buffering -mit dem Flippen der beiden Buffer, bis das Bild auf dem Monitor komplett dargestellt wurde - man synchronisiert halt auf die Vertikalfrequenz. Wie das mit Triple Buffering und VSync funktioniert, weiß ich nicht - Du vielleicht?

Doch was hat es nun mit diesen Frames im voraus berechnen auf sich? Wie kann die Graka überhaupt 5 Frames im voraus berechnen, wenn ich zunächst nach vorne laufe, nach 3 Frames aber links abbiege. Dann würden das 4. und 5. im voraus berechnete Frame doch gar nicht passen.

Oder verstehe ich hier was falsch?

Mephisto
2003-08-15, 16:05:01
Die Frage finde ich berechtigt, ich habe selbst schon in diffuser Weise ;) darüber nachgedacht.
Da ich vsync aber immer abschalte, ist es wohl nicht so wichtig. edit: für mich.

Birdman
2003-08-15, 19:57:36
Original geschrieben von Savini
Was hat die Anzahl der im voraus berechneten Frames mit VSync zu tun? Ist Vsync on wartet man - bei Double Buffering -mit dem Flippen der beiden Buffer, bis das Bild auf dem Monitor komplett dargestellt wurde - man synchronisiert halt auf die Vertikalfrequenz. Wie das mit Triple Buffering und VSync funktioniert, weiß ich nicht - Du vielleicht?

Du hast Quasar falsch verstanden.
Seine Frage ist sehr berechtigt, denn bei ausgeschaltetem VScyn wird gar nie ein Frame vorberechnet.
Sobald ein Frame fertig ist, wird es direkt auf dem Screen wiedergegeben und ein neues Bild wird gerendert.
Bis auf den aktuellen Backbuffer gibts daher gar keinen Buffer wo man fertige Frames reinschreiben und danaben neue berechnen könnte.

Savini
2003-08-15, 23:00:33
Original geschrieben von Birdman
Du hast Quasar falsch verstanden.
Seine Frage ist sehr berechtigt, denn bei ausgeschaltetem VScyn wird gar nie ein Frame vorberechnet.
Sobald ein Frame fertig ist, wird es direkt auf dem Screen wiedergegeben und ein neues Bild wird gerendert.
Bis auf den aktuellen Backbuffer gibts daher gar keinen Buffer wo man fertige Frames reinschreiben und danaben neue berechnen könnte.

Hm, wieso ist aber dann die Default-Einstellung unter OpenGL:

- VSync On

- Frames, die im Voraus zu berechnen sind: 2 ???


Außerdem bleiben meine Fragen von oben:

- Wie ist der Vorgang bei VSync On und Triple Buffering?

- Was hat man von z.B. 5 im voraus berechneten Frames? (und setzt diese Einstellung Triple Buffering außer Gefecht und erweitert es auf 5fach Buffering?)

- Wie kann man überhaupt Frames im Voraus berechnen, wenn man nicht weiß, in welche Richtung sich der Spieler weiter bewegen wird?


Und da wir gerade dabei sind: Angenommen, man hat eine konstante fps Zahl von z.B. 50. Der Monitor hat eine Wiederholfrequenz von z.B. 85 und Vsync ist on. Dies bedeutet doch, dass einige der berechneten 50 Frames länger gezeigt werden müssen als andere, da man ja auf 85 kommen muss. Dies müßte doch unweigerlich zu einer ungleichmäßigen Bewegung führen. Dies hieße weiterhin, dass man nur dann eine absolut flüssige Bewegung bekommt, wenn die Graka "zufällig" genau so viele fps schafft, wie die Bildwiederholrate des Monitors beträgt und man die beiden dann noch durch VSync synchronisiert.

Ich bin nun mal ein Fan von butterweichen Bewegungen/Scrolling und möchte endlich wissen, ob und wie man das überhaupt erreichen kann.

Demirug
2003-08-15, 23:59:09
Das ist das PreRenderLimit und dieser Wert sagt nur aus für wie viele Frames der Treiber die Renderkommandos zwischenspeichern soll. Ist der Buffer voll wird eben gewartet (CPU Blockiert) bis wieder platz ist. Dieser Platz entsteht dann wenn der Chip alle Kommdos für einen Frame abgearbeitet hat und nun ein fertiges Bild im Backbuffer hat. In dem Moment bekommt der Treiber die Mitteilung das nun wieder Platz im Kommdobuffer ist und er die Anwendung wieder weiterlaufen lassen kann damit sie den nächsten Frame in den Komandobuffer einschreibt.

VSync und Trippelbuffer haben nun eine Auswirkung darauf was der Chip macht nachdem er den Treiber das framekomplett Signal gesendet hat. Bei VSnyc ohne Trippelbuffer wartet er auf den nächsten Strahlrücklauf und tauscht dann Front und Backbuffer aus und beginnt mit der abarbeitung des nächsten Frames der im Kommadobuffer liegt. Ist Trippelbuffer aktiv so prüft der Chip ob der dritte Buffer frei ist. Ist diese nicht der Fall wird darauf gewartet. Der freie dritte Buffer wird nun mit dem Backbuffer vertauscht und der Chip beginnt mit dem rendern des nächsten Frames. Der dritte Buffer ist nun gespert und der Chip wird in beim nächsten Strahlrücklauf gegen den Frontbuffer tauschen. Nach diesem tausch ist der Dritte Buffer wieder frei und das Spiel beginnt von Vorne.

Savini
2003-08-16, 11:33:23
Original geschrieben von Demirug
Das ist das PreRenderLimit und dieser Wert sagt nur aus für wie viele Frames der Treiber die Renderkommandos zwischenspeichern soll. Ist der Buffer voll wird eben gewartet (CPU Blockiert) bis wieder platz ist. Dieser Platz entsteht dann wenn der Chip alle Kommdos für einen Frame abgearbeitet hat und nun ein fertiges Bild im Backbuffer hat. In dem Moment bekommt der Treiber die Mitteilung das nun wieder Platz im Kommdobuffer ist und er die Anwendung wieder weiterlaufen lassen kann damit sie den nächsten Frame in den Komandobuffer einschreibt.

VSync und Trippelbuffer haben nun eine Auswirkung darauf was der Chip macht nachdem er den Treiber das framekomplett Signal gesendet hat. Bei VSnyc ohne Trippelbuffer wartet er auf den nächsten Strahlrücklauf und tauscht dann Front und Backbuffer aus und beginnt mit der abarbeitung des nächsten Frames der im Kommadobuffer liegt. Ist Trippelbuffer aktiv so prüft der Chip ob der dritte Buffer frei ist. Ist diese nicht der Fall wird darauf gewartet. Der freie dritte Buffer wird nun mit dem Backbuffer vertauscht und der Chip beginnt mit dem rendern des nächsten Frames. Der dritte Buffer ist nun gespert und der Chip wird in beim nächsten Strahlrücklauf gegen den Frontbuffer tauschen. Nach diesem tausch ist der Dritte Buffer wieder frei und das Spiel beginnt von Vorne.


Das macht einiges klarer. Frage bleibt:

- Was hat man davon, die Render-Kommandos für 5 oder 6 Frames zwischenzuspeichern?

- Wie kann das funktionieren, wenn man nicht weiß, wie der Spieler sich weiterbewegen wird?

- Wie ist das mit dem doppelten Anzeigen bzw. Auslassen von Frames, wenn die berechneten fps der Graka nicht mit der Bildwiederholfrequenz des Monitors übereinstimmen? (also z.B. Graka berechnet 50 fps, der Monitor steht auf 85 Hz oder umgekehrt: Graka berechnet 120 fps, der Monitor kann aber wegen 85Hz nur 85 anzeigen) Die Ungleichmäßigkeit in der Bewegung ließe sich doch - im zweiten Fall - nur durch einen fps Limiter abstellen, den man auf die Wiederholfrequenz des Monitors einstellt. Im ersten Fall kann man wohl gar nichts machen.

Demirug
2003-08-16, 13:31:18
Original geschrieben von Savini
Das macht einiges klarer. Frage bleibt:

- Was hat man davon, die Render-Kommandos für 5 oder 6 Frames zwischenzuspeichern?

- Wie kann das funktionieren, wenn man nicht weiß, wie der Spieler sich weiterbewegen wird?

- Wie ist das mit dem doppelten Anzeigen bzw. Auslassen von Frames, wenn die berechneten fps der Graka nicht mit der Bildwiederholfrequenz des Monitors übereinstimmen? (also z.B. Graka berechnet 50 fps, der Monitor steht auf 85 Hz oder umgekehrt: Graka berechnet 120 fps, der Monitor kann aber wegen 85Hz nur 85 anzeigen) Die Ungleichmäßigkeit in der Bewegung ließe sich doch - im zweiten Fall - nur durch einen fps Limiter abstellen, den man auf die Wiederholfrequenz des Monitors einstellt. Im ersten Fall kann man wohl gar nichts machen.

fangen wir mal unten an.

Kann der Chip mehr Bilder berechnen als der Monitor anzeigen so können abhängig vom Vsync zwei Dinge geschehen.

1. VSync an: Der Chip wird auf die Monitorfrequenz ausgebremst
2. VSync aus: Sobald das Bild fertig wird es sofort angezeigt. Das gibt aber tearing und man sieht eigentlich nie ein Bild komplett.

Wenn weniger Frames berechnet werden können als angezeigt spielt VSync auch wieder eine Rolle.

1. VSync an: Die Framerate bricht entsprechen ein. Auf die hälfte, ein drittel, ein viertel usw.
2. VSync off: Die Framerate entspricht genau dem was der Chip berechnen kann aber es gibt Tearing.

Um diese Problem zu lösen gibt es Trippelbuffer. Die Framerate bricht nicht auf einen ganzzahligen Teiler ein aber es gibt auch kein Tearing.

Der Prerender buffer dient dazu den Grafikchip und die CPU zu entkoppel zu das die CPU nicht warten muss bis die GPU fertig ist Je grösser der Buffer ist desto weniger anfällig ist die Verbidung für Schwankungen. Allerdings hat die Sachen einen Nachteil. Die CPU übergibt dem Treiber immer die Daten für den Frame welcher dem aktuellen Zustand entspricht. Je grösser nun die Bufferkette zwischen der CPU und GPU ist desto länger dauert es bis der Frame auch auf dem Monitor erscheint. Die CPU ist zu diesem Zeitpunkt dann schon ein paar Frames weiter. Bei einigen Spielen macht das nichts aus bei anderen ist dieser Lag tödlich und deswegen syncronísiert sich eine gute Engine wieder auf die Grafikkarte um dadurch das Prerenderlimit zu umgehen.

Savini
2003-08-16, 15:25:16
[B]
Um diese Problem zu lösen gibt es Trippelbuffer. Die Framerate bricht nicht auf einen ganzzahligen Teiler ein aber es gibt auch kein Tearing.

Der Prerender buffer dient dazu den Grafikchip und die CPU zu entkoppel zu das die CPU nicht warten muss bis die GPU fertig ist Je grösser der Buffer ist desto weniger anfällig ist die Verbidung für Schwankungen. Allerdings hat die Sachen einen Nachteil. Die CPU übergibt dem Treiber immer die Daten für den Frame welcher dem aktuellen Zustand entspricht. Je grösser nun die Bufferkette zwischen der CPU und GPU ist desto länger dauert es bis der Frame auch auf dem Monitor erscheint. Die CPU ist zu diesem Zeitpunkt dann schon ein paar Frames weiter. Bei einigen Spielen macht das nichts aus bei anderen ist dieser Lag tödlich und deswegen syncronísiert sich eine gute Engine wieder auf die Grafikkarte um dadurch das Prerenderlimit zu umgehen.


Danke,jetzt macht das Ganze Sinn.

Was Du mit dem Lag meinst, ist doch das, was ich ausdrücken wollte, als ich sagte "Wie kann man Frames im voraus berechnen, wenn man nicht weiß, wohin der Spieler laufen wird." In der Praxis würde man dann eine zeitversetzte Reaktion bemerken: Man drückt "Cursor links", doch die Spielfigut läuft noch ein paar Frames weiter geradeaus, weil diese Frames bereits berechnet sind. Stimmt das so?

Es gab auch einen Thread, in dem jemand sagte, dass die Quake III Spieler immer nur bestimmte fps Werte per fps Limiter benutzen: 75, 120, 333. Würde man andere Werte wählen, könne man nicht so weit springen. Hängt das auch mit dem Lag und dem Prerenderlimit zusammen?

Wenn eine gute Engine sich wieder auf die Graka synchronisiert, kann man dieses Prerenderlimit doch eigentlich vergessen: Entweder wird es eh umgangen oder es führt zu Problemen. Ich frage mich allerdings noch:

1) Wieso ist bei Open GL das Prerenderlimit mindestens 2 und kann nicht deaktiviert werden?

2) Einige User berichten, dass bei ihnen unter D3D Ruckeln auftritt, das erst bei Deaktivierung des Prerenderlimits (also auf 0 setzen) verschwindet. Wie kommt es dazu?


Zu dem Triple Buffer: Kann man das irgendwie im Treiber einstellen? Ich kenne es bisher nur so, dass einige wenige Spiele im Menu ein "Triple Buffering" anbieten. Bei anderen Spielen habe ich dann den Einbruch der Framerate wenn ich VSync aktiviere, das Spiel aber keine Triple Buffering Option hat.

Birdman
2003-08-16, 17:28:13
Original geschrieben von Savini
Es gab auch einen Thread, in dem jemand sagte, dass die Quake III Spieler immer nur bestimmte fps Werte per fps Limiter benutzen: 75, 120, 333. Würde man andere Werte wählen, könne man nicht so weit springen. Hängt das auch mit dem Lag und dem Prerenderlimit zusammen?

Nein, dies ist ein Quake3 internes Problem welches auf Rundungsfehlern der Engine beruht.

Savini
2003-08-17, 02:09:04
Original geschrieben von Birdman
Nein, dies ist ein Quake3 internes Problem welches auf Rundungsfehlern der Engine beruht.

Betrifft es dann alle Spiele mit Quake Engine?