Renderleistung für Flash-Spiele

11

Ich habe auf SO über natives Flash-Rendering und das Erstellen eines benutzerdefinierten BitmapDataFrame-Puffers gelesen und einige der Antworten waren etwas widersprüchlich, also habe ich mich gefragt:

  1. Ist es im Allgemeinen die beste Vorgehensweise, die benutzerdefinierte Bitmap-Pufferroute zu wählen, oder ist es am besten, das Rendern der Flash-Engine zu überlassen?
  2. Wenn Sie Vektoranimationen MovieClipim Gegensatz zu Sprites verwenden, ändert dies die Antwort auf die oben genannten Punkte?
  3. Wenn ja, empfiehlt es sich, Sprite-basierte Animationen zu verwenden?

(Ich ziele auf Flash 10 ab, wenn das einen Unterschied macht.)

Alconja
quelle

Antworten:

14

1. Es gibt keine allgemeinen Best Practices.

Wenn Sie viele (komplex geformte) Elemente, Partikel usw. in Ihrem Spiel haben, wird der Bitmap-Puffer-Ansatz viel schneller sein. Der Bitmap-Puffer lässt sich mit zunehmender Komplexität Ihrer Sprites auch besser skalieren. Der Vektor-Renderer wird bei komplexeren Formen oder Tween-Animationen (Form-Tween-Animationen) langsamer. Er bietet jedoch einige andere Vorteile:

  • Sie können Ihre Assets frei skalieren oder sogar in die Szene hineinzoomen, ohne an Qualität zu verlieren.
  • Rotationen oder andere Transformationen wie Schrägstellen sind bei Vektorgrafiken viel einfacher durchzuführen

Zusammenfassend kommt es also darauf an, welche Art von Spiel Sie erstellen.

2. Verwenden von MovieClips anstelle von Bitmap-Sprite-Sheets

Ich denke du meintest "Bitmap Sprite-Sheets" und nicht die AS3 Sprite Klasse?

Das macht eigentlich keinen Unterschied. Sie können Ihre MovieClip-basierten Animationen jederzeit in animierte Bitmaps umwandeln. Entweder manuell, indem Sie den Film in Frames exportieren und in ein Sprite-Sheet umwandeln, oder dynamisch, indem Sie zur Laufzeit ein Sprite-Sheet aus Ihrem MovieClip rendern. So würde ich das machen:

  1. Erstellen Sie eine Instanz des MovieClip und stop()es.
  2. Erstellen Sie ein new BitmapDataObjekt mit der gleichen Breite und Höhe wie der Movieclip.
  3. Verwenden Sie die draw () -Methode, um den MovieClip in die BitmapData zu rendern.
  4. Speichern Sie das BitmapData-Objekt in einem Array oder Vektor.
  5. Gehen Sie zum nächsten Bild Ihres MovieClips und wiederholen Sie die Schritte 2 bis 4, bis Sie das letzte Bild Ihres MovieClips erreicht haben. Es ist auch eine gute Idee, zwei Variablen mit der maximalen Breite und Höhe Ihrer MovieClip-Frames zu aktualisieren (da sich diese von Frame zu Frame ändern können).
  6. Jetzt können Sie alle gespeicherten BitmapData-Objekte zu einem Sprite-Sheet kombinieren (verwenden Sie BitmapData.copyPixels () ).

3. Sprite-basierte Animationen

Wie in der Antwort auf Ihre erste Frage erwähnt, gibt es darauf keine eindeutige Antwort. Wenn Sie viele Transformationen mit Ihren Objekten durchführen müssen, z. Skalieren und Drehen Mit dem nativen Flash-Renderer sind Sie wahrscheinlich besser dran. Wenn Sie vordefinierte Animationen erhalten haben, die (manuell oder dynamisch) in Sprite-Sheets gebacken werden können, und wenn Sie Hunderte von Sprites gleichzeitig anzeigen müssen, wählen Sie eine Bitmap-Rendering-Engine.

bummzack
quelle
Wenn (wenn?) Flash die Hardwarebeschleunigung für das Rendern verwendet, ist ein copyPixel-Renderer wahrscheinlich langsamer als der native Renderer.
Bart van Heukelom
6

Ich würde sagen, wenn Sie ein Raster-basiertes Spiel mit Sprites erstellen, sollten Sie eine benutzerdefinierte Rendering-Lösung mit BitmapData erstellen. Wenn Sie ein vektorbasiertes Spiel erstellen, verwenden Sie die integrierten Animationsmechanismen mit MovieClips.

Wenn Sie eine benutzerdefinierte Rendering-Lösung erstellen, trennen Sie sich von Flash, indem Sie nur ActionScript verwenden, um das zu erreichen, was Sie benötigen. Die Flixel-Engine verwendet diese Methode und ist sehr schön. Ich schreibe zwar lieber meinen eigenen Motor von Grund auf neu, aber Sie haben die Idee.

Die Verwendung der integrierten Flash-Animationsmechanismen eignet sich am besten für vektorbasierte Spiele, da Sie Ihre Bibliotheksressourcen einfach als MovieClips erstellen können, die Sie dann bei Bedarf in ActionScript instanziieren können. Sie verwenden die in den Movieclips bereitgestellte Zeitleiste, um die Animation zu verarbeiten und die Position des Sprites entsprechend zu verschieben. Das ganze BattleOn! Spiele wie Adventure Quest Worlds verwenden diese Methode. Es sieht auch gut aus.

Ich gehe davon aus, dass sich Ihre letzte Frage auf die Verwendung der Sprite-Klasse anstelle der MovieClip-Klasse für Vektoranimationen bezieht. Ein Sprite ist ein MovieClip ohne Zeitleiste, sodass Sie nicht mehr die Möglichkeit haben, die Animationen für Sie zu verwalten.

Consty
quelle
3

Obwohl allgemein angenommen wird, dass Blitting schneller ist, habe ich keine Benchmarks gesehen, die dies belegen. Einige Entwickler bevorzugen nur das Blitting, da sie Flash so eher als generische virtuelle Maschine behandeln und das Rendern selbst steuern können. Wenn Ihnen jedoch die integrierte Anzeigeliste gefällt (was ich auch tue), kann Flash Hunderte von DisplayObjects auf dem Bildschirm (z. B. MovieClips, Sprites, Bitmaps) mit hohen Bildraten problemlos verschieben, skalieren, drehen und schöne Effekte anwenden solange sie ziemlich klein sind, z. B. jeweils weniger als 200 x 200 Pixel. Sie können MovieClips ohne Vektoren verwenden. Die meisten Spiele verwenden Bitmap-Assets, unabhängig davon, welches System sie verwenden. Manchmal ist es jedoch nützlich, Bitmap-Assets auf der Timeline zu gestalten und zu animieren, insbesondere wenn Sie mit einem Flash-spezialisierten Designer und nicht mit einem Pixelkünstler arbeiten. Wenn Sie die Bühnenqualität auf NIEDRIG einstellen, erhalten Sie eine viel bessere Leistung auf Kosten hässlicherer Transformationen. Flash rendert keine Objekte außerhalb des Bildschirms, sodass Sie nicht verlangsamt werden.

Wo Flash langsam werden kann, bewegt sich und transformiert sehr große Bitmaps - zum Beispiel, wenn Sie eine sehr große Bildlaufebene oder viele Parallaxenebenen haben. Ein hybrider Ansatz, MovieClips für Ihre Spielobjekte zu verwenden, während der Hintergrund aus einem Offscreen-Puffer entfernt wird, ist möglicherweise schneller und ermöglicht Ihnen unendlich große Ebenen, während die einfache Verwendung von Standard-Sprites und MovieClips weiterhin möglich ist.

Iain
quelle
Komplexe Vektorformen können auch einen erheblichen Einfluss auf die Leistung haben. Wenn Sie animierte MovieClips mit vielen Verläufen erhalten haben und die Detailgenauigkeit Ihrer Vektorformen nicht berücksichtigen, wird diese viel langsamer als eine Bitmap gezeichnet.
Bummzack
Sie können MovieClips ohne Vektoren verwenden. Die meisten Spiele verwenden Bitmap-Assets, unabhängig davon, welches System sie verwenden. Manchmal ist es jedoch nützlich, Bitmap-Assets auf der Timeline zu gestalten und zu animieren, insbesondere wenn Sie mit einem Flash-spezialisierten Designer und nicht mit einem Pixelkünstler arbeiten.
Iain
Ja, für Flash-Spiele empfehle ich, keine Farbverläufe für irgendetwas zu verwenden, das als Vektor verwendet und durch Flash in jedem Frame gerendert wird, abgesehen von ein paar Dingen auf dem HUD und dem Player-Sprite. Farbverläufe fressen die Leistung schnell.
AttackingHobo
Einige Rendering- und Update-Benchmarks: 8bitrocket.com/2007/12/23/…
Max Dohme