15.3 Zeitsteuerung des Skripts

Das richtige Timing ist ein entscheidender Punkt für jedes gute Skript, welches in der Lage sein sollte, auf vielen verschiedenen Systemen laufen zu können. Weil Hollywood für eine Vielzahl von Plattformen verfügbar ist, müssen Sie an die Skript Zeitsteuerung denken, wenn Sie Ihr Skript anderen weitergeben. Das grundlegende Problem ist, dass wenn Sie keinen Geschwindigkeitsbegrenzer Ihrem Skript hinzufügen, es so schnell wie möglich ausgeführt wird. Das könnte kein Problem mit dem 200MHz System sein, aber auf einer 1GHz Maschine ist es sicherlich ein Problem. Stellen Sie sich vor, Sie haben ein Spiel und verwenden die folgende Schleife:

 
/* Schlechter Code */
While quit = False
        dir = p_QueryInput()
        If dir = "Left" Then p_MoveSpriteLeft()
        If dir = "Right" Then p_MoveSpriteRight()
        ....
        p_RedrawDisplay()
Wend

Diese Schleife hat zwei schwerwiegende Probleme:

  1. Es gibt keine Zeitsteuerung in dieser Schleife. Die Schleife wird immer so schnell ausgeführt, wie es die CPU des Host-Systems gestattet. Das ist wirklich schlecht. Es bedeutet, dass der Zeitpunkt nur auf Ihrem System korrekt sein wird und sonst nirgendwo anders.

  2. Diese Schleife wird 100% der CPU-Leistung in Anspruch nehmen, weil es keine Grenzen gibt, die zum Beispiel sagt: "Führen Sie diese Schleife 25-mal pro Sekunde aus und das ist genug!". 100% der CPU-Leistung zu verbrauchen ist möglicherweise auf 68k basierten Systemen kein Problem, aber wenn Sie das Skript auf einem neueren System ausführen, wird das Betriebssystem merklich verlangsamt und der CPU-Lüfter könnte beginnen, einige störende Geräusche zu verursachen. Darüber hinaus denken Sie daran, dass Hollywood in einer Multitasking-Umgebung läuft. Somit werden durch Schleifen wie diese die anderen Aufgaben weniger CPU-Zeit erhalten.

Die Lösung für das Problem ist recht einfach: Wir müssen Hollywood mitteilen, diese Schleife nur mit einer bestimmten Anzahl von Durchläufen pro Sekunde auszuführen. Für die meisten Spiele ist es völlig ausreichend 25-mal pro Sekunde eine Eingabe abzufragen und Grafiken zu zeichnen. Es gibt zwei Methoden, wie Sie ein Drosseln implementieren können:

  1. Mit WaitTimer(). Dieser Befehl übernimmt eine Uhr und einen Timeout-Wert. Sie pausiert das Skript bis die vorgegebene Zeit abgelaufen ist. Dann wird die Uhr zurückgesetzt und Sie können sie wieder verwenden. Unsere Schleife von oben würde mit WaitTimer() wie folgt aussehen:

     
    /* Guter Code */
    StartTimer(1)    ; Startet die Uhr #1
    
    While quit = False
         dir = p_QueryInput()
         If dir = "Left" Then p_MoveSpriteLeft()
         If dir = "Right" Then p_MoveSpriteRight()
         ....
         p_RedrawDisplay()
         WaitTimer(1, 40)    ; laufe nicht schneller ...
                             ; ... als 40 Millisekunden
    Wend
    

    Jetzt wird unsere Schleife nie schneller als 40 Millisekunden ausgeführt. So wird sie nie mehr als 25-mal pro Sekunde ausgeführt werden, weil 25 * 40ms = 1000ms. Daher wird ein Spiel mit dieser Schleife immer mit der gleichen Geschwindigkeit auf jedem System laufen - unabhängig davon, ob die CPU 50MHz oder 1GHz hat.

  2. Die zweite Methode ist SetInterval(). Mit diesem Befehl können Sie eine Intervallfunktion installieren, die Hollywood auf die von Ihnen angegebene Frequenz aufruft. So können Sie Hollywood mitteilen, die Schleife 25-mal pro Sekunde zu durchlaufen. So sieht dieser Code aus:

     
    /* Guter Code */
    Function p_MainLoop()
           ; dieser Code ist derselbe, wie die While-Wend Schleife oben
           dir = QueryInput()
           If dir = "Left" Then MoveSpriteLeft()
           If dir = "Right" Then MoveSpriteRight()
           ....
           RedrawDisplay()
    EndFunction
    
    ; ruft MainLoop() 25 Mal in der Sekunde ...
    ; ... auf -> 40 * 25ms = 1000 Millisekunden
    SetInterval(1, p_MainLoop, 40)
    
    While quit = False
         WaitEvent
    Wend
    

    Dieser Code erledigt das gleiche, wie der Code oben mit WaitTimer(). Der einzige Unterschied ist, dass Sie anstelle von WaitEvent() SetInterval() verwenden müssen, weil Intervallfunktionen Hollywood Ereignisse auslösen.

Beide der oben diskutierten Verfahren sind einfach zu bedienen und effizient. Es ist an Ihnen zu entscheiden, welches Sie bevorzugen.


Navigation zeigen