Unabhängiges Timing von Grafik und Ton

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Unabhängiges Timing von Grafik und Ton

Beitrag von zatzen »

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
mov ax, 13h
int 10h

while vorne_frei do vor;
Benutzeravatar
Dosenware
DOS-Gott
Beiträge: 3745
Registriert: Mi 24. Mai 2006, 20:29

Re: Unabhängiges Timing von Grafik und Ton

Beitrag von Dosenware »

Timer 1C für gesamt, Soundkartenint für den Sound.

bei Timer Flags setzen - d.h. mehr Soundpuffer damit es nicht stockt.
Die Intauslösung ist ja weitestgehend unabhängig von der Größe des Puffers.
Ich habe z.b. dem DMA-Controller einen größeren Soundpuffer mitgegeben als ich der Soundkarte per Block_Length mitteile - so kann ich bei CADPCM (kann kein Auto-Init) einfach direkt das Abspielen des nächsten Blocks anstoßen.

Der Rest ist halt die Prozeduren so klein wie möglich zu halten.
Evtl bedeutet das das du den Puffer für die Berechnung in noch kleinere Einheiten teilst.
Musst dann aber darauf achten dass genügend Timerints zwischen 2 Soundkartenints liegen.

Die Framerate wird dann Variabel wenn du die Hauptschleife nun ja... einfach Loopst - unabhängig von den Ints und die Flags nur zur Steuerung/Auslösen von Ereignissen Nutzt - wie z.b. die Berechnung des nächsten Soundpuffers.
Benutzeravatar
zatzen
DOS-Guru
Beiträge: 518
Registriert: Di 17. Apr 2012, 05:10
Wohnort: bei Köln
Kontaktdaten:

Re: Unabhängiges Timing von Grafik und Ton

Beitrag von zatzen »

Vielen Dank, Dir!
mov ax, 13h
int 10h

while vorne_frei do vor;
Antworten