2009-06-12 10 views
9

Ich arbeite an einem 2D-Shooter-Spiel mit vielen beweglichen Objekten auf dem Bildschirm (Kugeln usw.).Vsync in Flex/Flash/AS3?

Ich benutze BitmapData.copyPixels (...), um den gesamten Bildschirm in einen Puffer zu rendern: BitmapData. Dann "copyPixels" von "buffer" auf den Bildschirm: BitmapData. Die Framerate ist 60.

private var bitmap:Bitmap = new Bitmap(); 
private var buffer:Bitmap = new Bitmap(); 

private function start():void { 
    addChild(bitmap); 
} 

private function onEnterFrame():void { 
    // render into "buffer" 
    // copy "buffer" -> "bitmap" 
} 

Das Problem ist, dass die Sprites zerreißt: ein Teil eines Sprites wurde horizontal verschoben.

Es sieht aus wie ein PC-Spiel mit VSYNC ausgeschaltet.

Hat jemand dieses Problem gelöst?

UPDATE: die Frage nicht über die Leistung, sondern um loszuwerden Bildschirm reißen. [!]

UPDATE: Ich habe another question erstellt und hier können Sie beide Implementierungen versuchen: mit Flash Art und Weise oder BitmapData- + copypixels()

+0

Das Aufreißen des Bildschirms hängt von der Leistung ab. Nur so kannst du dein Reißen beheben. – Kekoa

+3

@Kekoa Ich kann dem nicht zustimmen. Leistung hat nichts mit Bildschirmreißen zu tun, weil ich Doppelpuffer verwende. Bei schlechter Leistung würde ich einen niedrigeren FPS, aber keinen Bildschirmriss bekommen. – oshyshko

+0

die anderen sind richtig, dass dieser Ansatz ist nicht sehr geeignet für Flash-Player ... immer noch, ich bin erstaunt, es funktioniert überhaupt nicht ... ein paar Fragen: - Haben Sie versucht, die BitmapData sperren Sie sind einzeichnen? (Wenn nicht, kann das viel helfen!) - Verwenden Sie transparente Bitmaps? (general performance killer) - Versuch du 'Stage :: invalidate' und Rendering auf' Event.RENDER' statt Rendering? greetz back2dos – back2dos

Antwort

7

Ich fühle deinen Schmerz, wie ich gerade in den Schützengräben bin, die mein eigenes Spiel entwickeln. Bei den Standardeinstellungen erzeugt der Flash-Renderer schreckliche Probleme mit der Bildschirmtrennung/V-Synchronisierung, unabhängig davon, welchen Code Sie erstellen.

Deshalb war ich erfreut, die einfachste, elegante Antwort gefunden zu haben, die Code nicht re-factoring (was nicht ein einzelnes Bit hilft, das Problem ist der Flash-Player, nicht Code).

Aktivieren Sie einfach die Hardwarebeschleunigung in Ihren Veröffentlichungseinstellungen. Es gibt zwei verschiedene Optionen:

Ebene 1: Direkt; und Level 2: GPU.

Lesen Sie mehr darüber in der offiziellen Dokumentation: Specify publish settings for SWF files, und entscheiden, welche Option für Ihr Spiel am besten ist.

Zielmarkt spielt hier eine Rolle, wenn es sich um ein ernstes Spiel für Spieler handelt, müssen Sie sich keine Gedanken über mögliche Leistungsprobleme machen, da die meisten Spieler GPUs haben.

This article habe mir nicht die Lösung speziell, aber führen Sie mich in die richtige Richtung. ABER, wenn sich Ihr Spiel in einem Browserfenster befindet, müssen Sie möglicherweise die gleiche Technik verwenden, um wmode auch auf direct oder gpu zu setzen.

+0

Wissen Sie, ob ein Metadaten-Tag-Attribut dafür angegeben werden kann? (Für FlashDevelop AS-Only-Spiele, ohne FLAs). Etwas in die Richtung: [SWF (hardwareAcc = "gpu")] gibt es das? – bigp

+0

Der einzige andere Parameter, den ich kenne, ist wmode, der in der HTML-Datei festgelegt werden kann, die Ihre Flash-Datei einbettet. Ich bin mir sicher, dass es etwas geben muss, was dies ohne die Flash IDE erreichen kann. –

+0

Was ist der Schluss? Das ist wirklich das Problem eines Flash-Players und wir können nichts tun, um es zu verbessern. –

-4

Das erste, was Sie tun wollen könnte, ist, stoppen Sie den Flash Player Behandlung wie es ist DOS. Der Flash Player ist eine hoch optimierte 2D-Spiel-Engine, und ich verstehe nicht wirklich, warum Sie das Rad neu erfinden wollen, indem Sie viele Bitmap-Slices kopieren. Natürlich werden Sie Leistungsprobleme haben.

Der Flash Player lässt Sie nicht mit einer vertikalen oder horizontalen Leerstelle synchronisieren, da der Flash Player dafür einfach kein Konzept hat.

Ich persönlich denke, dass Sie überdenken sollten, wenn Sie "glatter" Animation wollen. Der Flash Player ist dazu in der Lage, Sie versuchen nur den falschen Ansatz.

+2

Seltsame Sache ist, kopieren Chucks von Bytes (Bitmaps) im Speicher sollte einfacher für Computer, anstatt es mit Mathematik rendern Berechnungen. Es sollte einen Grund geben, warum "cacheAsBitmap" in Flash existiert. Überprüfen Sie auch dies: http://aralbalkan.com/759 – oshyshko

+0

Ihre Sprites (DisplayObjects) müssen nicht Vektor sein. Der Flash Player ist dafür optimiert. Wenn Sie in ActionScript mit Bitmaps neu erstellen, was der Flash Player bereits sehr gut macht und wofür er optimiert ist, fehlt Ihnen nur der Punkt. Ich denke, Sie sollten mehr von Tinic Uro Blog lesen: http://www.kaourantin.net – Luke

+2

@Luke: Ihre Antwort wäre nützlicher, wenn es eine praktische Alternative vorschlagen würde, anstatt nur zu sagen, dass der ursprüngliche Ansatz falsch ist. Es gibt mehrere Online-Quellen, die die Verwendung von Bitmaps und copyToPixels im Zusammenhang mit der Erstellung von 2D-Spielen vorschlagen, so dass es nicht das ursprüngliche Poster ist, das die Neuerfindung macht. – Kylotan

-5

Speichern Sie keine Dinge in BitmapData, die Ihre App töten würden. Bitmap-Daten sind nicht sehr performant.

Machen Sie alle Ihre Spielelemente in Flash, als Sprites (oder MovieClips, wenn Sie müssen), und dann arbeiten, wie Flash als Vektor-Animation-Plattform arbeiten sollte. Es wurde nie für 2D-Bitmap-Grafiken optimiert. 2D-Vektorgrafiken funktionieren gut, und selbst wenn Sie Bitmaps importieren, werden sie sich besser bewegen, dann werden sie zu einem BitmapData-Objekt gerendert.

+0

Wenn ich mit der Pufferung aufgeben und Bitmaps als native Flash-Sprites (noch Bitmaps) hinzufügen, wird es dann das VSYNC Problem lösen? – oshyshko

+0

Nein, wird es nicht. Aber es wird viel besser aussehen als das, was Sie derzeit haben. Wie ich in meiner Antwort auf Ihre Frage gesagt habe, hat der Flash Player kein Konzept von vsync. Wenn Sie die fps auf 60 setzen (was absurd ist, aber das ist nebensächlich), dann versucht der Flash Player 60 fps zu erzeugen. In der Realität wird es das fast nie schaffen. – Luke

+1

Ich habe festgestellt, es gibt definitiv mal, dass Sie Bitmapdata für die Leistungsverbesserung verwenden sollten. –

Verwandte Themen