• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 27-05-2009, 15:56   #1 (permalink)
twb
Neuer User
 
Registriert seit: May 2009
Beiträge: 23
Exclamation Game hakelt/läuft unvollständig ab

Liebe alle - ich bin Flash- und Actionscript-Newbie und habe mein erstes Flashgame geschrieben: Master Mind, mit zwei Levels. Der Compiler ist mit meinem Actionscript-Code zufrieden (keinerlei Fehlermeldungen, keine Ausgabe), aber das Spiel hakelt stark, insbesondere beim ersten Laden - die Menükugeln bleiben oft irgendwo hängen, anstatt sich korrekt einzupendeln. (Das Problem löst sich in der Regel, sobald man im Zweifelsfall ein-, zweimal auf "New" klickt - aber befriedigend ist das nicht.)

Ich vermute, dass es an der Anzahl Tweens liegt, die ich einsetze, bzw. daran, WIE ich sie einsetze. Meine Einpendelfunktion sieht so aus:

Code:
function einpendeln(g:Object,h:Number):void {
	var myTween0:Tween=new Tween(g,"x",Elastic.easeOut,-40,166,h,true);
}
, wobei als als g die Kugel und als h die Pendeldauer mitgegeben wird. Jede einzelne Menükugel wird also mithilfe dieser Funktion auf dem Spielbrett platziert:

Code:
einpendeln(menukugeln[0],0.5);
einpendeln(menukugeln[1],0.6);
und so weiter. Kann es sein, dass das gleichzeitige Ablaufen komplexer Tweens (je nach Level 6 oder 8 Elastic.easeOuts) den Flash-Player oder gar die Clients überfordert? Oder liege ich völlig falsch, und das Fehlverhalten meines Games hat einen ganz anderen Grund?

Herzlich, aber ratlos, twb
twb ist offline   Mit Zitat antworten
Alt 27-05-2009, 17:08   #2 (permalink)
lebt in stereo
 
Benutzerbild von figure8
 
Registriert seit: Mar 2008
Ort: karlsruhe
Beiträge: 1.093
http://blog.greensock.com/tweenliteas3/

benutz deren tween-engine und all deine probleme sind gelöst.
__________________
* Flash-JunkieMusiker & Grafiker

# Marvin Blase
# Speaker, Author, Silly Billy.
# @beautifycode
figure8 ist offline   Mit Zitat antworten
Alt 27-05-2009, 22:21   #3 (permalink)
twb
Neuer User
 
Registriert seit: May 2009
Beiträge: 23
Exclamation Mögliche Lösung

Hier bin ich am Ende doch noch fündig geworden. Erstens ist das Problem des Tween Freezing sattsam bekannt (besonders bei multiple Tweens), und zweitens gibt's da einen ganz simplen Workaround. Der da lautet: Die Tween-Variable muss ausserhalb einer Funktion deklariert werden. Bei mir funktioniert das jedenfalls einwandfrei:

Zitat:
Garbage collector in Flash cleans up resources that are not needed anymore to free memory allocated to the Flash player by the OS. This process is automatic and cannot be controlled. Every variable that is created inside a function (called local variable) are illegible to be garbage collected after the function has run. So if you do this:

function tween_this():void{ var my_tween:Tween = new Tween("omitted"); }

As soon as the function has run, the variable called my_tween is illegible to be destroyed by the garbage collector which can happen anytime. So the tween will work until the garbage collector destroy the variable and when that happens the tween stop functioning. If you do this:

var my_tween:Tween; function tween_this():void{ my_tween = new Tween("omitted"); }

You create a timeline variable outside of the function. A timeline variable cannot be destroyed by the garbage collector (unless to make it illegible) so now your tween will run as expected.
Herz- und nierlich, twb

Geändert von twb (27-05-2009 um 23:02 Uhr)
twb ist offline   Mit Zitat antworten
Alt 27-05-2009, 23:05   #4 (permalink)
lebt in stereo
 
Benutzerbild von figure8
 
Registriert seit: Mar 2008
Ort: karlsruhe
Beiträge: 1.093
richtig, dass der GC deinen tween aufsammelt ist allseits bekannt, auch das freezing und auch die mieserable performance - da es also eh keinen sinn macht, die native tweenengine zu nehmen, dachte ich mir, empfehl ich einfach GS und erwähn den workaround garnicht erst
__________________
* Flash-JunkieMusiker & Grafiker

# Marvin Blase
# Speaker, Author, Silly Billy.
# @beautifycode
figure8 ist offline   Mit Zitat antworten
Alt 28-05-2009, 09:15   #5 (permalink)
twb
Neuer User
 
Registriert seit: May 2009
Beiträge: 23
Exclamation Die Lösung

Eine Lightweight-Tweenklasse ist sicherlich eine feine Sache. Aber das hier sieht mir nach einer einwandfreien Lösung aus, die auch mit den nativen Tweens läuft. Rund 70 Tweens laufen bei mir gleichzeitig ab, und keiner wird mehr vorzeitig abgebrochen bzw. garbage collected. Die Lösung ist ein Dictionary, und so sieht sie aus:

Zitat:
PROBLEM
Tweens finish early because they get randomly garbage collected


SOLUTION
Some form of reference that prevents garbage collection BUT does allow garbage collection when appropriate.

(Note the last part you don't want your Flash to clog up memory after executing for a long period of time)

Some people state declaring each tween globally (sometimes doesn't work?) others have made each tween a property of some global object. This is my solution for handling many tweens...


MY SOLUTION
//Anti Garbage Collection for Tweens
var antiGC: Dictionary = new Dictionary(false);

//Function with two tweens
function zoomIn(){
var scale:Number = diagram_mc.scaleX *1.12;

var xT:Tween = new Tween(diagram_mc, "scaleX",Strong.easeOut, diagram_mc.scaleX, scale, 5);
xT.addEventListener(TweenEvent.MOTION_FINISH, tweenFinished);
antiGC[xT] = xT;

var yT:Tween = new Tween(diagram_mc, "scaleY",Strong.easeOut, diagram_mc.scaleY, scale, 5);
yT.addEventListener(TweenEvent.MOTION_FINISH, tweenFinished);
antiGC[yT] = yT;


}

//Allows Garbage Collection
function tweenFinished(e:TweenEvent){

antiGC[e.currentTarget] = null; //GC Object
delete antiGC[e.currentTarget]; //GC Key

}

EXPLANATION

-Global dictionary with strong references will not be garbage collected
-Local tweens ok (e.g. in functions)
-...because tweens are stored in the dictionary
-EventListener triggers a global function to remove all references once finished
-...removing references allows garbage collection to do what it does

Note if you want your own MOTION_FINISH listener just remember to call the tweenFinished function
Danke dem unbekannten Spender! Herzlich, twb
twb ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
game, mastermind, tweens

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 01:55 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele