2012-08-12 3 views
6

Als Erstes sage ich, dass der Kontext hier Actionscript 3.0 (IDE: Flashbuilder) zusammen mit dem Starling Framework ist.AS3-Kachelkarten-Rendering (mit 1000er Kacheln)

Also, ich möchte eine Tile Map erstellen, die für einen Platformer oder etwas ähnliches verwendet werden könnte.

Ich möchte 8x8 Pixel Kacheln auf einer 800x600 Pixel Bühne verwenden, und das Problem, das ich habe, ist, dass ich nicht weiß, wie diese 7500+ Kachelobjekte zur Bühne hinzugefügt werden, ohne dramatisch die Framerate zu reduzieren.

Ich habe festgestellt, dass die Leistungseinbuße durch das Hinzufügen jeder Kachel zur Bühne und nicht durch die Initialisierung jedes Tile-Objekts entsteht.

Ich weiß, ich gebe nicht viele spezifische Informationen, aber was ich verlange, ist, wenn es eine standardisierte Möglichkeit gibt, Tausende von statischen Objekten auf die Bühne ohne Leistungsverlust zu zeichnen. Ich habe das Gefühl, dass es einen Weg gibt, den ich erst noch finden muss.

Update:

Nachdem alle Ihre freundliche Hilfe, ich habe festgestellt, was eine große Lösung zu sein scheint. Zuerst wollte ich die Lösung von Amy implementieren, indem ich mit copyPixels() und draw() ein großes Bitmap für die gesamte Map erstellte und es dann auf den Bildschirm rended. Dann wollte ich aber wissen, ob es eine Starling-Entsprechung dazu gab, denn alles wäre so viel einfacher, wenn ich Starling nicht mit Native Flash mischen müsste.

Dank Amy wieder, sah ich Starling in der RenderTexture-Klasse ein bisschen mehr, und fand, dass mit seinen "DrawBundled()" und "Draw()" Methoden, ich einfach alle Kacheln in eine RenderTexture zeichnen konnte Dann setze das RenderTexture in ein Bild (Starling's Image Class) und füge das Bild dann einfach dem Bildschirm hinzu.

Diese Lösung ist eine Million mal schneller als die albernen langsamen Lösungen, die ich zuvor versucht habe, mit plattenden Sprites und so. Es ist schneller sowohl in seiner Initialisierungszeit und es scheint keinen Rückgang der Framerate zu geben, während das RenderTexture Bild auf dem Bildschirm ist.

Die eine Sache, die ich damit testen möchte, ist, wenn es einfach ist, die Grafiken einer Kachel während des Spiels zu aktualisieren. Sprich, wenn sich Wasser von einer Quelle (oder etwas) ausbreitet und eine "Gras" -Kachel zu einer "Wasser" -Kachel werden würde, wäre die RenderTexture und ihr Bild in der Lage, ihr Aussehen ohne irgendeine Art von Lag-Spikes oder Performance-Schluckauf zu verändern. Ich werde das bald testen.

Vielen Dank für Ihre Hilfe!

Antwort

9

Fügen Sie nicht, dass viele Objekte auf der Bühne. Erstellen Sie stattdessen einen BitmapData der Größe Ihrer Bühne, und verwenden Sie copyPixels() oder draw(), um darauf zu zeichnen. Here's an article das sollte Sie beginnen. Sie können dann die Konzepte, die Sie in diesem Beitrag gelernt haben, und lernen Sie alles, was Sie tun müssen, die nicht abgedeckt ist (Flashandmath.com hat eine Menge guter Tutorials über Pixel Manipulation)

+0

Danke, ein Startpunkt wie dieser, der mich in die richtige Richtung treibt, ist genau das, was ich brauchte! – Brucef

+0

Gern geschehen :) –

+0

Jetzt muss ich nur herausfinden, wie die Verwendung von nativen Flash-Display-Objekte mit dem Starling Framework funktioniert ... – Brucef

3

Sie müssen die Kacheln verwalten, die hinzugefügt und entfernt werden müssen, während Sie sich im Spiel bewegen. Fügen Sie nur Bühnenbilder hinzu, die in der Mitte des Bildschirms mit 800 px angezeigt werden. Sobald die Kachel mehr als 800 Pixel von der Mitte entfernt ist, entfernen Sie sie. Das sollte alles reibungslos laufen lassen. Viel Glück.

oder schauen Sie in die Zeichnung/Coping Ihrer Kacheln in eine Bitmap. Sie würden Ihre Kacheln im Grunde auf die neue Bitmap stempeln. Hier ist ein Beispiel von Adobe:

import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.geom.Rectangle; 
import flash.geom.Point; 

var bmd1:BitmapData = new BitmapData(40, 40, false, 0x000000FF); 
var bmd2:BitmapData = new BitmapData(80, 40, false, 0x0000CC44); 

var rect:Rectangle = new Rectangle(0, 0, 20, 20); 
var pt:Point = new Point(10, 10); 
bmd2.copyPixels(bmd1, rect, pt); 

var bm1:Bitmap = new Bitmap(bmd1); 
this.addChild(bm1); 
var bm2:Bitmap = new Bitmap(bmd2); 
this.addChild(bm2); 
bm2.x = 50; 

More Info on the bitmapData class. I think copyPixels is what you are after.

+0

Das würde in einer anderen Situation funktionieren, aber hier ist das Problem nicht, dass ich Fliesen hinzufügen/entfernen muss, wie die Kamera bewegt, aber dass die Fliesen so klein sind, dass ich Ich weiß nicht, wie ich die Nummer zum Ausfüllen des Bildschirms (7500) erstellen kann, ohne die Leistung immens zu drosseln. – Brucef

+0

Wie viele verschiedene einzigartige Fliesen gibt es? Könnten Sie die BitmapData der Kachel nicht abtasten und alle in eine Bitmap kopieren. Auf diese Weise erstellen Sie nur ein Bild, aber mehrere Kachelquellen. – Boyd

+0

Es gibt sehr wenige eindeutige Kacheln (weniger als 16), und das hört sich so an, als könnte es funktionieren, aber ich verstehe nicht wirklich, wie man so etwas implementiert – Brucef

Verwandte Themen