Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 08-09-2009, 17:53   #1 (permalink)
asking to fast
 
Benutzerbild von falsanu
 
Registriert seit: Jul 2002
Beiträge: 59
Performance Problem beim Bewegen eines 653 Objekte beinhaltenden Sprites

Hallo Forum,

ich hab ein ziemlich schwerwiegendes Problem, das ich im Folgenden mal kurz schildern möchte.

Ausgangsituation:
Mit hilfe eines kleinen ImageBots durchsuche ich ein Bild jeweils von oben nach unten gehenden auf deren Farbwerte und lege, falls die Werte passen ein Sprite auf die Stage. Wenn der Vorgang abgeschlossen ist sind das 653 Sprites die alle gleich aussehen (Rechtecke).
Dann skaliere ich dieses Objekt mit den 653 Inhalten (Mutter) so das es auf die Stage passt.

OnClick auf die Stage skaliert sich Mutter auf scaleX = scaleY = 1 mittels der Tweener Klasse so dass alle Rechtecke in Originalgröße sichtbar sind.

Nun möchte ich das sich Mutter je nachdem wo die Maus sich befindet verschiebt, und dabei entsteht das Problem. Die Prozessorlast schießt in die Höhe (~60% und das Bild fängt an zu ruckeln).

Folgenden Code benutze ich um die Bewegung zu steuern, hat jemand eine Idee wie ich da die größt mögliche Performance rausholen kann, denn wie es ausschaut muss ich Mutter noch duplizieren, weil die Duplikate noch als Maske herhalten müssen.

PHP-Code:
        public function enterFrameListener(e:Event){
            var 
angle:Number Math.atan2( (this.dad.stage.stageHeight/2) - this.dad.mouseY, (this.dad.stage.stageWidth/2) -  this.dad.mouseX );
            
moveWithMouse(angle);
        }
        
        private function 
moveWithMouse(angleBetween):void
        
{
            var 
baseSpeed 10;

            var 
xSpeed Math.cos(angleBetween) * baseSpeed;
            var 
ySpeed Math.sin(angleBetween) * baseSpeed;

            var 
nextLeft    this.xSpeed;
            var 
nextTop        this.ySpeed;
            
            var 
limitLeftStart     0;
            var 
limitTopStart    0;
            var 
limitLeftEnd    this.width this.dad.stage.stageWidth;
            var 
limitTopEnd        this.height +  this.dad.stage.stageHeight;
            
            if(
nextLeft<limitLeftStart && nextLeft>limitLeftEnd ){
                
+= xSpeed;

            }
            if(
nextTop limitTopEnd && nextTop limitTopStart){
                
+= ySpeed;
            }

        } 

Ich würde mich freuen, wenn Ihr eine Idee habt, da ich mit meinem Latein am Ende bin.

Vielen Dank und Viele Grüße
Jan
__________________
--
.jan fanslau.
.print.webdesign.coding

www.jan-fanslau.de | office@jan-fanslau.de
falsanu ist offline   Mit Zitat antworten
Alt 08-09-2009, 19:56   #2 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Was genau hat es mit diesen Rechtecken auf sich?
Sind die einfarbig gefüllt und müssen sie sich später
nicht mehr unabhängig bewegen? Dann würde ich
sie nämlich einfach in ein BitmapData-Objekt »malen«
und dann nur das bewegen.

gruß, gaspode
gaspode ist offline   Mit Zitat antworten
Alt 09-09-2009, 00:11   #3 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 1.197
Vielleicht bringt auch schon cacheAsBitmap = true; etwas?
__________________
EDV = Ende Der Vernunft
hmpf ist offline   Mit Zitat antworten
Alt 09-09-2009, 08:46   #4 (permalink)
asking to fast
 
Benutzerbild von falsanu
 
Registriert seit: Jul 2002
Beiträge: 59
@ hmpf: cacheAsBitmap hat schon einiges gebracht (ich cache jedes Rechteck einzeln als Bitmap, das brachte mehr performance als wenn ich "Mutter" als Bitmap cache)

@gaspode:
die Rechtecke ist halt nicht wirklich ein Rechteck, sondern ein aus der Bibliothek geladener MC. Im weiteren Verlauf muss ich die einzelnen Rechtecke per Mouse.MOUSE_OVER - Eventlistener aufrufen, funktioniert das mit deiner Methode dann noch?
__________________
--
.jan fanslau.
.print.webdesign.coding

www.jan-fanslau.de | office@jan-fanslau.de
falsanu ist offline   Mit Zitat antworten
Alt 09-09-2009, 10:58   #5 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Zitat:
Zitat von falsanu Beitrag anzeigen
funktioniert das mit deiner Methode dann noch?
Ich denke nicht. Dann bräuchtest Du immer
noch Clips, um die ClickEvents zu erkennen.

gruß, gaspode
gaspode ist offline   Mit Zitat antworten
Alt 13-09-2009, 18:00   #6 (permalink)
asking to fast
 
Benutzerbild von falsanu
 
Registriert seit: Jul 2002
Beiträge: 59
die zweite Stufe

Hello again...

so mit cacheAsBitmap habe ich nun schon eine ganze Menge rausgeholt, jetzt kommt allerdings die Zweite Stufe und damit das zweite Problem.

Das nächste Problem ist, dass über die vielen Objekte auf der Stage ein einzelner Verlauf von ff0000 zu ffffff liegen soll. Die einzelnen Objekte sind erst schwarz und bei Änderung ihres Zustandes werden sie in den Verlauf integriert.
Ich dachte ich könnte das so machen (um Performance zu sparen) dass ich einen Verlauf erstelle über die gesamte größe, und den Teil den ich für das einzelne Objekt brauche heraus schneide. Allerdings sagt mir Flash immer "ungültige Bitmap-Data"

Habt Ihr eine Idee was an dem folgenden Code falsch sein soll?
PHP-Code:
        public function createGradient(xPosyPoswb):Sprite{
            var 
gradient = new Shape();
            
//trace(xPos + " --- " + yPos);
            //var rect:Rectangle = new Rectangle();

            
var _bgColors:Array = new Array (0xFF00000xFFFFFF);
            var 
fillType:String GradientType.LINEAR;
            var 
colors:Array = _bgColors;
            var 
alphas:Array = [11];
            var 
ratios:Array = [0255];
            var 
myMatrix:Matrix = new Matrix();
            
            
myMatrix.createGradientBox(this.imageBot.getGridWidth(), this.imageBot.getGridHeight(), 000);
            
            
gradient.graphics.beginGradientFill(fillTypecolorsalphasratiosmyMatrix);
            
            
gradient.graphics.drawRect(00,this.imageBot.getGridWidth(), this.imageBot.getGridHeight());
            
gradient.graphics.endFill();
            

            
gradient.cacheAsBitmap true;
            
import flash.display.Bitmap;
            
import flash.display.BitmapData;
            

            var 
myBitmapData:BitmapData = new BitmapData(this.imageBot.getGridWidth(), this.imageBot.getGridHeight());
            
myBitmapData.draw(gradientnullnullnull, new Rectangle(xPos this.cfg.getFieldWidth(),yPos*this.cfg.getFieldHeight(),this.cfg.getFieldWidth(),yPos*this.cfg.getFieldHeight()),false);
            var 
bmp:Bitmap = new Bitmap(myBitmapData);
            
gradient.graphics.clear();
            var 
= new Sprite();
            
s.addChild(bmp);

            return 
s

        } 
Das Bitmap ist 2280 * 2294px
fieldWidth = 60
fieldHeight = 37

Habt Ihr eine Idee???
__________________
--
.jan fanslau.
.print.webdesign.coding

www.jan-fanslau.de | office@jan-fanslau.de
falsanu ist offline   Mit Zitat antworten
Alt 13-09-2009, 20:59   #7 (permalink)
Neuer User
 
Benutzerbild von padavan
 
Registriert seit: Apr 2002
Beiträge: 496
evt. liegt dein BMD-rectangle außerhalb der gradient-shape? was übergibst du als xPos/yPos?
__________________
Grafik - Webdesign - Programmierung - www.thsc.at
Adventkalender 2011 advent.wien.info/de
Jobspace - Universum der Lehrstellen www.jobspace.at
padavan ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
actionscript 3, mousex, performance

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 16:29 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele