Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 16-02-2004, 20:25   #1 (permalink)
Neuer User
 
Registriert seit: Oct 2003
Beiträge: 10
Zeichnen aus Array , Geschwindigkeit

Hallo,

ich habe ein kleines Problem und weiss nicht wie ich es lösen soll, vielleicht kann mir jemand helfen.
Ich lasse Daten (aufgezeichnete Mauspositionen) aus einem Array lesen und diese dann zeichnen.
Klappt soweit alles wunderbar, nur hätte ich jetzt gerne, dass das Zeichnen schneller passiert.
Ich möchte sozusagen den Prozess beschleunigen. Soweit ich weiss kann einem setInterval da weiterhelfen,
jedoch weiss ich nicht, wie ich dies in mein kleines Script einfügen kann, sodass es klappt.




Ich freue mich über jede Anregung und jeden Zuspruch.

Danke!
ActionScript:
  1. abSpielen.onRelease = function() {
  2.     i = 0;
  3.     _root.abSpielen.enabled = false;
  4.     _root.abSpielen._alpha = 0;
  5.     leerfilm.onEnterFrame = function() {       
  6.         if (i < bildListe.length) {
  7.             this._x = bildListe[i][0];
  8.             this._y = bildListe[i][1];
  9.             this._farbe = bildListe[i][2];
  10.             this._staerke = bildListe[i][3];
  11.             if ((i == 0) || (this._x == 123456789)) {
  12.                 moveTo(this._x, this._y);
  13.             }
  14.             lineStyle(this._staerke, this._farbe, 100);
  15.             lineTo(bildListe[i][0], bildListe[i][1]);
  16.         } else {
  17.             delete this.onEnterFrame;
  18.         }
  19.         i++;
  20.     };
  21. };
betaheidi ist offline   Mit Zitat antworten
Alt 16-02-2004, 21:06   #2 (permalink)
~~~~~~~~~~~~
 
Benutzerbild von _geo_
 
Registriert seit: May 2002
Ort: AUSTRIA (OÖ)
Beiträge: 3.298
1. willkommen im Forum :-)

versuchs mal mit:
ActionScript:
  1. abSpielen.onRelease = function() {
  2.         i = 0;
  3.         _root.abSpielen.enabled = false;
  4.         _root.abSpielen._alpha = 0;
  5.         function zeichnen() {
  6.             with(leerfilm){
  7.                 if (i < bildListe.length) {
  8.                         this._x = bildListe[i][0];
  9.                         this._y = bildListe[i][1];
  10.                         this._farbe = bildListe[i][2];
  11.                         this._staerke = bildListe[i][3];
  12.                         if ((i == 0) || (this._x == 123456789)) {
  13.                                 moveTo(this._x, this._y);
  14.                         lineStyle(this._staerke, this._farbe, 100);
  15.                         lineTo(bildListe[i][0], bildListe[i][1]);
  16.                 } else {
  17.                         clearInterval(interval);
  18.                 }
  19.                 i++;
  20.             }
  21.         };
  22.         interval = setInterval(zeichnen,50);
  23. };
__________________
--- :P ---

Blog
Bei unerwünschten Nebenwirkungen zerreißen Sie die Packungsbeilage oder erschlagen ihren Arzt oder Apotheker
_geo_ ist offline   Mit Zitat antworten
Alt 16-02-2004, 21:49   #3 (permalink)
Neuer User
 
Registriert seit: Oct 2003
Beiträge: 10
Hallo _geo_

Vielen Dank für die schnelle Antwort!
Leider funktioniert es nicht. Mit dem von Dir
modifizierten Script zeichnet die Funktion bei mir
gar nicht mehr. Die Bezeichnung onEnterFrame
ist wichtig für das Starten, bzw. den Zeitpunkt des
Startens des Zeichenvorgangs.

Ich grübele weiter...
betaheidi ist offline   Mit Zitat antworten
Alt 16-02-2004, 22:22   #4 (permalink)
Neuer User
 
Registriert seit: Nov 2001
Ort: Köln
Beiträge: 106
... wusste noch gar nich, dass es ein setInterval() auch für Flash gibt! Hab grad mit rumprobiert und das ist ja ein komisches Ding.
Hab das auf einen random-Linienzeichner angewandt und mit verschiedenen FrameRate ausprobiert. Lustig: der zeichnet dann soviel Linien, wie er bis zum nöchsten Framewechsel schafft und trägt die dann als Gruppe auf die Bühne auf. Versehe ich die Funktion mit nem updateAfterEvent() sollte Flash ja eigentlich
nach jedem Linienzeichnen die Bühne refreshen. macht er auch - aber ziemlich langsam.

Hab ich ne FrameRate von 120, müsste ja (bei Unterlastung) alle 8.3 Millisecs ein Bild gezeichnet werden.
Was weiss ich, wie schnell der das bei nem onEnterFrame wirklich macht: jedenfalls sieht's schnell aus und wird sich wohl in der Region bewegen.
Wenn ich das stattdessen mit setInterval und updateAfterEvent() mache, sollte ich ja iegentlich die 120-Frame-Barriere sprengen können... wenn ich das Intervall auf z.B. 1 Millisec setze. Ist aber nciht der Fall: läuft extrem viel langsamer!
Denke also: in Sachen Geschwindigkeit bringt das wohl eher Nach- als Vorteile.

@betaheidi: Musst in die Funktion wahrscheinlich noch ein updateStageafterEvent() mit aufnehmen, damit zeichnet. Ansonsten kann man in Deinem Script noch ein paar Dinge beschleunigen:

- "bildListe.length" ist konstant; das musst Du nicht in jedem Frame abfragen und kannst Deine if-Abfrage dadurch beschleunigen. Wahrscheinlich ist "Array.length" auch langsamer, als wenn Du einfach "if (bildliste[i]!=undefined)" abfragst.

- verschachtelte Arrays kosten Zeit. Schneller ist es, alle Eigenschaften der Punkte in EIN Array zu schreiben, so dass jeder Punkt vier Array-Plätze belegt. bildliste[0] = _x des ersten Punkts, bildliste[1] = _y der ersten Punkts, bildliste[2] = farbe des ersten Punkts, bildliste[3] = staerke des ersten Punkts, bildliste [4] = _x des zweiten Punkts... etc.

- den Umweg über die Variablen "this._farbe" und "this._staerke" kannst Du Dir (und dem Script) ersparen; der kostet nur Zeit. Die Adressierung mit "this" im Übrigen nochmal mehr als eine lokale Variable mit "var _staerke = [irgendwas]". Also einfach direkt im lineTo() auf das Array zugreifen.

- eine if-Abfrage mit "||" ist (angeblich) langsam. Daher lieber zwei if-Abfragen schreiben (einen mit Kondition1, einen mit Kondition2) und jeweils den Funktionsblock eintragen - auch wenn er dann doppelt vorhanden ist.
__________________
http://www.rumbke.de
leif ist offline   Mit Zitat antworten
Alt 16-02-2004, 22:30   #5 (permalink)
Neuer User
 
Registriert seit: Nov 2001
Ort: Köln
Beiträge: 106
... ähem... Moment mal. Ist das wirklich beabsichtigt, dass Du Deinen Clip "leerfilm" mit jedem Frame an neue Koordinaten schiebst? Das kostet natürlich Performance satt...?
__________________
http://www.rumbke.de
leif ist offline   Mit Zitat antworten
Alt 17-02-2004, 09:49   #6 (permalink)
Neuer User
 
Registriert seit: Oct 2003
Beiträge: 10
Vielen Dank Leif für die ausführliche Hilfe!
Ich werde mal schauen, dass ich mein Skript mit
Hilfe Deiner Ausführungen ein bischen "schlanker"
mache. Vielleicht bringt es ja Geschwindigket.

Was das Zeichnen angeht...ja, ich bewege den Clip
an die Koordinaten die aus dem Array gelesen
werden. Er beinhaltet die Darstellung eines Stiftes.
Aber vielleicht lasse ich das mal weg, wenn es
stark ausbremst.

Kann ich also in mein Skript irgendwie den setInterval
Befehl einbauen, oder muss ich es komplett umbauen?

Danke im Voraus!
betaheidi ist offline   Mit Zitat antworten
Alt 17-02-2004, 12:41   #7 (permalink)
Neuer User
 
Registriert seit: Nov 2001
Ort: Köln
Beiträge: 106
Also nach meinen knappen Untersuchungen scheint das setInterval() keine performancegünstige Lösung zu sein... und überdies merkwürdig zu reagieren: Ich würde also drauf verzichten. Lasse mich aber gern eines Besseren belehren... :-)
__________________
http://www.rumbke.de
leif ist offline   Mit Zitat antworten
Alt 17-02-2004, 13:42   #8 (permalink)
Neuer User
 
Registriert seit: Oct 2003
Beiträge: 10
Ich habe mein Script etwas umgebaut und den setInterval Befehl untergebracht und siehe da, es funktioniert schneller. Danke hier schonmal an geo und leif!!!

ActionScript:
  1. abSpielen.onRelease = function() {
  2. var nachzeichenInterval = 1;
  3. _root.zeichencontainer.clear();
  4. _root.clear();
  5. _root.i = 0;
  6. setInterval(nachzeichnen, nachzeichenInterval);
  7. };
  8. function nachzeichnen() {
  9.     if (_root.i<_root.bildliste.length) {
  10.         if ((i == 0) || (bildListe[i][0] == 123456789)) {
  11.             _root.zeichencontainer.moveTo(bildListe[i][0], bildListe[i][1]);
  12.         }
  13.         _root.zeichencontainer.lineStyle(bildListe[i][3], bildListe[i][2]);
  14.         _root.zeichencontainer.lineTo(bildListe[i][0], bildListe[i][1]);
  15.         _root.i++;
  16.     }
  17. }

Jetzt noch eine Frage: Kann ich die aufgezeichneten MausKoordinaten, die ich in dem Array habe, auch auf einen Schlag grafisch darstellen, ohne es nachzeichnen zu lassen?

Nach ein bischen Recherche hier im Forum scheint mir dies nur zu funktionieren, indem ich aus den Array Daten mit Hilfe von PHP ein Pixelbild erstellen lasse. Liege ich da richtig, oder gibt es andere, flashinterne Möglichkeiten?

Danke!
betaheidi ist offline   Mit Zitat antworten
Alt 17-02-2004, 16:41   #9 (permalink)
Neuer User
 
Registriert seit: Nov 2001
Ort: Köln
Beiträge: 106
Wie willst Du die denn darstellen? Auf Pixel kannst Du mit Flash ja leider nicht direkt zugreifen. Kannst das aber simulieren, indem Du *ultrakurze* Linien zeichnest.
Auf einen Schlag machst Du das, indem Du alle Zeichenschritte innerhalb eines Framewechsels erledigst. ... Frage richtig verstanden?
__________________
http://www.rumbke.de
leif ist offline   Mit Zitat antworten
Alt 17-02-2004, 17:29   #10 (permalink)
Neuer User
 
Registriert seit: Oct 2003
Beiträge: 10
Leider weiss ich ja nicht was in dem Array steht, da dies ja durch das bewegen der Maus erst mit Koordinaten gefüllt wird. D.h. es muss Schritt für Schritt ausgelesen werden.

Anders wäre das, wenn PHP aus den ArrayDaten ein Pixelbild erzeugt und dieses speichert. Das könnte ich dann direkt in Flash per loadMovie reinladen.

Habe ich mir mal so gedacht.
betaheidi ist offline   Mit Zitat antworten
Alt 17-02-2004, 23:35   #11 (permalink)
Neuer User
 
Registriert seit: Nov 2001
Ort: Köln
Beiträge: 106
Musst das Array natürlich Schritt für Schritt auslesen, egal wie Du es auswertest. Wenn Du es aber "auf einen Schlag" und nicht Stück für Stück zeichnen willst, kannst Du das doch problemlos machen.
Intern kannst Du zeichnen, was Du willst - auf die Bühne kommt es erst bei einem Framewechsel / StageRefresh.
Wenn Du also möchtest, dass das Array komplett gezeichnet auf einmal auf der Bühne auftaucht, musst Du lediglich alle Zeichenschritte innerhalb einer Schleife ohne Framewechsel erledigen. Also eine for- oder while-Schleife.
Ist darüberhinaus auch einfacher als setInterval() oder onEnterFrame.
Bin mir aber immer noch nicht sicher, ob wir hier von der gleichen Sache reden...? °_o
__________________
http://www.rumbke.de
leif ist offline   Mit Zitat antworten
Alt 18-02-2004, 14:45   #12 (permalink)
Neuer User
 
Registriert seit: Oct 2003
Beiträge: 10
Das klingt interessant. Nur wie kann ich das skriptmäßig umsetzen, mit einer for oder while Schleife. Und wie zeichne ich intern, ohne dass es auf der Bühne sichtbar ist? Wenn Du mir da noch ein bischen auf die Sprünge helfen könntest, wäre ich Dir noch dankbarer, als ich es ohnehin schon für die ausführliche Hilfestellung bin!!
betaheidi ist offline   Mit Zitat antworten
Alt 18-02-2004, 16:34   #13 (permalink)
Neuer User
 
Registriert seit: Nov 2001
Ort: Köln
Beiträge: 106
Ich hab hier mal verschiedene Varianten gebastelt. Musst Du noch minimal an Dein Movie anpassen - Du musst keinen "leerfilm" und keine Arrayfüllung mehr erzeugen, weil Du die ja schon hast. Dafür läuft dieses Script zum Ausprobieren jetzt erstmal so, wie es ist.
(Habe dann übrigens doch inkrementierende Schleifen verwendet, weil die Laufrichtung der Schliefe ja die Zeichenreihenfolge beeinflusst).

ActionScript:
  1. /*** PREFS ***/
  2.  
  3. screenWidth = 600;
  4. screenHeight = 600;
  5.  
  6.  
  7. /*** FUNCTIONS ***/
  8.  
  9. randomHex = function () {
  10.     // erzeugt eine Zufalls-HexZahl und gibt sie als String zurück; nötig für Zufallsfarbe
  11.     if (random(2)) {
  12.         return (String.fromCharCode(random(10)+48));
  13.     } else {
  14.         return (String.fromCharCode(random(6)+65));
  15.     }
  16. }
  17.  
  18. randomColor = function () {
  19.     // erzeugt eine ZufallsFarbe und gibt sie als String zurück
  20.     var myCol = "0x";
  21.     var i=6; while (--i>-1) {
  22.         myCol+=randomHex();
  23.     }
  24.     return myCol;
  25. }
  26.  
  27. fill_bildliste = function (werte) {
  28.     // füllt das Array bildliste mit Zufallswerten
  29.     bildliste =[];
  30.     var i = werte; while (--i>-1) {
  31.         bildliste.push(random(screenWidth));        // x-koordinate
  32.         bildliste.push(random(screenHeight));      // y-koordinate
  33.         bildliste.push(randomColor());      // farbe
  34.         bildliste.push (random(6));   // linienstärke
  35.     }
  36. }
  37.  
  38. zeichne_bildliste_at_once = function () {
  39.     // zeichnet den Inhalt von bildliste "auf einen Schlag"
  40.     with (leerfilm) {
  41.         leerfilm.moveTo (bildliste[0], bildliste[1]);
  42.         var myLoopLen = bildliste.length;
  43.         var i = -4; while ((i+=4)<myLoopLen) {
  44.             lineStyle (bildliste[i+3], bildliste[i+2], 100);
  45.             lineTo (bildliste[i], bildliste[i+1]);
  46.         }
  47.     }
  48. }
  49.  
  50. zeichne_bildliste_step_by_step = function () {
  51.     // zeichnet den Inhalt von bildliste "Stück für Stück"
  52.     leerfilm.i = 0;
  53.     leerfilm.myLoopLen = bildliste.length-1;
  54.     leerfilm.moveTo (bildliste[0], bildliste[1]);
  55.    
  56.     leerfilm.onEnterFrame = function () {
  57.         var i = this.i;
  58.         this.lineStyle (bildliste[i+3], bildliste[i+2], 100);
  59.         this.lineTo (bildliste[i], bildliste[i+1]);
  60.         if ((this.i+=4)>this.myLoopLen) this.onEnterFrame = null;
  61.     }
  62. }
  63.  
  64. zeichne_bildliste_step_by_step_speeded = function (steps) {
  65.     // zeichnet den Inhalt von bildliste mit [steps] linien je frame
  66.     leerfilm.i = 0;
  67.     leerfilm.myLoopLen = bildliste.length-1;
  68.     leerfilm.moveTo (bildliste[0], bildliste[1]);
  69.     leerfilm.steps = steps;
  70.     leerfilm.actualstep = 0;
  71.    
  72.     leerfilm.onEnterFrame = function () {
  73.         while(this.actualstep++<this.steps) {
  74.             var i = this.i+this.actualstep*4;
  75.             this.lineStyle (bildliste[i+3], bildliste[i+2], 100);
  76.             this.lineTo (bildliste[i], bildliste[i+1]);
  77.         }
  78.         if ((this.i+=(4*this.steps))>this.myLoopLen) {
  79.             this.onEnterFrame = null;
  80.         } else {
  81.             this.actualstep=0;
  82.         }
  83.     }
  84. }
  85.  
  86.  
  87.  
  88. /*** PROGRAM ***/
  89.  
  90. createEmptyMovieClip("leerfilm", 1);    // leeren Clip zum Zeichnen erzeugen - brauchste nicht, haste ja schon
  91. fill_bildliste(300);    // Array mit 300 Zufallswerten füllen, um irgendwas zu haben - Deins ist ja schon gefüllt
  92.  
  93. // die unterschiedlichen varianten, um das Array zu zeichnen:
  94. zeichne_bildliste_at_once();
  95. //zeichne_bildliste_step_by_step();
  96. //zeichne_bildliste_step_by_step_speeded(10);      
  97. stop();
__________________
http://www.rumbke.de
leif ist offline   Mit Zitat antworten
Alt 18-02-2004, 21:36   #14 (permalink)
Neuer User
 
Registriert seit: Oct 2003
Beiträge: 10
leif...Du bist der Hammer!!!
Tausend Dank!

Ich werde mir das Skript morgen mal genau anschauen und versuchen es komplett zu durchsteigen. Dank Deiner schon geleisteten Hilfe wird mir das gelingen!
betaheidi ist offline   Mit Zitat antworten
Antwort

Lesezeichen

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 15:28 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele