Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 30-06-2005, 08:40   #1 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 51
splice <- zu rechenaufwendig... aufgabe: viele werte aus array löschen

also ich hab schonmal gefragt, aber weiß jetzt genau woran die rechenleistung hängt, nämlich am "splice":

die aufgabenstellung ist:
eine funktion die eine rechteckige maske aus viele kleinen rechtecke ("digits") erstellt.

meine lösung:
um beim random immer nur die "übrigen" digits (sprich die bereiche, die schon maskiert sind, brauchen ja nicht nochmal maskiert werden) habe ich erstmal alle "werte" in ein array geladen, dannach soll das script über die länge des arrays ein random machen und sich ein array wert aussuchen, dieses feld soll dann maskert werden, der wert aus dem array gelöscht und dannach ein neuer wert gemacht werden.

soweit so gut, das script funktioniert auch gut, allerdings geht die rechenleistung in die knie, sobald ein splice drinne ist. ohne splice funktioniert das script flott und problemlos, mit splice hat man dann so ca. 1 frame die sekunde, sieht dann dementprechend sch**** aus...

hier das script:
ActionScript:
  1. ...
  2. function makemask(posx, posy, x, y, speed, foto) {
  3.     _root["fotos"][foto].swapDepths(100);
  4.     _root["fotos"][foto]._x = posx;
  5.     _root["fotos"][foto]._y = posy;
  6.     _root["mask"]._x = posx;
  7.     _root["mask"]._y = posy;
  8.     depth = 0;
  9.     digits = new Array();
  10.     for (t=0; t<x; t++) {
  11.         for (z=0; z<y; z++) {
  12.             digits.push([t, z, 0]);
  13.         }
  14.     }
  15.     total = digits.length;
  16.     _root["mask"].onEnterFrame = function() {
  17.         for (f=0; f<speed; f++) {
  18.             if (depth<total) {
  19.                 r = random(digits.length);
  20.                 mname = "maske"+digits[r][0]+"_"+digits[r][1];
  21.                 _root["mask"].attachMovie("maske", mname, depth++);
  22.                 _root["mask"][mname]._x = (5*digits[r][0]);
  23.                 _root["mask"][mname]._y = (5*digits[r][1]);
  24.                 count++;
  25.                 digits.splice(r,1);
  26.                 trace(digits.length)
  27.             } else {
  28.                 _root["mask"].attachMovie("maske", "all", depth++);
  29.                 _root["mask"]["all"]._width = 5*x;
  30.                 _root["mask"]["all"]._height = 5*y;
  31.                 delete _root["mask"].onEnterFrame;
  32.                 inaction = false;
  33.                 break;
  34.             }
  35.         }
  36.         _root["fotos"].setMask(_root["mask"]);
  37.     };
  38. }
  39. ...

gibt es vielleicht einen nicht so rechenaufwendigen weg werte aus dem array zu löschen oder einen anderen lösungsansatz, der nicht so viel rechenleistung beansprucht?

so far
thx
trebek ist offline   Mit Zitat antworten
Alt 30-06-2005, 11:29   #2 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Stimmt auffallend, das habe ich so noch nie gesehen.
Alternativ könntest du die Einträge in digits vorher mischen (z.B. durch Vertauschen zweier zufälliger Einträge) und dann einfach per digits.pop() durchlaufen.

ActionScript:
  1. var a = new Array();
  2. for( var i=0; i<10000; i++){
  3.     a.push(i);
  4. }
  5.  
  6. // teste splice
  7. var b = a.slice(0);
  8. var t = getTimer();
  9. for( var i=0; i<100; i++){
  10.     var r = random(b.length);
  11.     b.splice( r, 1);
  12. }
  13. trace( getTimer() - t);
  14.  
  15. // teste slice + concat
  16. var b = a.slice(0);
  17. var t = getTimer();
  18. for( var i=0; i<100; i++){
  19.     b = b.slice(0,r-1).concat(b.slice(r));
  20. }
  21. trace( getTimer() - t);
  22.  
  23.  
  24. // test vorher mischen
  25. var b = a.slice(0);
  26. var t = getTimer();
  27. for( var i=0; i<10000; i++){
  28.     var r1 = random(b.length);
  29.     var r2 = random(b.length);
  30.     var tmp = b[r1];
  31.     b[r1] = b[r2];
  32.     b[r2] = tmp;
  33. }
  34. for( var i=0; i<100; i++){
  35.     b.pop();
  36. }
  37. trace( getTimer() - t);


mfg .r

Geändert von bokel (30-06-2005 um 11:32 Uhr)
bokel ist offline   Mit Zitat antworten
Alt 30-06-2005, 12:02   #3 (permalink)
Neuer User
 
Registriert seit: Jul 2003
Beiträge: 51
mensch das ist ja wirklich geil! funktioniert auf anhieb und problemlos! danke danke! und ne wirklich gute idee :o) hätte nicht gedacht, dass flash damit nicht so "probleme" hat :D

aber alleine schon der zeitgewinn ist ja ernorm... nahezu 30 mal schneller

Geändert von trebek (30-06-2005 um 12:04 Uhr)
trebek ist offline   Mit Zitat antworten
Alt 01-07-2005, 00:19   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
aaah, schneller, weiter, höher
ich liebe solche spielchen. man entdeckt immer wieder erstaunliches dabei.
ActionScript:
  1. var a = new Array();
  2. for (var i = 0; i<10000; i++) {
  3.     a.push(i);
  4. }
  5. // test vorher mischen
  6. var b = a.slice(0);
  7. var t = getTimer();
  8. for (var i = 0; i<10000; i++) {
  9.     var r1 = random(b.length);
  10.     var r2 = random(b.length);
  11.     var tmp = b[r1];
  12.     b[r1] = b[r2];
  13.     b[r2] = tmp;
  14. }
  15. for (var i = 0; i<100; i++) {
  16.     b.pop();
  17. }
  18. trace((getTimer()-t)+' # '+(b.length));
  19. // test vorher mischen
  20. var b = a.slice(0);
  21. var t = getTimer();
  22. var l = b.length;
  23. var i = 10000;
  24. while (--i) {
  25.     var tmp = b[r1=random(l)];
  26.     b[r1] = b[r2=random(l)];
  27.     b[r2] = tmp;
  28. }
  29. b.length -= 100;
  30. trace((getTimer()-t)+' # '+(b.length));
  31. //
  32. // geht tatsächlich!
  33. var m = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  34. m.length -= 5;
  35. for (i in m) {
  36.     trace(m[i]);
  37. }
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib 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 10:05 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele