PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Triple Buffer



MrMikeZH
08-01-2010, 03:02
würde mich mal interessieren wie die pcbs das mit dem vsync machen, bei mame klappts ja nicht so ohne triplebuffer.
bis auf die leider doch irgendwie spürbare verzögerung der bildausgabe im vergleich zum orginal, hab ich mame nun so weit dass ich keinen unterschied merke.

was kannst du uns dazu sagen sailorsat, gibts da keine chance ohne verzögerung oder bilde ich mir das nur ein und die orginale verzögern auch wegen sync?

SailorSat
08-01-2010, 07:44
Naja das ist relativ einfach.

Die Platinen arbeiten in der Regel mit einem einzigen Quarz als Taktgeber und die einzelnen Baugruppen arbeiten mit einem Teil davon.

Ich glaube beim Neogeo waren es 16MHz, die CPU arbeitet mit der Hälfte (8MHz) und der "Grafikteil" mit einem Drittel (~5,33 MHz). Desweitern erzeugen die Platinen, im Gegensatz zu MAME, ihre Grafikausgabe komplett selbst.
Es arbeitet also alles in etwa mit der selben Geschwindigkeit.

In der Regel wird der Bildinhalt nur geändert wenn der "VSYNC", also das Ende des jeweiligem Bildes erreicht wird. Das Spiel prüft in welcher Zeile der Strahl grade ist und wenn das "aktive" Bild verlassen wird, gibt es einen Impuls der die neue Position aller Objekte in den Speicher schreibt.

Das hat theoretisch die selbe Verzögerung wie VSYNC oder TrippleBuffer in MAME.


Der Unterschied ist aber, das in unserem Fall die Grafikkarte, die Soundkarte, die CPU etc. alle mit wildfremden Geschwindigkeiten arbeiten.
MAME z.B. würde ein Neogeo auf einem modernen CPU vieeeeel zu schnell emulieren. Daher fügt man Timer/Pausen/Schleifen ein, um die "Zeiten" möglichst genau einzuhalten.

Da gibt es zwei Ansätze.
a) 1s Spiel = 1s MAME
Eine Sekunde Emulation entspricht (möglichst) exakt einer Sekunde dem Orginal.

b) 1 Frame Spiel = 1 Frame MAME.
Ein Bild Emulation entspricht (möglichst) genau einem Bild des Orginals.


Nehmen wir als Beispiel Pac-Man.

Pac-Man lief im Orginal mit 288x224 Pixeln bei 60,6Hz.
Selbst wenn du nun die selbe Auflösung in Pixeln hast, aber sagen wir mal nur 60Hz, geht das ein paar Frames gut, aber spätestens beim 10ten Frame hast du ein Problem.

Mit der ersten Methode (1s = 1s) wirst du zwangläufig "zu schnell" sein, und die Grafikkarte ist mit der Ausgabe des alten Frames noch nicht fertig; Es kommt zu "tearing".

Die andere Methode (1f = 1f) führt dazu das MAME auf die Grafikkarte wartet bis sie mit dem Frame fertig ist, und dann erst das nächste berechnet. Das führt binnen einer Sekunde dazu, das die Emulation exakt 60 Bilder "gemacht" hat, während das Orginal schon 60 und etwas mehr als ein Halbes (60,6) hat.
Das führt in der Regel zu Problemen mit dem Sound, da die von MAME berechneten Sounds ebenfalls um dem Bruchteil einer Sekunde zu kurz sind.


Erschwerend kommt hinzu das du, wenn du eben genanntes Pac-Man auf einem Horizontal befestigtem Monitor spielen willst, sich die Zeilenfrequenz noch weiter reduziert. 352x288 z.B. haben zwar genug Zeilen um die 288 Pixel von Pac-Man zu fassen, aber leider nur knapp über 50Hz.


Das heißt nach Methode 1 (1s = 1s) wäre MAME mit dem zweiten Frame fertig, wenn die Grafikkarte grade mal 82,5% vom ersten ausgibt. Beim dritten Frame wäre MAME fertig, wenn die Grafikkarte grade 41,25% vom zweiten Ausgegeben hat. Der Versatz ist brutal.

Nach der Methode 2 (1f = 1f) ist es kaum besser. Wenn MAME auf die Grafikkarte wartet, erreicht es danach nur noch 825ms (statt 1000ms) der Orginalgeschwindigkeit.


Lange Rede kurzer Sinn.
Es ist möglich mit verschiedenen Tricks ziemlich perfekt an das Orginal heran zu kommen. Allerdings spielen da wahnsinnig viele Faktoren mit rein.
z.B. wird die PS2-Tastatur (falls man einen Encoder verwendet) und USB (falls man ein Gamepad) verwendet mit einem eigenen (festen) Takt abgefragt. Das führt ebenfalls zu einem Versatz bei der EINGABE.

Ich behaupte immernoch das man die Ausgabe ziemlich perfekt treffen kann.
Allerdings ist es technisch kaum Praktikabel für jedes Spiel jede Auflösung perfekt umzusetzen. (ATI Karten erlauben meines Wissens nur 64 Auflösungen, NVidia erlauben sogar nur 32 "definierte")

Bei gefühlten 8000 Spielen in MAME, von denen "nur wenige" auf der selben Hardware, gibt es einfach zuviele Auflösung/Bildwiederholrate Kombinationen.
Davon abgesehen das die Arcade Monitore im Regelfall nachjustiert werden müssen.

Für den MAME-Cab Betrieb empfiehlt sich in der Regel Variante 2 (1f = 1f) mittels VSync/Tripplebuffer und ein paar "kniffen" um z.B. den Sound anzupassen.

Bei den MEISTEN Spielen (horizontal) fällt die Verzögerung quasi nicht auf. NeoGeo z.B. läuft glaub ich 1% "zu schnell" (und der Sound ist 1% zu hoch).

Bei Vertikal-auf-Horinzontal Gradwanderungen muss man wohl oder übel die passende "LowRes" Auflösung mit 50Hz nehmen (respektieve 11% zu langsam) oder man nimmt eine höhere Auflösung (640x480 bei 60Hz) und lässt sich das Bild "zoomen".
Beides nicht perfekt. Aber hey... Die Spiele sind halt nicht für diesen Betrieb vorgesehen.

Clark Kent
08-01-2010, 07:57
Bei Vertikal-auf-Horinzontal Gradwanderungen muss man wohl oder übel die passende "LowRes" Auflösung mit 50Hz nehmen (respektieve 11% zu langsam) oder man nimmt eine höhere Auflösung (640x480 bei 60Hz) und lässt sich das Bild "zoomen".
Beides nicht perfekt. Aber hey... Die Spiele sind halt nicht für diesen Betrieb vorgesehen.

Also dann besser gleich den Bildschirm drehen. Das geht zwar bei meinem Europlay recht einfach, effektiv machen tu ich es trotzdem nicht... ;)

Vielen Dank für die ausführlichen Infos! Hier wird man wirklich mit jedem Posting ein wenig mehr gescheiter... :)

MrMikeZH
08-01-2010, 12:53
ok, du bestätigst also 100% das der TRIPLE buffer theoretisch das gleiche macht wie die platinen.
wie kommst du jetzt auf die 825ms zu 1000ms wenns ja theoretisch gleich ist ? wegen 60hz zu 60,6?
was möglich ist wird auch gemacht meiner meinung nach, also ich hab alle auflösungen die ich brauche 1:1 und auch die hz 1:1 ausser 320x240 da es 240er nicht nur als 60hz gibt. monitor muss ich auch nicht justieren dank deines mledit. 288zeilen@60,6 ist auch kein probem für meinen monitor wobei dieses ewige V game auf H schirmen gelabere sinnlos ist v ist nicht h, lieber das was passt perfekter machen.

angenommen ich hab die hz 1:1 mit triplebuffer, so sollte theoretisch die gleiche verzögerung auftreten?

SailorSat
08-01-2010, 13:18
Korrekt.
Meine emulierten Heimcomputer und Konsolen konnte kaum jemand vom Orginal unterscheiden :D

MrMikeZH
08-01-2010, 13:28
hmm warum zum geier fühl ich einen unterschied mit triplebuffer?

für mich heisst triplebuffer: das bild dass ich sehe ist 2f zu spät, weil er 3f buffert um den vsync zu machen?

wenn die platine den inhalt ändert nach dem aktiven bild so gibts doch ne verzögerung von 16,7ms bei 60hz bzw 1 frame.
bei triplebuffer wären das aber 50ms oder?

SailorSat
08-01-2010, 15:01
Nein, du missverstehst da etwas.
Platinen arbeiten in der Regel "single buffered".
Das heißt es gibt nur den "sichtbaren" Bildinhalt.
Alle Änderungen passieren wenn das Bild schon über eine Zeile drüber ist, oder eben im VSync Bereich.

DoubleBuffer und TrippleBuffer bezeichnen etwas anderes.
Hier gibt es den "PrimaryBuffer", den man sieht, und einen (Double) oder zwei (Tripple) "BackBuffer".

Entgegen allen erwartungen werden diese aber NICHT wie man erwarten könnte nacheinander ausgegeben, sondern "wechseln" durch.

Hintergrund ist, das z.B. 3D Karten ja ihre einzelnen Dreiecke Berechnen und diese dann irgendwo "ablegen" müssen.
Du siehst den "PrimaryBuffer" mit einem fertigen Bild, und im Unsichtbaren "BackBuffer" liegt ein "noch nicht" fertiges Bild.

Wenn das Bild fertig ist wird "getauscht". Das heißt der Back- wird zum PrimaryBuffer, und umgedreht.

Hier kann es (ohne VSYNC) zu dem selben Tearing Effekt kommen.
Um DIESES Problem zu umgehen gibt es TrippleBuffer.

Hierbei gibt es einen Primary- und 2 BackBuffer.
Die hierbei rendert die Grafikkarte immer in den dritten Puffer, und tauscht "von alleine" die ersten beiden aus, wenn eine 3D Berechnung fertig ist, tauscht das Programm den 2ten und 3ten aus...
Somit ist immer nur ein fertiges Bild zu sehen.

Lange Rede kurzer Sinn.
Die Latenz ist in allen 3 Fällen maximal 1 Frame (also 16ms).

Was du "fühlst" ist wahrscheinlich eine Eingabeseitige Verzögerung.

MrMikeZH
08-01-2010, 15:20
ich danke dir wiedermal für deine mühe, schön beschrieben.
wie ists denn bei dir, mame vs platine vom gefühl? auch mal ohne tb probieren.
es sind aber doch 3 puffer die gefüllt sein wollen vor der ausgabe??

kann mann irgendwie double statt triplebuffer aktivieren?
was könnte ich denn noch machen? serielle tastatur? ;)

SailorSat
08-01-2010, 15:29
Du kannst mal kucken ob das auch passiert wenn du NUR vsync in mame aktivierst (heißt waitvsync oder so).

Ansonsten... Mal anderen INput probieren

MrMikeZH
08-01-2010, 15:58
ohne tb braucht man bei mame immer throttle?

SailorSat
08-01-2010, 16:19
Hm nö eigentlich sollte waitvsync langen.

MrMikeZH
08-01-2010, 16:27
mit d3d funktionerts ohne tb und ohne gefühlten unterschied.
bei ddraw muss ich immer tb drinhaben für vsync, hab ich im treiber was falsch eingestellt? verfälscht d3d das bild auch wenn die auflösung 1:1 ist?

SailorSat
08-01-2010, 22:12
Sofern Cleanstretch und/oder ChangeRes auf 1 steht, ist D3D genauso gut wie DDRAW :)

MrMikeZH
08-01-2010, 23:01
cool dann bin doch ein stück weiter. danke dir

pic16c54_
10-01-2010, 18:23
@SailorSat
Vielen Dank für Deine ausführlichen Erklärungen. Hab selten so etwas Kompetentes zu diesem Thema in einem Forum gelesen.

Clark Kent
11-01-2010, 23:42
Grundsätzlich verstehe ich zwar alles, was hier genauestens ausgeführt wird, trotzdem habe ich das Problem, daß ich bei manchen Spielen kein wirklich 100 %ig ruckelfreies Scrolling hinbekomme. Meistens wegen der schon öfters erwähnten seltsamen 60,6 oder eben irgendein Kommawert, Hz. Da nützt mir kein waitvsync, kein tripplebuffer oder sonst was - es ruckt einfach hin und wieder. Es liegt natürlich auch daran, daß die ArcadeVGA eben nur exakt 60 Hz und keine 60,6 Hz wiedergeben kann. Gibt es da irgendeinen Trick, den ich vielleicht hier überlesen habe oder der noch gar nicht geschrieben wurde - oder muß ich einfach mit dem nicht-ganz-perfekten-Scrolling leben?

SailorSat
12-01-2010, 07:05
Bei mir siehts in etwa so aus...

autoframeskip 0
frameskip 0
throttle 0
refreshspeed 0
cleanstretch 1
changeres 1
redraw 0
multithreading 0
video d3d
waitvsync 0
syncrefresh 0
triplebuffer 1
switchres 1

Und nein, die AVGA gibt nie genau 60Hz aus, egal was propagiert wird :)

Clark Kent
12-01-2010, 08:42
Du nutzt d3d statt ddraw? Hat nicht Andy extra darauf hingewiesen, man solle unbedingt ddraw nutzen? Hat man mit d3d nicht die Kantenglättung aktiv? Das möchte ich nämlich auf jeden Fall vermeiden...

Throttle hast Du auch deaktiviert? Ich dachte, daß man das aktiviert haben sollte? Oder ist "Green Beret" wirklich das einzige Spiel, bei dem man das braucht??

Ist bei redraw nicht "auto" am besten? Wenn man es auf "0" stellt, dann hat doch die Funktion überhaupt keine Wirkung? Wozu hast Du das dann eingebaut? Oder verstehe ich da was falsch?

Also meine INI (zu sehen in dem ArcadeVGA INI Thread) unterscheidet sich jetzt auf den ersten Blick nur durch "throttle 1" und "redraw auto" bzw. "ddraw" statt "d3d" - ich werde das jetzt mal probeweise umstellen und mir ansehen, ob sich dadurch etwas bessert...

nexus6
12-01-2010, 11:19
beim "normalen" mame sollte man d3d nicht für arcademonitore verwenden, da das bild skaliert wird. bei cabmame mit aktiviertem cleanstretch ist dies hingegen kein problem.

das leichte ruckeln beim scrolling ist mir auch schon negativ aufgefallen. ich rede jetzt von keinem extremen rucklern oder tearing, sondern nur ein ganz leichtes, welches man zuerst kaum merkt.

Clark Kent
12-01-2010, 12:02
beim "normalen" mame sollte man d3d nicht für arcademonitore verwenden, da das bild skaliert wird. bei cabmame mit aktiviertem cleanstretch ist dies hingegen kein problem.

das leichte ruckeln beim scrolling ist mir auch schon negativ aufgefallen. ich rede jetzt von keinem extremen rucklern oder tearing, sondern nur ein ganz leichtes, welches man zuerst kaum merkt.

Eben genau das meine ich ja!

Da Sailorsat ja davon geschrieben hat, das man ihre Emulationen von den Originalen nicht unterscheiden konnte, muß es da aber irgendeinen Trick geben. Denke ich mal...

SailorSat
12-01-2010, 16:18
Nenn mir mal ein Spiel mit "Mikrorucklern" Oo

Mein Redraw ist nur inaktiv weil ichs seit der Einführung nie gebraucht habe :)

Clark Kent
12-01-2010, 18:08
Nenn mir mal ein Spiel mit "Mikrorucklern" Oo

Mein Redraw ist nur inaktiv weil ichs seit der Einführung nie gebraucht habe :)

Na z. B. Euro Champ 92. Sollte eigentlich butterweich scrollen. Tut es aber nicht...

SailorSat
12-01-2010, 18:49
Läuft bei mir einwandfrei Oo...

Clark Kent
12-01-2010, 19:53
Ich probier jetzt mal die neuen Werte in die MAME.ini einzutragen und berichte dann von den Ergebnissen...

Edit:
Ergebnis: Null. Oder zumindest gleich null.

Obwohl ich jetzt d3d anstatt ddraw verwendet habe (was offensichtlich bei CabMAME wirklich vollkommen egal ist), ändert sich nichts. Stelle ich "throttle" auf "0" laufen zwar alle vertikalen Spiele total flüssig, dafür aber auch mit 50 Hz (statt 60) und somit viel zu langsam - und natürlich "Green Beret" viel zu schnell. Außerdem habe ich in "Flicky" noch immer diese Mikroruckler. "redraw" von "auto" auf "0" umzustellen, hat übrigens auch überhaupt kein Ergebnis gebracht...

Naja, muß ich halt damit leben, wie es ist. Extrem tragisch ist es ja nicht, ich wollte eigentlich nur schauen, wie nahe man an das saubere Scrolling der Originale rankommen kann...

SailorSat
12-01-2010, 20:35
Ich häng dir mal die MAME.INI von meinem Giant an...

Clark Kent
12-01-2010, 20:39
Danke! Mal sehen, wie sich das dann verhält...

Edit: Hat leider nichts gebracht. Offensichtlich brauch ich throttle auf 1 damit die vertikalen Spiele mit 288 Zeilen zwar mit 50 Hz, dafür aber in annähernder Originalgeschwindigkeit laufen. Dafür stört aber wieder throttle andere Spiele. Obwohl nicht bei allen nur throttle Schuld an den Mikrorucklern hat. Egal. Vergiss es. Es ist (zumindest im Moment) nicht so extrem wichtig. Danke trotzdem!

Clark Kent
22-02-2010, 08:01
Ich habe zum Thema vsync und triple buffer etwas herausgefunden: Die ArcadeVGA-Grafikkarte scheint treibermässig Probleme damit zu haben! Nach mehreren e-mail an Andy hat sich herausgestellt, daß alle ATI-Grafikkarten mit dem vsync Schwierigkeiten zu haben scheinen - und die ArcadeVGA ist halt nun mal eine umgeflashte ATI Radeon HD 2400. Es nützt nämlich interessanterweise auch recht wenig im CCC den vsync zu erzwingen, nicht mal mit 3D3Overrider (von RivaTuner) funktioniert das ordnungsgemäß. Darum bekomme ich auch kein 100% sauberes Scrolling in den verschiedenen Emulatoren. Komischerweise funktioniert das Scrolling in Kega Fusion (Megadrive Emulator) absolut sauber, in SNES9X (SNES Emulator) dafür nicht. Und das, obwohl beide Konsolen mit 60 Hz laufen. Bei MAME ist es leider das gleiche - wie schon erwähnt, zuckt "Flicky" beim Scrolling rhythmisch. Ist zwar nicht so schlimm, wie es sich anhört, wenn jedoch vsync und triple buffer einwandfrei funktionieren würden, wäre das nicht der Fall.

Somit ist halt jetzt die große Frage: was tun?

SailorSat
22-02-2010, 08:22
Schön...
Ich hab inzwischen (mit ner Kamera) den ominösen Inputlag den einige Leute bemerken aufs VSync festgenagelt...

Wie's der Zufall so will eine Radeon HD4550 ^^

Das wird was größeres...
Tun kann man da vmtl. fast nix.

Clark Kent
22-02-2010, 14:40
Die ATI Tray Tools bringen übrigens auch nichts. Zumindest mit den Versuchen, die ich damit angestellt habe. Weder das Erzwingen des VSyncs noch das Zuschalten des Triple Buffers bringt in keinster Weise etwas. Das gleiche mit dem D3DOverrider (von den RivaTools). Nix. Das ist gerade so, als ob man die Funktionen gar nicht eingeschalten hätte. Also ein- oder ausschalten bringt keine Veränderung. Langsam finde ich das wirklich sehr sehr eigenartig...

nexus6
22-02-2010, 14:41
wieso ist das die ewig lange zeit, seit dem es die arcadevga gibt, noch niemandem aufgefallen? :)

Clark Kent
23-02-2010, 12:40
Gute Frage!

Aber bei ATI scheint das generell ein Problem zu sein, wenn man sich das in verschiedenen Foren ansieht...

SailorSat
01-03-2010, 20:17
Hast du zufällig VNC in der "Enterprise" Edition auf dem Ding drauf?
bzw. irgendein VNC mit einem Mirror Driver?