Frame überspringt Flash

8

Gibt es eine Möglichkeit, Frame-Überspringen auf Flash nativ zu aktivieren?

Wenn Sie ein Spiel entwickeln, entwickeln Sie Animationen, die an die Geschwindigkeit des Spiels angepasst sind, und zwar mit einer Zielbildrate (normalerweise 24-40 fps für Flash). Wenn der Computer des Benutzers jedoch zu langsam ist und die Ziel-Bildrate nicht beibehalten kann, senkt Flash automatisch die fps ab, wodurch die Anwendung langsam abgespielt wird.

Wenn Sie eine zeitbasierte Logik verwenden, wird das framebasierte Rendering nicht mit der zeitbasierten Logik übereinstimmen, und die Dinge werden seltsam sein und es wird viele Ecken geben, in denen es sich zu umgehen lohnt.

Ich weiß, dass einige Spiele diese Art von Frame-Skipping-Logik verwenden, wie Popcams Zuma Blitz. Implementieren sie das Frame-Skipping selbst?

Ich kann es mir nicht leisten, dies so spät im Projekt zu implementieren, es sei denn, ich kann die MovieClip-Klasse irgendwie neu implementieren und es leicht Frame-skable machen lassen. Würde der Aufwand, die Animationen selbst zu steuern (Überschreiben der nativen Flash MovieClip-Steuerung), nicht zu viel Aufwand bedeuten?

    
felipemaia 28.10.2011, 21:29
quelle

6 Antworten

3

Okay, ich weiß, dass Sie nicht nach der folgenden "Lösung" suchen, die nicht funktioniert, da alle Frames noch abgespielt werden:

%Vor%

Die einzige Lösung besteht darin, Frames in Ihrem enterFrame-Callback einfach zu überspringen:

%Vor%

(vorausgesetzt, Sie haben die Spiellogik / -animation gemäß Best Practices in einem einzigen Callback zentralisiert), dies kann jedoch zu rassistischen Bedingungen / Komplikationen führen, wenn asynchrone Callbacks ausgeführt werden.

Es ist nicht möglich, Frames auf der Laufzeitebene zu überspringen. das ist Teil des Vertrags der AVM - keine Frames werden übersprungen, alles Code ist ran, egal was. Wenn Leistung ein Problem ist, können Sie versuchen, asynchronen Code auszuführen. Es gibt mehrere Möglichkeiten, dies zu tun:

1) Laden Sie etwas Computing auf Pixel Bender ab, damit es asynchron und / oder parallel verarbeitet werden kann (http://www.adobe.com/devnet/flex/articles/flashbuilder4_pixelbender.html)

2) Verteilen Sie die Ausführung von langwierigen Operationen über mehrere Frames hinweg (erfordert einen State-Save und State-Restore, ein Mememento-Pattern). Details (und eine tolle Lektüre) hier: Ссылка

In jedem Fall würde ich (in erster Linie) empfehlen, den Performance-Engpass mit einem Tool wie dem Flash Builder Profiler oder der Stats-Klasse (Mr. Doob) definitiv zu identifizieren.

Blitting könnte auch die Lösung sein (erstellen Sie ein Spritesheet mit einer Kachel für jeden Frame der Animation). Aber auf jeden Fall denke ich, was du tun musst, ist die Unterklasse von MovieClip und die Methoden play (), stop () und gotoAndPlay () zu überschreiben. Ihre Klasse sollte etwa so aussehen:

%Vor%

Wo der Frame-Skip-Listener Frames je nach der aktuellen Frame-Rate oder Frame-Zeit überspringt, falls erforderlich. Natürlich müssen Sie den frameSkipListener auch entfernen, wenn die Animation ein Ende erreicht hat.

Obwohl die MovieClip-Override-Lösung auf dem Papier funktioniert, wenn Sie viele Objekte haben, kann dies die Leistung beeinträchtigen, da die zusätzlichen ENTER_FRAME-Listener zusätzlichen Aufwand verursachen.

    
Sensei James 02.11.2011, 07:41
quelle
9

Der Ansatz besteht darin, sich Änderungen in Pixeln pro Sekunde anstelle von Pixeln pro Bild vorzustellen. Dann können Sie Ihre Hauptschleife auf einem EnterFrame ausführen. Rufen Sie im Enterframe getTimer () auf, um die Systemzeit in Millisekunden zu ermitteln. Vergleichen Sie das mit dem Wert, zu dem das Skript zuletzt ausgeführt wurde. Dadurch wissen Sie genau, wie viel Zeit seit dem letzten Bild vergangen ist. Verwenden Sie diesen Betrag, um zu bestimmen, wie Sie Material verschieben.

Hier ist ein Beispiel dafür, dass ein Kreis unabhängig von der Bildrate mit der gleichen Rate bewegt wird:

Paket

%Vor%

Wenn Sie feststellen, dass niedrige Frameraten die Genauigkeit von Kollisionsberechnungen beeinflussen, führen Sie diese separat mit einem Timer aus. Dies ist nur die Zeichnungsschleife, die unweigerlich an die Bildrate gebunden ist.

Und nur damit Sie es wissen, können Sie nicht im Flash-Frame überspringen. Es wird vom Spieler gehandhabt. Der beste Ansatz besteht darin, die Frame-Rendering-Technik an die variable Bildrate anzupassen.

    
Plastic Sturgeon 28.10.2011 21:44
quelle
2

Dein größtes Problem ist, dass du nicht blitest. Die Künstler können weiterhin auf der Timeline animieren und Sprite-Blätter exportieren. Ich würde einige Zeit damit verbringen, die Leistungseinschränkungen rund um die Flash-Player-Timeline-basierten Animationen zu verstehen. Hier sind ein paar Links, um Sie zu beginnen:

Wie Sie sehen können, steuern Sie die Animation mit gotoAndStop () aus der Zeitleiste; ist die schlechteste Methode für die Animation in Bezug auf die Menge der Sprites, mit denen Sie arbeiten.

Sie könnten auch in die Arbeit mit dem neuen mouthhill 2d Grafik-API, dem Starling Framework

, schauen

Um Ihre Frage direkt anzusprechen, würde ich die bereits besprochene Lösung, die zur Laufzeit ein gepuffertes Rendern auf Sprite-Blätter durchführt, zweitstellen. Abhängig von der Anzahl der Sprites, die zu einem bestimmten Zeitpunkt erforderlich sind, können Sie die Speicherkapazität für Speicherbegrenzungen durch eine niedrige Animationsleistung ersetzen.

Viel Glück.

    
stat 02.11.2011 05:14
quelle
1

Ich bin kürzlich auf etwas Ähnliches gestoßen; vielleicht hilft das folgende auf irgendeine Weise:

  • gotoAndStop (frame) führt sofort das ActionScript bei frame
  • aus
  • Sie können mehrere gotoAndStop-Aufrufe innerhalb eines einzelnen ENTER_FRAME-Ereignisses (oder eines anderen Ereignisses) ausführen.

Als Test habe ich ein neues AS3.0-Projekt in Flash Pro CS5.5 erstellt. Ich habe einen neuen MovieClip erstellt und die Timeline auf 23 Frames erweitert.

Im ersten Frame habe ich den folgenden Code hinzugefügt:

%Vor%

In Frame 5 habe ich einen Keyframe erstellt und den Code hinzugefügt:

%Vor%

In Frame 14 habe ich einen Keyframe erstellt und den Code hinzugefügt:

%Vor%

Nach dem Ausführen habe ich folgende Trace-Ausgabe erhalten:

%Vor%

Ich habe keine Ahnung, wie effizient oder zeitaufwendig das Obige ist. Ich musste es nur mit einem MovieClip verwenden (in der späten Phase der Entwicklung wurde entdeckt, dass es nützlich wäre, wenn der Hauptcharakter auch laufen könnte, aber es gab kein Budget für laufende Animationen; der Charakter enthielt ein Schritt-erzeugendes Skript in der Timeline für korrekt Timing).

In Ihrem Fall könnten Sie überprüfen, wie viel Zeit seit dem letzten ENTER_FRAME verstrichen ist, und dann die richtige Anzahl von Frames weiterleiten.

Sie könnten eine Unterklasse von MovieClip erstellen und diese als Basisklasse verwenden (um dies schnell zu tun, wählen Sie alle MovieClips aus, die dies in der Bibliothek erfordern, Rechtsklick, Eigenschaften, Basisklasse anpassen). Für die MovieClips, die bereits für ActionScript verlinkt sind, kann die .as-Datei einfach aktualisiert werden, indem sie von der neuen MovieClip-Klasse erweitert wird.

    
Josha 02.11.2011 12:05
quelle
1

Soweit ich weiß, ist in AS3 nichts eingebaut, um MovieClip-Frames in einem bestimmten Intervall zu überspringen oder durch eine Timeline-Animation schneller als normal voranzuschreiten. Spiele wie Zuma machen es wahrscheinlich entweder manuell oder fahren ihre Animationen, ohne die Zeitleiste zu benutzen.

Um es manuell zu tun, haben Sie zwei Hauptoptionen:

Timeline-Option: (aus Gründen, die unten erläutert werden, ist es vielleicht nicht wert) Wenn Sie wirklich, absolut an Timeline-Animationen gebunden sind, und Die Änderung der Bildrate verursacht ein großes Problem, und Sie haben nicht die Zeit oder die technische Freiheit, Ihre Animationen mit Code wiederherzustellen. Sie können wahrscheinlich einen Event.ENTER_FRAME-Listener verwenden, um eine Funktion von jedem aufzurufen der MovieClip-Frames, um stage.frameRate zu überprüfen und das nächste Frame oder zwei zu überspringen, wenn die frameRate gefallen ist.

Zum Beispiel:

%Vor%

Es gibt mehrere große Probleme mit dieser Vorgehensweise, aber das Schlimmste ist, dass Sie nur ganze Frames überspringen können - das Überspringen jedes zweiten Frames verdoppelt Ihre Geschwindigkeit, das Überspringen alle zwei Frames wird verdreifacht und so weiter. Das wird also nicht annähernd so reibungslos und effizient sein wie das Treiben Ihrer Animationen mit Code anstelle der Timeline. Das Ausführen von Code von jedem einzelnen Animationsrahmen kann auch die Dinge noch weiter verlangsamen.

Nur Code: Wenn Sie die Zeit finden, wäre es so viel besser, die Vorschläge anderer zu übernehmen. Nehmen Sie Ihre Animationen von der Timeline und fahren Sie sie mit Code. Behalten Sie Einstellungen oder Multiplikatoren für die Animations- und Übergangsgeschwindigkeit oder wie viele Pixelobjekte sich pro Frame bewegen.

Sie können dann Ihre bevorzugte frameRate speichern, sie mit stage.frameRate vergleichen und den Multiplikator entsprechend anpassen. Dies würde eine glattere Abstufung der Geschwindigkeiten ermöglichen.

Zum Beispiel:

%Vor%

Für vom Künstler erstellte visuelle Zustände könnten Sie möglicherweise einen nummerierten Satz von Bitmaps laden und zwischen ihnen in der Reihenfolge wechseln, in der Sie von einem Bild zum nächsten wechseln würden.

Bearbeiten: Theoretisch können Sie die Änderung wahrscheinlich auch einfach erkennen und die frameRate zurück ändern, aber wenn der Computer des Benutzers nicht mithalten kann, würde Flash sie wahrscheinlich ignorieren.

>     
Brid 03.11.2011 17:13
quelle
1

Sie können einfach einen ungefähr hundert Frames langen leeren Movieclip an der Wurzel Ihrer Bühne erzeugen, einen etwa zehn Sekunden langen, vollständig stummgeschalteten Soundclip einfügen und den Sound auf Streaming und Loop einstellen.

>

Dadurch erhalten Sie eine problemlose variable Framerate in Flash, wo jede Timeline und jede code-basierte Animation überall in Ihrer Datei immer genau zur beabsichtigten Zeit läuft, wobei Frames bei Bedarf übersprungen werden, aber trotzdem der gesamte Code ausgeführt wird Zeitachse sogar von visuell übersprungenen Rahmen. Es ist eine wirklich einfache und stressfreie Lösung, ich bin überrascht, dass mehr Leute nicht davon zu wissen scheinen.

    
Marconelly 08.05.2012 16:34
quelle

Tags und Links