Zeitsynchronisation

Nachdem die Synchronisation zwischen den einzelnen Hardwarekomponenten geklärt ist, kommen wir zum nächsten Problem: Das emulierende System ist viel zu schnell. Hier kommt die virtuelle Zeit ins Spiel. Der Emulator kann, selbst unoptimiert, auf einem halbwegs modernen Prozessor viel mehr Anweisungen pro Sekunde ausführen als der echte Gameboy. Er muss also regelmäßig angehalten werden.

Stellenmarkt
  1. Sachbearbeiter (m/w/d) Filial-Hotline
    Dirk Rossmann GmbH, Burgwedel
  2. Solution Expert (m/w/d) Analytics
    EPLAN GmbH & Co. KG, deutschlandweit
Detailsuche

Das funktioniert, indem der Emulator dem Betriebssystem mitteilt, dass er für einen gewissen Zeitraum nichts zu tun hat. Wer mit C/C++ programmiert, würde das mittels nanosleep() tun, Javas Thread.sleep() nutzt die Funktion der Beschreibung nach ebenfalls. Dabei müssen aber zwei Randbedingungen beachtet werden: Die erste ist, dass die Mindestschlafdauer ausreichend lang ist. Der Prozess schläft nämlich mindestens so lang wie angegeben, aber immer ein Vielfaches an Betriebssystem-Zeitscheiben. Ich habe als Mindestschlafdauer 10 ms gewählt und lege den Prozess auch nur für das Vielfache dieser Zeit schlafen - was gut funktioniert.

Die zweite Randbedingung hängt mit der virtuellen Zeit zusammen. Mit ihr bestimmt die Prozessverwaltung, wie lange ein echter Gameboy für die Abarbeitung einer Folge von Prozessorbefehlen gebraucht hätte. Daraus ermittelt er die Zeit, die hätte vergehen sollen und vergleicht sie mit der Zeit, die tatsächlich vergangen ist.

Virtuelle Zeit ist einfacher, als sie klingt

Die virtuelle Uhr des Emulators ist einfach eine 64-Bit-Ganzzahl (Integer). Jede emulierte Anweisung erhöht sie. Dafür enthält die entsprechende Klasse eine Konstante, die die Anzahl der für die Anweisung benötigten Takte des Gameboy-Prozessors enthält. Das ist so einfach, weil der Prozessor kein Pipelining unterstützt, die Dauer jeder Anweisung also von den vorherigen unabhängig ist.

Golem Karrierewelt
  1. Entwicklung mit Unity auf der Microsoft HoloLens 2 Plattform: virtueller Zwei-Tage-Workshop
    10./11.10.2022, Virtuell
  2. Adobe Premiere Pro Grundkurs: virtueller Zwei-Tage-Workshop
    02./03.08.2022, Virtuell
Weitere IT-Trainings

Jetzt muss also nur noch regelmäßig geprüft werden, ob die virtuelle Zeit von der realen um mehr als 10 ms abweicht. Und hier kommen wir zum eigentlichen Problem: Wie oft sollte das geprüft werden? Um zu prüfen, muss nämlich jedes Mal die aktuelle (reale) Zeit angefordert werden. Das bedeutet den Aufruf einer Betriebssystemfunktion - unter Linux clock_gettime() - was ineffizient ist, wenn es zu oft geschieht.

Wird allerdings zu selten geprüft, führt das zu einer großen Differenz zwischen virtueller und realer Zeit. Das Ergebnis ist, dass der Emulator stockt und schlecht reagiert. Ich habe mich für 25 Prüfungen pro Sekunde entschieden, das liefert ganz gute Ergebnisse. Aber ich hatte noch eine bessere Idee - dachte ich.

Nintendo Switch (OLED-Modell) Weiss

Windows macht komische Sachen

Denn eigentlich wäre es doch cleverer, möglichst oft und kurz zu schlafen, um die Abweichung zwischen realer und virtueller Zeit klein zu halten. Dadurch würde das Stocken der Emulation weiter verringert, idealerweise würde auch der Prozessor weniger hoch- und runtertakten. Da unbekannt ist, wie viele Gameboy-Takte emuliert werden können, bis die Abweichung 10 ms übersteigt, muss das ausprobiert werden. Der Emulator versucht, die Anzahl emulierter Takte des Gameboy-Prozessors so anzupassen, dass danach die Zeitdifferenz etwa 10 ms beträgt.

Unter Linux hat das super funktioniert, aber als ich den Emulator unter Windows ausgeführt habe, wurde er immer langsamer. Der Grund dafür kann entweder mein zu simpler Algorithmus sein oder sich in den Implementierungsdetails des Windows-Schedulers finden. Da ich aber eine funktionierende Lösung hatte, habe ich das nicht weiter verfolgt. Und ich muss dazu sagen: Zuletzt habe ich das mit Windows 7 ausprobiert, möglicherweise wäre es bei neueren Versionen anders.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Eigene ProzessverwaltungBild und Ton müssen stimmen 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7.  


jhi (Golem.de) 14. Jun 2022 / Themenstart

Ja, das ist richtig, aber auf der Ebene dessen, was ich an Code schreibe, findet er nicht...

Kommentieren



Aktuell auf der Startseite von Golem.de
Hollywood und das Internet
Sind wir schon drin?

Die neue Dokuserie Web of Make Believe taucht auf Netflix in die Untiefen des Internets ein. So realistisch hat Hollywood das Netz jahrzehntelang nicht thematisiert.
Von Peter Osteried

Hollywood und das Internet: Sind wir schon drin?
Artikel
  1. Datenpanne: IT-Mitarbeiter verliert USB-Stick mit Meldedaten einer Stadt
    Datenpanne
    IT-Mitarbeiter verliert USB-Stick mit Meldedaten einer Stadt

    Die Tasche mit dem USB-Stick wurde über in ihr ebenfalls enthaltene Smartphone geortet und gefunden.

  2. Logistik: Post will mit Solarschiff Pakete in Berlin verteilen
    Logistik
    Post will mit Solarschiff Pakete in Berlin verteilen

    Die Post will Pakettransporte von der Straße aufs Wasser verlagern. Das erste der Schiffe wird mit Solarstrom betrieben. In Zukunft sollen sie autonom fahren.

  3. Franziska Giffey: Deepfake von Klitschko täuscht Berlins Bürgermeisterin
    Franziska Giffey
    Deepfake von Klitschko täuscht Berlins Bürgermeisterin

    Berlins Regierende Bürgermeisterin Franziska Giffey (SPD) hat per Videokonferenz mit einem Deepfake von Vitali Klitschko gesprochen. Der Betrug flog auf.

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • MSI 323CQRDE (WQHD, 165 Hz) 399€ • LG OLED 48C17LB 919€ • Samsung 980 PRO (PS5-komp.) 2 TB 234,45€ • Apple HomePod Mini 84€ • 16.000 Artikel günstiger bei Media Markt • MindStar (u. a. AMD Ryzen 7 5700G 239€, Samsung 970 EVO Plus 250 GB 39€ und Corsair Crystal 680X RGB 159€) [Werbung]
    •  /