Unabhängiges Timing von Grafik und Ton
Verfasst: Fr 22. Okt 2021, 18:30
Hallo zusammen!
Ich hätte vielleicht längst einmal ein kleines Spiel realisiert, komme aber seit ein paar Jahren mit einem Problem nicht weiter:
Ich habe digitalen Ton (PCM), der Puffer-weise berechnet werden muss. Dazu möchte ich bewegte Grafik haben.
Meine bisherige einzige Möglichkeit die ich gesehen habe war, die Grafik immer nur bei jedem neuen abgespielten Soundpuffer zu aktualisieren. Dadurch entsteht eine direkte Abhängigkeit von Soundpuffer und Grafikaktualisierung, und die Framerate der Grafik wird bestimmt durch die Soundpuffer-Länge, d.h. antiproportional. Für reine Videos wäre das vielleicht der richtige Weg, aber für ein Spiel, bei dem Soundpufferlänge und Grafik-Framerate besser unabhängig sein sollten, und die Grafik-Framerate evtl. sogar variabel und leistugsangepasst, würde man Rechenkapazität und Flexibilität verschenken.
DOSferatu hatte mir in den letzten Jahren diesbezüglich schon geduldig seine Methode erklärt.
Ich habe es etwa so verstanden:
- Es gibt eine Hauptschleife
- Darin sind mehrere Berechnungsroutinen: Für den Ton, für die Grafik, für Sonstiges.
- Es gibt Flags, die anzeigen, wann Grafik, Sound, sonstiges neu berechnet werden müssen, Sound bspw. immer, wenn ein neuer Puffer abgespielt wird - dann muss der nächste berechnet werden.
Mein Verständnisproblem ist nun, wie kann ich beispielsweise eine Grafik-Framerate von 50 Hz realisieren (evtl. nur mit ganz wenig bewegter Grafik), und gleichzeitig einen Soundpuffer von z.B. 4096 Byte, ohne dass es letztlich trotzdem hakelt bei jedem neuen Soundpuffer, weil es anzunehmen ist, dass diese 4096 Byte Soundpuffer mehr Rechenaufwand sind als ein(1) Grafikframe, und länger zur Berechnung benötigen als < 20 Millisekunden?
Wäre die Lösung vielleicht, dass man die Regelmäßigkeit von Berechnung und Anzeige der Grafik über einen Timer-Interrupt erzwingt und damit die Berechnung des Soundpuffers unterbricht, welche eben sonst zum Hakeln der Grafik führen würde? Dann wäre aber wieder die variabale Framerate weg, oder nur in Form von Frames auslassen möglich, d.h. was die Framerate angeht dann erst Halbierung, Drittelung, Viertelung usw.
Danke für Eure Aufmerksamkeit
Ich hätte vielleicht längst einmal ein kleines Spiel realisiert, komme aber seit ein paar Jahren mit einem Problem nicht weiter:
Ich habe digitalen Ton (PCM), der Puffer-weise berechnet werden muss. Dazu möchte ich bewegte Grafik haben.
Meine bisherige einzige Möglichkeit die ich gesehen habe war, die Grafik immer nur bei jedem neuen abgespielten Soundpuffer zu aktualisieren. Dadurch entsteht eine direkte Abhängigkeit von Soundpuffer und Grafikaktualisierung, und die Framerate der Grafik wird bestimmt durch die Soundpuffer-Länge, d.h. antiproportional. Für reine Videos wäre das vielleicht der richtige Weg, aber für ein Spiel, bei dem Soundpufferlänge und Grafik-Framerate besser unabhängig sein sollten, und die Grafik-Framerate evtl. sogar variabel und leistugsangepasst, würde man Rechenkapazität und Flexibilität verschenken.
DOSferatu hatte mir in den letzten Jahren diesbezüglich schon geduldig seine Methode erklärt.
Ich habe es etwa so verstanden:
- Es gibt eine Hauptschleife
- Darin sind mehrere Berechnungsroutinen: Für den Ton, für die Grafik, für Sonstiges.
- Es gibt Flags, die anzeigen, wann Grafik, Sound, sonstiges neu berechnet werden müssen, Sound bspw. immer, wenn ein neuer Puffer abgespielt wird - dann muss der nächste berechnet werden.
Mein Verständnisproblem ist nun, wie kann ich beispielsweise eine Grafik-Framerate von 50 Hz realisieren (evtl. nur mit ganz wenig bewegter Grafik), und gleichzeitig einen Soundpuffer von z.B. 4096 Byte, ohne dass es letztlich trotzdem hakelt bei jedem neuen Soundpuffer, weil es anzunehmen ist, dass diese 4096 Byte Soundpuffer mehr Rechenaufwand sind als ein(1) Grafikframe, und länger zur Berechnung benötigen als < 20 Millisekunden?
Wäre die Lösung vielleicht, dass man die Regelmäßigkeit von Berechnung und Anzeige der Grafik über einen Timer-Interrupt erzwingt und damit die Berechnung des Soundpuffers unterbricht, welche eben sonst zum Hakeln der Grafik führen würde? Dann wäre aber wieder die variabale Framerate weg, oder nur in Form von Frames auslassen möglich, d.h. was die Framerate angeht dann erst Halbierung, Drittelung, Viertelung usw.
Danke für Eure Aufmerksamkeit