Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 15 von 32

Thema: Triple Buffer

  1. #1
    Registered User
    Registriert seit
    01.05.2008
    Beiträge
    70

    Triple Buffer

    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?

  2. #2
    H@ckse Avatar von SailorSat
    Registriert seit
    26.08.2004
    Ort
    Hanau (Hessen)
    Beiträge
    2.057
    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.
    Ich mach das alles auch ohne Joystick ,)

  3. #3
    Mozart not Kangaroos
    Registriert seit
    01.09.2004
    Beiträge
    255
    Zitat Zitat von SailorSat Beitrag anzeigen
    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...

  4. #4
    Registered User
    Registriert seit
    01.05.2008
    Beiträge
    70
    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?

  5. #5
    H@ckse Avatar von SailorSat
    Registriert seit
    26.08.2004
    Ort
    Hanau (Hessen)
    Beiträge
    2.057
    Korrekt.
    Meine emulierten Heimcomputer und Konsolen konnte kaum jemand vom Orginal unterscheiden
    Ich mach das alles auch ohne Joystick ,)

  6. #6
    Registered User
    Registriert seit
    01.05.2008
    Beiträge
    70
    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?
    Geändert von MrMikeZH (08-01-2010 um 13:36 Uhr)

  7. #7
    H@ckse Avatar von SailorSat
    Registriert seit
    26.08.2004
    Ort
    Hanau (Hessen)
    Beiträge
    2.057
    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.
    Ich mach das alles auch ohne Joystick ,)

  8. #8
    Registered User
    Registriert seit
    01.05.2008
    Beiträge
    70
    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?
    Geändert von MrMikeZH (08-01-2010 um 15:25 Uhr)

  9. #9
    H@ckse Avatar von SailorSat
    Registriert seit
    26.08.2004
    Ort
    Hanau (Hessen)
    Beiträge
    2.057
    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
    Ich mach das alles auch ohne Joystick ,)

  10. #10
    Registered User
    Registriert seit
    01.05.2008
    Beiträge
    70
    ohne tb braucht man bei mame immer throttle?

  11. #11
    H@ckse Avatar von SailorSat
    Registriert seit
    26.08.2004
    Ort
    Hanau (Hessen)
    Beiträge
    2.057
    Hm nö eigentlich sollte waitvsync langen.
    Ich mach das alles auch ohne Joystick ,)

  12. #12
    Registered User
    Registriert seit
    01.05.2008
    Beiträge
    70
    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?

  13. #13
    H@ckse Avatar von SailorSat
    Registriert seit
    26.08.2004
    Ort
    Hanau (Hessen)
    Beiträge
    2.057
    Sofern Cleanstretch und/oder ChangeRes auf 1 steht, ist D3D genauso gut wie DDRAW
    Ich mach das alles auch ohne Joystick ,)

  14. #14
    Registered User
    Registriert seit
    01.05.2008
    Beiträge
    70
    cool dann bin doch ein stück weiter. danke dir

  15. #15
    Registered User
    Registriert seit
    19.09.2004
    Beiträge
    26
    @SailorSat
    Vielen Dank für Deine ausführlichen Erklärungen. Hab selten so etwas Kompetentes zu diesem Thema in einem Forum gelesen.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •