Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 01-12-2006, 22:35   #1 (permalink)
Meep!
 
Registriert seit: Sep 2005
Beiträge: 146
Wieviel partikel sollte man in as3 schaffen?

joa, wieviel partikel kann man maximal auf nem durchschnittsrechner ruckelfrei darstellen? ich habe ein partikelsystem geschrieben, aber ab 1000 partikeln wirds bei mir ruckelig...

beispiel hier:

http://www.pixartist.de/a.html

hier nochn beispiel, bei diesem ruckelts bei mir aber auch praktisch nicht
http://www.pixartist.de/a2.html
__________________
http://www.pixartist.de

Geändert von pixartist (01-12-2006 um 23:18 Uhr)
pixartist ist offline   Mit Zitat antworten
Alt 01-12-2006, 22:40   #2 (permalink)
MVC-Sympathisant
 
Registriert seit: Sep 2005
Ort: Köln
Beiträge: 34
bei mir ruckelt nichts....

Mac Pro 2,66 Quad Core

obwohl die aufsteigenden pixel könnten noch smoother laufen...

Geändert von fiveup (01-12-2006 um 22:43 Uhr)
fiveup ist offline   Mit Zitat antworten
Alt 01-12-2006, 23:23   #3 (permalink)
Meep!
 
Registriert seit: Sep 2005
Beiträge: 146
Zitat:
Zitat von fiveup Beitrag anzeigen
bei mir ruckelt nichts....

Mac Pro 2,66 Quad Core

obwohl die aufsteigenden pixel könnten noch smoother laufen...
leider nicht, ich kann sie ja nicht auf krumme positionen setzen (nicht ohne weiteres) und darum sieht man bei ganz langsamen bewegungen wie sie von einem pixel auf den nächsten springen

edit: ok hab nun statt floor round genommen, für die positionierung...sieht glaubich n bissel runder aus...hab das jetzt aber nicht hochgeladen
__________________
http://www.pixartist.de

Geändert von pixartist (01-12-2006 um 23:25 Uhr)
pixartist ist offline   Mit Zitat antworten
Alt 02-12-2006, 11:06   #4 (permalink)
Knopfmaler
 
Benutzerbild von Aerks
 
Registriert seit: Nov 2004
Ort: Essen
Beiträge: 227
Zitat:
...maximal auf nem durchschnittsrechner ruckelfrei darstellen?
Kommt drauf an. Hängt davon ab, wie groß die Partikel sind, wie komplex die Regeln der Bewegung sind, ob die Menge der Partikel dynamisch ist etc.

Wenn man über 12 fps als ruckelfrei ansieht, dann komme ich auf meinem G4 iBook 1Ghz auf ca. 46.000 Partikel.

Partikel-Test ansehen

Das lässt sich aber IMO bestimmt noch steigern.

Viele Gruesse
=:] Aerks
__________________
______________________________________________
www.rgblaster.de
Aerks ist offline   Mit Zitat antworten
Alt 02-12-2006, 13:47   #5 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
amd athlon xp 2200+, 1,8ghertz 512mb ram...

flash player neun, ruckelfrei
Omega Psi ist offline   Mit Zitat antworten
Alt 02-12-2006, 15:27   #6 (permalink)
x39
 
Benutzerbild von georgem
 
Registriert seit: Oct 2004
Ort: St.Gallen, Schweiz
Beiträge: 1.261
kommt sicher darauf an woraus ein partikel besteht, also wieviel Rechenpower pro Partikel draufgeht.

In meinem ersten bisherigen AS3 Experiment komm ich auf 300 radiale Gradienten (in Actionscript dynamisch erstellt) , das sind 3-stufige gradienten.

http://www.margaris.de/?p=1018

Und es ist gerade noch ruckelfrei auf meinem Rechner.
(Intel Pentium M 1.7 Ghz, Samsung R50)

Wenn ich dann baldmal AS3 komplett durchblicke dann lässt sich das sicherlich steigern.
__________________
The Sleeper Must Awaken

www.margaris.de | www.exosolar.net
georgem ist offline   Mit Zitat antworten
Alt 02-12-2006, 18:03   #7 (permalink)
Meep!
 
Registriert seit: Sep 2005
Beiträge: 146
also bei mir läuft das so...die partikel gehören jeweils zu einem effekt, haben dynamische lebensdauer, farbe und alpha...werden von der schwerkraft beeinflusst, und bei ihrer generierung wird dynamisch per richtungsvektor ihre bewegungsrichtung ausgerechnet...ich check nicht wie der typ es geschafft hat 46k partikel so flüssig darzustellen...ich poste mal meinen code der hauptklasse:
(der code ist sicher alles andere als optimal, ihr könnt mir ja mal nen tipp geben, wie ich die performance steigern kann!)

Hauptklasse:
ActionScript:
  1. //------------------------------------------------------
  2. //Partikelsystem geschrieben von Finn Sohst (pixartist)
  3. //bitte nicht ohne erlaubniss weiterbenutzen...
  4. //pixartist.de@gmail.com
  5. //------------------------------------------------------
  6. package
  7. {
  8.     import Particle
  9.     import ParticleEffect
  10.     import flash.display.Bitmap
  11.     import flash.utils.trace
  12.     import flash.display.BitmapData
  13.     import flash.events.Event
  14.     import flash.display.DisplayObject;
  15.     import flash.text.textField;
  16.     class PSys
  17.     {
  18.        
  19.         private var pixellist:Array;
  20.         private var swidth:Number;
  21.         private var sheight:Number;
  22.         private var imgObj:Bitmap;
  23.         private var imgData:BitmapData;
  24.         public var gravity:Number;
  25.         public var lws:Number;
  26.         public var pos:Array;
  27.         public var effectsList:Array;
  28.         public var aop:Number;
  29.        
  30.         public function PSys(displayObject:DisplayObject, xs:Number,ys:Number)
  31.         {
  32.             dop = displayObject;
  33.             gravity = 0.1;
  34.             lws = 0.95;
  35.             swidth = xs;
  36.             sheight = ys;
  37.             pos = [0,0];
  38.             pixellist = new Array();
  39.             imgData = new BitmapData(swidth,sheight,true,0);
  40.             imgObj = new Bitmap(imgData);
  41.             displayObject.addEventListener( Event.ENTER_FRAME, onEnterFrame );
  42.             displayObject.addChild( imgObj );
  43.             effectList = new Array();
  44.         }
  45.        
  46.         public function spawnParticle(sc:Number, ec:Number, sa:Number, ea:Number ,xp:Number,yp:Number,xv:Number,yv:Number, lifet:Number, id:ParticleEffect):Number
  47.         {
  48.             //spawnt den partikel...dreckig gecoded, funktioniert aber :)
  49.             var tmp:Particle = new Particle(id);
  50.             tmp.xp = xp;
  51.             tmp.yp = yp;
  52.             tmp.xv = xv;
  53.             tmp.yv = yv;
  54.             tmp.lifeTime = lifet;
  55.             tmp.setColors(sc, ec, sa, ea);
  56.             pixellist.push(tmp);
  57.             //öhh das return ist hier geblieben, weil ich am anfang nen anderen ansatz zum ansprechen von partikel umsetzen wollte...hab die pläne aber geändert...bin aber zu faul das zu löschen...
  58.             return 0;
  59.            
  60.            
  61.         }
  62.         public function addEffect(e:ParticleEffect)
  63.         {
  64.             //is klar
  65.             effectList.push(e);
  66.         }
  67.         private function onEnterFrame( event: Event ): void
  68.         {
  69.             //effects:
  70.             //effektliste durchlaufen....
  71.             for(var e = 0; e < effectList.length; e++)
  72.             {
  73.                 //wenn der effekt nicht bereits gelöscht oder inaktiv ist
  74.                 if(effectList[e] != undefined && effectList[e].active)
  75.                 {
  76.                     //ist der timer = 0 dann werden die partikel gespawnt
  77.                     if(effectList[e].timer <= 0)
  78.                     {
  79.                         //lets go;
  80.                         for(var pa = 0; pa < effectList[e].particlesPerSpawn; pa++)
  81.                         {
  82.                            
  83.                             //richtung berechnen..plödes winkelmaß... (hier vermute ich nen grossen performance verlust...)
  84.                             var W:Number;
  85.                             if(effectList[e].pMaxW > effectList[e].pMinW)
  86.                             {
  87.                                 W = (Math.random()*(effectList[e].pMaxW - effectList[e].pMinW)) + effectList[e].pMinW;
  88.                                
  89.                             }
  90.                             else if(effectList[e].pMaxW < effectList[e].pMinW)
  91.                             {
  92.                                 W = Math.random()*(360-(effectList[e].pMinW - effectList[e].pMaxW))+effectList[e].pMinW;
  93.                                 while(W > 360)
  94.                                     W -= 360;
  95.                             }
  96.                            
  97.                             var bm = (W*Math.PI)/180;
  98.                             var power = Math.random()*(effectList[e].pMaxV - effectList[e].pMinV)+effectList[e].pMinV;
  99.                             var xp = Math.sin(bm)* power;
  100.                             var yp = Math.cos(bm)* -power;
  101.                             //und hier wird der partikel dann erstellt...
  102.                             spawnParticle(effectList[e].pscolor, effectList[e].pecolor, effectList[e].psalpha, effectList[e].pealpha,effectList[e].pStartPos[0],effectList[e].pStartPos[1], xp, yp, (Math.random()*(effectList[e].pLifeTime[1]-effectList[e].pLifeTime[0]))+effectList[e].pLifeTime[0], effectList[e]);
  103.                            
  104.                         }
  105.                        
  106.                     }
  107.                     //vars im effekt höchzählen (lifetime und so)
  108.                     effectList[e].lifeTimer++;
  109.                     effectList[e].timer++;
  110.                     //timer für den spawn zurücksetzen
  111.                     if(effectList[e].timer >= effectList[e].interval)
  112.                     {
  113.                         effectList[e].timer = 0;
  114.                     }
  115.                     //zeit abgelaufen?
  116.                     if(effectList[e].lifeTimer >= effectList[e].duration && effectList[e].duration >= 0)
  117.                     {
  118.                         effectList[e] = undefined;
  119.                     }
  120.                    
  121.                 }
  122.             }
  123.             //nun wirds rechenintesiv partikelspezifischer kram
  124.             //alle partikel durchgehen....
  125.             for(var i = 0; i<pixellist.length ; i++)
  126.             {
  127.                 //aop ist die anzahl der partikel...ürre nicht? ;)
  128.                 aop =  pixellist.length;
  129.                 //wenn der partikel auch existiert...
  130.                 if(pixellist[i] != undefined)
  131.                 {
  132.                     //alte position vom bild entfernen...
  133.                     imgData.setPixel32(Math.round(pixellist[i].xp),Math.round(pixellist[i].yp),0);
  134.                     //position aktualisieren...
  135.                     pixellist[i].xp += pixellist[i].xv;
  136.                     pixellist[i].yp += pixellist[i].yv;
  137.                     pixellist[i].yv += gravity;
  138.                     pixellist[i].xv *= lws;
  139.                     pixellist[i].yv *= lws;
  140.                     //lifetimer...
  141.                     pixellist[i].decLifeTimer();
  142.                     //ausserhalb des bildschirms? (ausser nach oben )
  143.                     if(pixellist[i].xp < 0 || pixellist[i].xp > swidth || /*pixellist[i].yp < 0 ||*/ pixellist[i].yp > sheight)
  144.                     {
  145.                         //weg damit
  146.                         pixellist[i] = pixellist[pixellist.length-1];
  147.                         pixellist.pop();
  148.                     }
  149.                     else if(pixellist[i].lifeTime <= 0)
  150.                     {
  151.                         //ist der partikel tot? dann wird hier der folgeeffekt gestartet!
  152.                         if(pixellist[i].id.onDie != undefined)
  153.                         {
  154.                             //bzw die nachfolgeeffekte... es kann beliebig viele geben
  155.                             for(var g = 0; g < pixellist[i].id.onDie.length; g++)
  156.                             {
  157.                                 //prototyp duplizieren
  158.                                 var stmp:ParticleEffect = new ParticleEffect(pixellist[i].id.onDie[g].interval, pixellist[i].id.onDie[g].duration, pixellist[i].id.onDie[g].particlesPerSpawn, pixellist[i].id.onDie[g].pscolor, pixellist[i].id.onDie[g].pecolor, pixellist[i].id.onDie[g].psalpha, pixellist[i].id.onDie[g].pealpha , pixellist[i].id.onDie[g].pStartPos, pixellist[i].id.onDie[g].pMinV, pixellist[i].id.onDie[g].pMaxV , pixellist[i].id.onDie[g].pMinW, pixellist[i].id.onDie[g].pMaxW, pixellist[i].id.onDie[g].pLifeTime, pixellist[i].id.onDie[g].onDie);
  159.                                 stmp.setPosition([pixellist[i].xp,pixellist[i].yp]);
  160.                                 //und rein in die liste...
  161.                                 addEffect(stmp);
  162.                             }
  163.                         }
  164.                         //ja, auch wenn ein partikel tot ist wird er gelöscht ;)
  165.                         pixellist[i] = pixellist[pixellist.length-1];
  166.                         pixellist.pop();
  167.                        
  168.                     }
  169.                     else
  170.                     {
  171.                         //ansonsten wird er gezeichnet...
  172.                         imgData.setPixel32(Math.round(pixellist[i].xp),Math.round(pixellist[i].yp),  pixellist[i].getColor());
  173.                     }
  174.                 }
  175.                
  176.                
  177.             }
  178.                
  179.         }
  180.        
  181.     }
  182. }

Effektklasse:
ActionScript:
  1. //------------------------------------------------------
  2. //Partikelsystem geschrieben von Finn Sohst (pixartist)
  3. //bitte nicht ohne erlaubniss weiterbenutzen...
  4. //pixartist.de@gmail.com
  5. //------------------------------------------------------
  6. package
  7. {
  8.     class ParticleEffect
  9.     {
  10.         public var interval:Number;
  11.         public var duration:Number;
  12.         public var particlesPerSpawn:Number;
  13.         public var pscolor:Number;
  14.         public var pecolor:Number;
  15.         public var psalpha:Number;
  16.         public var pealpha:Number;
  17.         public var pStartPos:Array;
  18.         public var pMinV:Number;
  19.         public var pMaxV:Number;
  20.         public var pMinW:Number;
  21.         public var pMaxW:Number;
  22.         public var pLifeTime:Array;
  23.         public var timer:Number;
  24.         public var lifeTimer:Number;
  25.         public var active:Boolean;
  26.         public var onDie:Array;
  27.         public function ParticleEffect(interval:Number, duration:Number, particlesPerSpawn:Number, pscolor:Number, pecolor:Number, psalpha:Number, pealpha:Number, pStartPos:Array, pMinV:Number, pMaxV:Number, pMinW:Number, pMaxW:Number, pLifeTime:Array, onDie:Array)
  28.         {
  29.             active = true;
  30.             timer = 0;
  31.             lifeTimer = 0;
  32.             this.interval = interval;
  33.             this.duration = duration;
  34.             this.particlesPerSpawn = particlesPerSpawn;
  35.             this.pscolor = pscolor;
  36.             this.pecolor = pecolor;
  37.             this.psalpha = psalpha;
  38.             this.pealpha = pealpha;
  39.             this.pStartPos = pStartPos;
  40.             this.pMinV = pMinV;
  41.             this.pMaxV = pMaxV;
  42.             this.pMinW = pMinW;
  43.             this.pMaxW = pMaxW;
  44.             this.pLifeTime = pLifeTime;
  45.             this.onDie = onDie;
  46.         }
  47.         public function setPosition(pStartPos:Array)
  48.         {
  49.             this.pStartPos = pStartPos;
  50.         }
  51.     }
  52. }





wär super wenn ihr das mal überfliegen könntet um mir n paar tips zu geben, danke
__________________
http://www.pixartist.de

Geändert von pixartist (02-12-2006 um 18:39 Uhr)
pixartist ist offline   Mit Zitat antworten
Alt 02-12-2006, 21:00   #8 (permalink)
Meep!
 
Registriert seit: Sep 2005
Beiträge: 146
ok wie hart lagt das bei euch? komme auf 6 fps

www.pixartist.de/a3.html
__________________
http://www.pixartist.de
pixartist ist offline   Mit Zitat antworten
Alt 02-12-2006, 22:17   #9 (permalink)
--------------->
 
Benutzerbild von shikamoo
 
Registriert seit: Jan 2006
Ort: München
Beiträge: 1.185
bin bei 9-11...
shikamoo ist offline   Mit Zitat antworten
Alt 02-12-2006, 23:18   #10 (permalink)
MVC-Sympathisant
 
Registriert seit: Sep 2005
Ort: Köln
Beiträge: 34
15 - 25 fps

die gesamte animation hält ca 1x die sekunde kurz an. ansonsten läufts flüssig.

Geändert von fiveup (02-12-2006 um 23:21 Uhr)
fiveup ist offline   Mit Zitat antworten
Alt 02-12-2006, 23:26   #11 (permalink)
Meep!
 
Registriert seit: Sep 2005
Beiträge: 146
sagt mal, sind die werte ok oder zu langsam? xD
__________________
http://www.pixartist.de
pixartist ist offline   Mit Zitat antworten
Alt 03-12-2006, 13:58   #12 (permalink)
Neuer User
 
Registriert seit: Apr 2002
Ort: Thüringen
Beiträge: 18
ca. 31 fps....allerdings läuft langsam aber sicher der CPU-Lüfter immer mehr. (AMILO M3438G, Intel Centrino Alviso 2,0 GHz)
__________________
People once believed that when someone dies a crow carries their soul to the land of the dead. But sometimes something so bad happens that a terrible sadness is carried with the soul and the soul can't rest. And sometimes just sometimes the crow can bring that soul back to put the wrong things right.
Salvation ist offline   Mit Zitat antworten
Alt 03-12-2006, 14:24   #13 (permalink)
Knopfmaler
 
Benutzerbild von Aerks
 
Registriert seit: Nov 2004
Ort: Essen
Beiträge: 227
Beim letzten Beispiel komm ich so auf rund 10 fps. G4-iBook ca. 1Ghz.

Ich hab den Source jetzt nur mal so überflogen, aber ein paar Sachen, die man recht einfach ändern könnte sind mir aufgefallen.

Du holst dasselbe Objekt jedesmal neu aus einem ungetypten Array. Das dauert.
Code:
pixellist[i].xp += pixellist[i].xv;
pixellist[i].yp += pixellist[i].yv;
pixellist[i].yv += gravity;
pixellist[i].xv *= lws;
pixellist[i].yv *= lws;

Besser wäre es so, dann weiss der Compiler auch was er da vor sich hat. Das ist wesentlich schneller.

Code:
var obj:Particle=pixellist[i];
obj.xp += obj.xv;
obj.yp += obj.yv;
obj.yv += gravity;
obj.xv *= lws;
obj.yv *= lws;
Der Hauptflaschenhals ist aber das ständige generieren von Objekten und das popen und pushen auf Arrays. Die meiste Zeit geht bestimmt für Speicherverwaltung drauf, deshalb würde ich alle Objekte vorher in einem Particle-Pool anlegen und dann immer wieder recyclen.

Math.round() sieht man eh kaum, würde ich weglassen.

@shikamoo
Zitat:
bin bei 9-11...
<paranoia>Himmel!!1 Und auf dem Bild sind Wolkenkratzer abgebildet!!!!1 Das muss was bedeuten</paranoia>


Viele Gruesse
=:] Aerks
__________________
______________________________________________
www.rgblaster.de

Geändert von Aerks (03-12-2006 um 14:35 Uhr) Grund: Fehler im Source korrigiert
Aerks ist offline   Mit Zitat antworten
Alt 03-12-2006, 16:20   #14 (permalink)
habs vergessen
 
Benutzerbild von pwdVergesser
 
Registriert seit: Feb 2006
Beiträge: 990
Zitat:
Zitat von Aerks Beitrag anzeigen
@aerks...
im übrigen ein sehr schöner effekt!


pwd
__________________
Blog/Lab Xing
pwdVergesser ist offline   Mit Zitat antworten
Alt 03-12-2006, 16:23   #15 (permalink)
Flashworker
 
Benutzerbild von sebastian
 
Registriert seit: Nov 2001
Ort: Wiesbaden
Beiträge: 10.945
Ja dito

Bei a3 komme ich übrigens auf so 30-40 fps (teilweise auch mal 2-3 mehr)
[auf dem Notebook]

Edit: Ach ja, im FF nur so 14-17

Geändert von sebastian (03-12-2006 um 16:38 Uhr)
sebastian 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 19:44 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele