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:
#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.
#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.