Optimieren heißt, dass etwas besser oder effizienter funktioniert: Das Spiel lädt und läuft schneller, braucht weniger Rechenleistung, Arbeitsspeicher oder Grafikspeicher oder weniger Platz auf der Festplatte. Optimieren bedeutet immer, Kompromisse zu finden. Worauf kannst du verzichten? Wir brauchen Luft, Wasser und Essen zum Leben, aber nicht unser Lieblingsfastfood. Nach demselben Prinzip optimierst du dein Spiel für die Mindestanforderungen, die du anpeilst.

2D-Spiele brauchen oft mehr Speicher, weil Animationsdateien in 2D meist größer sind als vergleichbare 3D-Animationen, abhängig von der Auflösung deines Spiels und der Größe deiner Animationen. In Visionaire Studio gibt es mehrere Wege, die Dateigröße der einzelnen Frames zu verkleinern und so die Ladezeit zu verkürzen. Das hilft vor allem auf Mobilgeräten und auf schwächeren oder mittelstarken Rechnern.

Spieleentwicklung ist eher wie einen Film zu drehen als einen Roman zu schreiben: Zeit, Geld, Ressourcen, Speicherplatz und die Leistung der Zielgeräte sind begrenzt. Entwickelst du auf einem sehr teuren Hochleistungsrechner und hast schon dort Probleme, läuft das Spiel auf einfachen Laptops oder Mittelklasse-PCs kaum besser. Denk daran.


Hochskalieren

Animationen, die nicht ganz scharf sein müssen und ruhig etwas weich oder pixelig wirken dürfen, etwa Regen, Schnee, Nebel, Wolken, Wasser oder Animationen im Hintergrund, legst du kleiner an, zum Beispiel mit 25 bis 50 % der eigentlichen Größe, und skalierst sie mit einer einfachen Lua-Zeile auf normale Größe hoch. So sparst du viel Dateigröße bei Bildern und Animationen.

Objekt-Sprite

Skaliert das Bild eines Szenenobjekts hoch. Das eignet sich für Überlagerungen oder für ein einfarbiges Bild, mit dem du den Bildschirm beim Laden oder bei Szenenwechseln abdeckst. Dafür ist Visionaire Studio 4.1 oder neuer nötig.

Objects["rock"].Scale = 4.0 -- scale "rock" object sprite up to 400% (shorthand method)
getObject("Objects[rock]"):setValue(VObjectScale, 4.0) -- same as above, but longhand

Animation

Skaliert eine Animation hoch, egal ob sie zu einem Szenenobjekt, einem Charakter, einem Interface oder einem Mauszeiger gehört. Am besten fügst du den Code im ersten Frame der Animation über einen Aktionsteil „Skript ausführen“ ein. Die Animation muss dafür aktiv sein (laufen oder vorgeladen). Visionaire Studio 4.1 oder neuer ist nur für die Kurzschreibweise nötig.

ActiveAnimations["water_ripple"].AnimationSize = 400 -- scale "water_ripple" animation up to 400% (shorthand method)
getObject("ActiveAnimations[water_ripple]"):setValue(VAnimationSize, 400) -- same as above, but longhand


Weniger Frames

Du legst mehrere Fassungen derselben Animation an: eine mit allen Frames und eine oder zwei mit weniger Frames. Dann baust du Spieloptionen (Bedingungen oder Werte), mit denen der Spieler die Grafikqualität wählt, und entscheidest per Wenn/Sonst-Abfrage, welche Fassung läuft. Animationen mit weniger Frames laden schneller, wirken aber vielleicht weniger flüssig; für schwächere Rechner lohnt sich das. Über dieselbe Option kannst du auch rein dekorative Animationen oder Shader-Effekte abschalten lassen, denn zu viel gleichzeitig auf dem Bildschirm kann ruckeln und das Laden anderer Animationen bremsen.


Frame-Pausen statt mehr Frames

Viele glauben, sie müssten Frames doppelt einfügen, um die Geschwindigkeit einer Animation zu steuern oder sie vor- und zurücklaufen zu lassen.

Für die Geschwindigkeit aktivierst du besser in den Eigenschaften der Animation „Für jedes Bild eine Pause festlegen“. Rechts in der Werkzeugleiste der Animation trägst du dann ein, wie viele Millisekunden der ausgewählte Frame angezeigt wird.

Für Animationen, die vor- und zurücklaufen sollen, importierst du die Vorwärtsfassung und fügst dann einzeln die Frames für den Rückweg hinzu, meist vom vorletzten bis zum zweiten Frame. Inzwischen gibt es dafür auch die Abspieloption „Pendel“, und per Lua lässt sich die Abspielrichtung ebenfalls steuern.

Für Animationen, die rückwärts laufen sollen, nimmst du den Aktionsteil „Animation abspielen“ und aktivierst „In umgekehrter Reihenfolge abspielen“.


Bewegung zeichnen oder vom System bewegen lassen

Seit Visionaire Studio 4.0 bewegst du Objekte und Animationen dank der Aktionsteile zum Verschieben von Objekten und der Funktion startObjectTween in Lua viel einfacher als früher. Die Lua-Variante ist flexibler, weil du zusätzlich ein Easing festlegen kannst. So bewegst du etwas über den Bildschirm, ohne es Frame für Frame zu zeichnen, und sparst Speicherplatz und viele Frames für etwas, das mit Aktionsteilen oder Skript in Minuten erledigt ist.


Beispiel mit startObjectTween:

local anim = ActiveAnimations["bird"]
startObjectTween(anim, VAnimationCurrentPosition, anim.AnimationCurrentPosition, {x = 300, y = 500}, 3000, easeQuintInOut) -- send bird to 300 by 500 over 3 seconds with smooth easing in & out.

Beispiel mit to() (Visionaire Studio 4.1 oder neuer):

ActiveAnimations["bird"]:to(3000, { AnimationCurrentPosition = {x = 300, y = 500} }, easeQuintOut) -- same as startObjectTween function, but significantly less code is required & multiple parameters can be affected in the same to() function.


In WebP umwandeln

Mehr dazu unter Bildformate.