24.24 Skalierungssysteme

Beginnend mit Hollywood 4.0 stehen zwei Skalierungssysteme zur Verfügung. Beide können Ihr Skript dazu zwingen, in einer anderen Auflösung zu laufen, als es eigentlich entworfen wurde. Zum Beispiel schreibt man ein kleines Spiel in 320x240, so dass es schnell genug auf klassische Amigas läuft. Auf modernen Amigas wird jedoch 320x240 als ziemlich kleines Fenster angezeigt. So können Sie jetzt Hollywoods Skalierungssystem verwenden, um Ihr Skript ohne eine einzige Zeile Code zu ändern, in 640x480 oder 800x600 erscheinen zu lassen! Sie müssen nur eine der beiden Skalierungssystemen aktivieren.

Wenn ein Skalierungssystem aktiv ist, ist das Skript immer noch der Meinung, dass es in seiner ursprünglichen Auflösung ausgeführt wird. Dies bedeutet zum Beispiel, dass die Aufrufe wie

 
width = GetAttribute(#DISPLAY, 0, #ATTRWIDTH)
height = GetAttribute(#DISPLAY, 0, #ATTRHEIGHT)

320x240 zurückgeben wird, obwohl das Skript jetzt in einer ganz anderen Auflösung läuft. Das Skript wird nicht bemerken, dass eine Skalierungssystem überhaupt aktiv ist! Das Skalierungssystem wird komplett transparent am Anfang des Skripts installiert.

Skalierungssysteme können entweder über die Konsole oder dem Skript aktiviert werden. Die beiden Konsolenargumente heißten -autoscale und -layerscale. Im Skript geschieht dies über die Präprozessor-Anweisung @DISPLAY und dem Parameter ScaleMode oder durch den Aufruf vom Befehl SetDisplayAttributes().

Hollywood besitzt zwei Skalierungssysteme:

  1. Autoskalierung: Sie können dieses Skalierungssystem aktivieren, indem Sie das -autoscale Argument benutzen, den Parameter #SCALEMODE_AUTO mit der Präprozessor-Anweisung @DISPLAY zusammen verwenden oder den Befehl SetDisplayAttributes() aufrufen. Dieses Skalierungssystem ist ein Lowlevel Skalierungsmodul, das einfach alle grafischen Ausgaben von Hollywood auf die neue Dimensionen skaliert. Deswegen wird Autoskalierung mit allen Hollywood-Skripten ohne Ausnahmen funktionieren. Der Nachteil des Autoskalierung-Systems ist a), dass es ziemlich CPU-lastig werden kann, falls das Hostsystem keine hardwarebeschleunigte Skalierung unterstützt. b) dass es Vektorgrafiken im Bitmap-Modus skaliert, was beispielsweise bedeutet, dass z.B. TrueType-Schriften, Grafikgrundelemente oder Vektorpinsel sich in der Qualität verringern und c) das Zeichnen ist langsamer, da das gesammte Display aktualisiert werden muss, selbst wenn sich nur ein Pixel geändert hat. Sie können die Leistung der automatischen Skalierung verbessern, indem Sie einen Doppelpuffer zum Zeichnen verwenden. Kapseln Sie alle Zeichnungsbefehle in einem BeginRefresh() und EndRefresh() Abschnitt. Siehe BeginRefresh für Details.

    Eine weitere Möglichkeit, die Leistung der Autoskalierung stark zu verbessern, besteht darin, ein Plugin mit hardwarebeschleunigte Skalierung zu verwenden, z.B. GL Galore oder RebelSDL. Plugins mit hardwarebeschleunigter Skalierung können die Autoskalierung sehr schnell anwenden. Siehe Vorhandene Plugins für Details.

  2. Ebenenskalierung: Die Ebenenskalierung ist ein anspruchsvolles, High-Level Skalierungsmodul, welches Sie durch die Angabe des -layerscale Arguments, mit dem #SCALEMODE_LAYER Parameter mit der Präprozessor-Anweisung @DISPLAY oder dem Befehl SetDisplayAttributes() aktivieren. Diese Skalierungsmethode a) ist oftmals viel schneller als die Autoskalierung, da die Ebenen nur einmal skaliert werden b) bietet eine höhere Ausgabequalität für Vektorgrafiken (d.h. Grafikgrundelemente, Vektorpinsel, TrueType-Schriften), da sie ohne Qualitätsverlust skaliert werden können c) zeichnet schneller, weil nur Teile des Displays aktualisiert werden müssen. Der Nachteil der Ebenenskalierung ist, dass es nur funktioniert, wenn Hollywood im Ebenenmodus ist und es braucht mehr Speicher. Außerdem können sie aber auch nicht den Befehl DisableLayers() verwenden, wenn die Ebenenskalierung aktiv ist. Wenn Sie also die Ebenenskalierung verwenden wollen, muss Ihr ganzes Skript im Ebenenmodus laufen.

Wie es aus diesen Beschreibungen klingen mag, wäre Option (2) die ideale Skalierungsmethode. Das ist aber nicht unbedingt wahr. In der Tat ist die Autoskalierung in den meisten Fällen ziemlich ausreichend. Die Ebenenskalierung ist nur für Projekte wie Präsentationen wichtig, die zu einer HDTV-Auflösung oder ähnlichem verwendet werden. In diesem Fall ist es wichtig, dass die Vektorgrafiken im Vektormodus skaliert werden, so dass ein scharfes Ergebnis erzielt wird. Unter normalen Umständen sollte jedoch die Autoskalierung für die meisten Projekte ausreichen. Und lassen Sie sich nicht durch die Tatsache entmutigen, dass sie langsamer ist als die Ebenenskalierung. Auf modernen Systemen werden Sie wahrscheinlich nichts von dieser Verlangsamung bemerken!

Wenn Sie ein Skalierungssystem aktivieren, müssen Sie auch die Skalierungsauflösung angeben. Dies kann auf zwei verschiedene Arten erfolgen: Sie können die Skalierungsauflösung entweder mit den Konsolenargumenten -scalewidth und -scaleheight oder deren Gegenstücken ScaleWidth und ScaleHeight einstellen, wenn Sie @DISPLAY oder SetDisplayAttributes() verwenden. Ansonsten können Sie einen globalen Skalierungskoeffizienten mit den Konsolenargumenten -scalefactor oder -systemscale festlegen oder deren Laufzeitgegenstücke @DISPLAY oder SetDisplayAttributes() benutzen.

Beachten Sie, dass das Verhalten zwischen der Einstellung der Skalierungsauflösung mit ScaleWidth sowie ScaleHeight und der mit ScaleFactor sowie SystemScale unterscheidet. Wenn Sie ScaleWidth und ScaleHeight verwenden, wird die an diese Tags übergebene Größe streng erzwungen und Ihr Display behält diese Größe immer bei, selbst wenn das Skript eine Änderung durch den Befehl ChangeDisplaySize() vornimmt oder indem Sie ein Hintergrundbild mit einer anderen Größe mit dem Befehl DisplayBGPic() anzeigen. Die Displaygröße kann nur geändert werden, wenn zum Einstellen der Skalierungsauflösung ScaleWidth und ScaleHeight verwendet wurde und der Benutzer das Fenster ändert. Andernfalls ändert das Display niemals seine Abmessungen.

Bei der Verwendung von ScaleFactor oder SystemScale wird dagegen ein Skalierungskoeffizient auf die aktuelle Displaygröße angewendet. Dies bedeutet, dass die Skalierungsgröße nicht statisch ist wie bei ScaleWidth und ScaleHeight (siehe oben). Sie ist jedoch dynamisch, da sie relativ zur aktuellen Displaygröße ist, z.B. wenn ein Skalierungskoeffizient von 2.0 angewendet wird und ein Display zuerst 640x480 Pixel und später 800x600 Pixel groß ist, wird das Display zuerst auf 1280x960 Pixel und dann auf 1600x1200 Pixel erhöht. Dies macht ScaleFactor ideal für die Skalierung eines Skripts für ein Display mit hoher Auflösung, da sichergestellt ist, dass sich das Skript genau gleich verhält, aber nur größer erscheint (oder kleiner, wenn Sie möchten!).

Es besteht auch der Unterschied, dass SizeWindow-Ereignisse nur dann an Ihr Display gesendet werden, wenn ein Skalierungssystem aktiv ist und Sie entweder ScaleFactor oder SystemScale verwenden, um die Auflösung der Skalierung festzulegen. Wenn Sie ScaleWidth und ScaleHeight verwenden, werden keine SizeWindow-Ereignisse an Ihr Display gesendet, da Änderungen der Fenstergröße vom Skalierungssystem verarbeitet werden.

Wenn Sie eine Skalierungssystem aktivieren, aber weder -scalewidth, -scaleheight noch -scalefactor oder -systemscale angeben, dann wird ein Skalierungssystem erst aktiviert, wenn der Benutzer die Fenstergröße ändert. Sobald er dies tut, wird die neue Fenstergröße als Skalierungsgröße festgelegt.

Schließlich können Sie das Argument -smoothscale angeben, um die interpolierte Antialias-Skalierung für Bitmap-Grafiken zu aktivieren. Dies sieht zwar besser aus, kann aber langsamer sein, wenn keine hardwarebeschleunigte Skalierung verfügbar ist.


Navigation zeigen