Spiele + gleichzeitiger Sound über Lautsprecher

Auswahl, Einrichtung und Betrieb von Rechnern und Komponenten
Antworten
markusk
Norton Commander
Beiträge: 132
Registriert: Fr 19. Apr 2013, 11:12

Spiele + gleichzeitiger Sound über Lautsprecher

Beitrag von markusk »

Hallo,

mich würde mal interessieren wie das technisch abläuft wenn beispielsweise in einem Spiel während des animierten Spielgeschehens parallel dazu unterbrechungsfrei der Sound aus dem Lautsprecher ertönt.

Wie funktioniert das in einem Singletask-System wie DOS ? Der Sound müsste da ja in einem eigenen "Thread" laufen, aber das gibt's unter DOS ja nicht soviel ich weiß.

lg, Markus
Benutzeravatar
Dark_Lord
CONFIG.SYS-Autor
Beiträge: 261
Registriert: So 25. Mai 2008, 19:44
Wohnort: Nähe Köln
Kontaktdaten:

Re: Spiele + gleichzeitiger Sound über Lautsprecher

Beitrag von Dark_Lord »

Da hat bestimmt jeder sein eigenes Geheimrezept. Nur, weil das Betriebssystem nicht Multitasking-fähig ist, muss das ja nicht heißen, dass die Softwareentwickler sich nicht eigene Mechanismen einbauen können. Windows war ja auch lange Zeit ein DOS-Aufsatz und konnte Multitasking so einigermaßen, auch wenn DOS es offiziell nicht hergegeben hat (letztendlich ist aber alles, was über Interrupts oder TSRs läuft auch eine Art Multitasking in DOS)

Bei Digitalsound dürfte es relativ einfach sein, da muss "nur" in angemessenen Abständen ein neues Stück Wave-Audio angeschoben werden, übertragen wird es ja per DMA.

Spannender ist Musik. Da müssen die MIDI-Befehle oder die Befehle an den FM-Synthesizer oder den PC-Speaker ja zum richtigen Zeitpunkt kommen.

Letztlich ist Multitasking ja nichts anderes, als auf einer CPU (und wir reden ja in der DOS-Ära über 1 Kern, ein Thread) Zeit-Slots für bestimmte Aufgaben verschachtelt hintereinander zu schalten oder für eine Aufgabe eine Unterbrechung auszulösen.

Natürlich kannst du die Musik-Routine auf den Timer-Interrupt aufschalten (sie muss dann die Routine, die zuvor auf dem Interrupt lag, durchschleifen, also in Folge aufrufen, sonst hängt das System, und natürlich muss der Vorgang durch sauberes Beenden rückgängig gemacht werden - ich unterstelle, das haben die wenigsten Entwickler gemacht, weil ein unsauberer Abbruch zu einem kompletten Systemhänger führen würde).

Ich denke mal, was am ehesten gemacht wird, und dafür spricht auch, dass auf zu langsameren Rechnern die Musik langsamer und ungleichmäßig läuft, ist das Spiel in einer Schleife laufen zu lassen, die nacheinander die Routinen "Musik", "Bild" und "Spielgeschehen" aufruft. Primitivstes Multitasking ohne Prioritäten und und Echtzeit-Anspruch.

In der späten DOS-Ära bei Spielen mit DOS4GW Extender, also Protected Mode, dürfte es etwas anspruchsvoller geworden sein, immerhin laufen die Spiele ja auch in einer Echtzeit unabhängig vom CPU-Takt, nur halt abhängig von der CPU ruckelnd oder flüssig und die Musik schwankt auch nicht mehr in der Geschwindigkeit. Vielleicht haben die Spiele-Engines sogar schon ein prioritätenbasiertes Multitasking implementiert, zudem könnte ich mir vorstellen, dass man im Protected Mode, wo man ja eh einen sauberen Exit braucht, weniger Hemmungen hat, sich für solche Echtzeit-Aufgaben auf dem Timer-Interrupt aufzuschalten.
Arbeitspferde: Xeon E5-2683v3 und Q6600

Retro:
P2-450
Commodore PC20-II/Tandy Sound
286/ET3000/Aztech NX-II
Amiga 500/Gotek/Vortex AT-once Plus 286
Pentium 166/FAST Video Machine

Projekt-PCs: C64, Dual Pentium MMX 233, 486 VLB, 486 PCI, K6, Athlon 64
Projekte: USB RetroArduInput
markusk
Norton Commander
Beiträge: 132
Registriert: Fr 19. Apr 2013, 11:12

Re: Spiele + gleichzeitiger Sound über Lautsprecher

Beitrag von markusk »

Hallo,

Aha ok, ich hab mir da gerade nämlich eine Routine in Assembler geschrieben die einen bestimmten Ton mit einer bestimmten Dauer ausgibt. Für die Dauer hab ich den Interrupt 1ch verwendet, jedesmal wenn der Ton gestartet wird bieg ich den Interrupt auf eine eigene Routine um welche nichts anderes tut als einen Zähler in Höhe der Dauer runterzuzählen.

In meiner Routine frag ich in einer Schleife ab ob der Zähler schon auf 0 ist und wenn ja schalte ich den Ton ab und aktiviere wieder den alten Interrupt Handler.

Aber das Warten auf Zählerstand 0 in der Schleife blockiert das Programm ja und da hab ich mich eben gefragt wie das gehen soll wenn da „gleichzeitig“ auch noch was anderes ablaufen soll, eben z.b. eine Animation.

Lg, Markus
Antworten