Squeezing Mer Juice Ut av Flash Player
Del
Del
en
Del
Dette Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
I denne opplæringen vil du bygge en ekstrem partikkel system mens lære å presse mer effektiv godhet ut av Flash Player enn du trodde var mulig!
republiseres Tutorial
Hver noen uker, vi besøker noen av våre lesernes favoritt innlegg fra hele historien til området. Denne opplæringen ble første gang utgitt i desember 2010.
Endelig resultat
Her er et par eksempler på hva vi skal jobbe mot:
Epilepsiadvarsel :
Vennligst ikke se denne demoen hvis du er sannsynlig at lider av epileptiske anfall eller tap av bevissthet, spesielt når man ser på noen typer sterke blinkende lys, rask rekkefølge av bilder, enkle geometriske former, blinker eller eksplosjoner <. br>
Innledning: Hva vil du lære
Mange brukere, fra nybegynner til avansert, kan fortsatt sees ved hjelp av mindre enn effektiv Actionscript 3.0. I all sannsynlighet, er det fordi de effektive måter er laget for å høres litt mer vanskelig og rettet mot svært avanserte brukere. Denne veiledningen vil vise deg at disse metodene kan brukes av alle, og de er mer nyttig enn du kanskje tror!
Formålet med opplæringen er å la deg takle de oppgavene som krever at man arbeider med mye . data, veldig fort, med letthet
Nyttig tips: Denne opplæringen vil inneholde mye I hjertet av å gjøre alle ting effektiv i Flash Player er FPS (Frames Per Second) av SWF. Den bød målet for SWF kan settes i Flash Professional grensesnitt eller en ny funksjon i Actionscript 3.0, kan du endre FPS av scenen under kjøring Men dette vil bare noen gang komme og sette mål FPS (hva Flash Player vil forsøke å spille på), som gjør det ganske ubrukelig for preformance testing. Du tenker kanskje at de herlige folk over på Adobe ville gjort en fin fin måte å finne ekte FPS, men nope. Du er nødt til å gjøre regnestykket for deg selv. La oss ta en titt. FPS kan defineres som tidsforskjellen mellom den gjeldende rammen og den siste. Vi vil bruke denne funksjonen som målestokk for å sammenligne effektiviteten av ulike metoder herfra på. Som du kanskje har lagt merke til, bruker vi funksjonen til å beregne tidsforskjellen, ikke FPS. Dette er fordi tracing tidsforskjellen er faktisk mye mer nyttig og enklere å lese når vi kommer til fartstester. Beregning av FPS blir bare nyttig når vi setter alt sammen på slutten. Har du noen gang trenger å lagre en hel haug med tall, strenger eller objekter i en liste? Selvfølgelig har du! Men spørsmålet er - har du gjort det riktig Hvis det første du tenker tenke på når du lager en liste i AS3 er en Array, så dette tipset er for deg?. En vektor er nøyaktig den samme som en vanlig Array med unntak av en Faktisk er det et maskinskrevet Array. Dette betyr at du bare kan fylle den med én type element. For eksempel kan du sette et tall og en streng i samme Array, men ikke i en Vector. La oss ta en titt på den eneste forskjellen mellom en matrise og en vektor, erklære Vector. Som sett ovenfor, erklærte vektoren er den eneste forskjellen mellom de to typene. Å ha Vector holde et annet objekt, bare erstatte streng med objektet. For å holde movieclips for eksempel: Hvordan virker dette gjøre det mer nyttig? Hvis alle elementene i en vektor er av samme type da Flash Player kan zip gjennom dem mye mye raskere fordi den vet hva som kommer opp og ikke trenger å teste det neste elementet hver gang (dette gjelder selv når erklære en variabeltype , så aldri la den ut!). Hvor stor er forskjellen? Overraskende stor faktisk! La oss ta en titt på vår første test av hastighet Dette utganger følgende: Du bør ikke få nøyaktig samme resultat som det jeg har her selvfølgelig, du vil nesten aldri få samme sett av verdier selv enda, da dette avhenger av hvor mye innsats CPU kan presse inn i denne under kjøring. Det første paret med verdiene kommer fra å skrive inn i matrise og vektor hhv. Vi kan se at Vector barbert av nesten 0,6 sekunder, stille en substancial beløpet hvis vi trenger å gjøre noe lignende 24 (standard FPS for flash filmer) ganger i sekundet. Tross alt, 1 /24th av et sekund er litt over 0,04 sekunder. En enda større prosentvise forskjellen kan bli funnet når du er leser Forhåpentligvis etter å ha lest dette avsnittet bør du være komfortabel med å bruke vektorer i prosjekter for den ekstra sjanse til effektivitet. Som alle ting i Flash, det er mer enn én måte å løse et problem, tilstelninger Lyttere er intet unntak. I denne opplæringen vil vi se to metoder for å feste Event.ENTER_FRAME lytteren til partikler. Ideen bak denne tilnærmingen er at du legger ved en lytter til hver av partikler og henvise dem til et sett funksjon. Dette er ikke ideelt for hva vi har i tankene, men husk en partikkel, i form av programmering, ikke behøver å være et enkelt punkt. For eksempel kan denne metoden være å foretrekke når det går mellom Flash-baserte nettsider eller gjenstander som blir behandlet ulikt i lytteren funksjonen. La oss ta en titt Dessverre er det ingen hard og rask måte å nøyaktig sjekke forskjellen i hastighet mellom disse to metodene på grunn av uoverensstemmelser i ringer prosessen mens du bruker metoden man (i alle fall ikke en nøyaktig metode som ikke vil kreve en egen komplett tutorial!) Ta mitt ord for det, ved hjelp av metoden to er langt bedre for bruk i partikkel-systemer på grunn av to viktige faktorer: Etter å ha lest denne delen, bør du nå vet hvordan å komfortabelt holde styr på og referere mange partikler. Husk, metode en for objekter som bør behandle sine lytteren fungerer forskjellig og metode to for mange objekter som alle skal behandles på nøyaktig samme eller en svært lik måte i sin lytteren funksjon. Det neste steget mot vår komplett partikkel system bygger riktig partikkel for oss selv. Det kan derfor skje at du trenger en full MovieClip for hver partikkel, for å gjøre bruk av rammer og slikt, men for oss er en MovieClip en stor overkill. All vår partikkelen er en plassholder for en haug med verdier som må holdes sammen og forholder seg til hverandre. Dette gir oss muligheten til å drastisk redusere størrelsen på klassen brukes Følgende er den grunnleggende klassen vi kan bruke for våre partikkel Legg merke til at det ikke har noen base klasse (dvs. den ikke strekker seg noe), og derfor er det "født" uten egenskaper som du kanskje bruker regelmessig, for eksempel "x" og "y" verdier. For å løse dette bruker vi bygger våre egne getter metoder for å lese disse verdiene. Disse verdiene blir deretter ført inn i en Vector3D objekt. En Vector3D objekt er i utgangspunktet en vektor som inneholder tre variabler og en valgfri fjerde variabel. Forskjellen er at du kan referere til disse verdiene som 'x', 'y', 'z' og 'w' henholdsvis The 'w', som er valgfritt, kan brukes til gamle en rotasjon verdi for eksempel. Dette gjør denne typen holder perfekt for hva vi trenger. (Vi kan selv lage disse egenskapene som offentlige Antall variabler i klassen direkte, uten bruk av Vector3D objekter i det hele tatt ... men la oss holde fast med hva vi 've fikk.) Men hvordan akkurat ikke å skape vår egen klasse hjelp? La oss gjøre en rask minne test for å finne ut! . Husk å lagre dette, dokumentet klasse og Particle klasse i samme destinasjon Dette Mater ut noe sånt som følgende: Som du ser, er det en massiv forskjell mellom størrelsen på klassen vår og MovieClip. Frigjøre all denne plassen tillater mer plass på RAM og så det gjør at hele Flash Player for å kjøre rolig litt raskere. Hvor mye raskere? La oss ta en titt på det også! Mye av denne koden er den samme som vår Array vs. Vector Speed test Dette bør produksjonen noe som ligner på følgende: Som du kan se fra disse resultatene den reelle forskjellen er i skrive ganger; dette er fordi Flash Player har å trekke på flere ressurser (base klassene i MovieClip og hver påfølgende objekt) for å fullføre dette. I vårt hovedprosjekt dette er ikke noe reelt problem siden vi trenger bare å lage nye partikler i begynnelsen, men vi vil se et eksempel senere når presser nye partikler i hele tiden blir nødvendig. Forskjellen i lesing tider er nesten neglisjerbar ettersom begge klasser bruke sine getters for 'x' eiendom på samme måte. Etter å ha lest denne delen skal du være komfortabel med å bygge din base klasse for partikkel behov. punktgrafikk, og deres partner in crime BitmapData, er vanligvis noen av de to mest forvirrende trinn for en nybegynner, hovedsakelig fordi det de er vanligvis brukt til er høyere nivå ting. Her vil jeg gi en kort innføring i noen av de grunnleggende og mest brukte metoder vedrørende Bitmap og BitmapData klasser I den raskeste forklaring mulig.? I utgangspunktet, Bitmap klasse viser hva BitmapData klassen forteller det til. De går hånd i hånd nesten alltid. BitmapData klassen har ikke en grafikk egenskap av sin egen, men det er fortsatt en av de viktigste klasser for Flash grafikk! Hvordan? Det trekker figurer av andre klasser. La oss ta en titt på hvordan å trekke en enkel sirkel ved hjelp av punktgrafikk og BitmapData Dette resulterer i en enkel grå sirkel berøre øvre venstre hjørne av scenen når løp. Trekningen () metoden er bare et øyeblikksbilde av MovieClip på den tiden så i teorien kunne vi flytte circleShape objekt rundt en fortsette å trekke det for å gi inntrykk av mange sirkler. Dette er hvordan en masse tegning innenfor punktgrafikk blir gjort. Fordi på basis av alle grafikk er rå bildeelementer, blir denne metoden meget viktig for å skape effekter ved å bruke Bitmap og BitmapData klasser. Den lar deg endre til farge på en piksel inne i BitmapData området. . Her er hvordan det er gjort Du bør ende opp med noe som ser ut som dette, med flere punkter som vises på hver ramme: Dette er grafikk stil vi vil bruke for vårt system. Ikke bry deg om det ser ganske forferdelig akkurat nå, på slutten du vil se hvordan vi kan gjøre disse ser mye bedre med en hel haug med effekter. Disse metodene er noen av de minst brukte, men mest nyttig om bitmap. Faktisk ville jeg aldri har visst om det eksisterer hvis det ikke var for en stor liten nettsted kalt wonderfl hvor medlemmene regelmessig skryte massive partikkel-systemer, er sannheten at disse var inspirasjon av denne opplæringen! Du vil kanskje bli hardt presset til å finne et tilsvarende sett av metoder for å bruke sammen, dette er hvordan de fungerer: I bunn og vikle deg låsen () og låse () metoder rundt det punktet hvor koden er å endre utseendet til en Bitmap. Mens for situasjonen vist ovenfor de er ikke alle som nyttig, i stor skala system med mange tusen endringer i bitmap de fortgang i prosessen ved en lang skudd. Dette er fordi Bitmap og BitmapData klasser liker å ha mye å gå på på en gang, jo flere endringer du kan stappe inn i ett trinn bedre de blir! Disse metodene er stor for at de satt på vent alle endringer som er gjort til låst bitmap til den er låst opp, og dette betyr at det ikke er re-rendret i denne perioden, noe som setter fart på prosessen. BitmapData klassen tilbyr ikke en entydige metode for å lage tørke sine data, så her er to vanlige måter å gjøre det. . Vi kan gjenbruke all koden fra å lære om setPixel metoden Hvis du bruker clearRect metoden, bare trekker det en helt ny grå rektangel over alt annet. Dette er ikke så uforsiktig metode som det høres ut først fordi huske alt du noen gang å gjøre med en Bitmap endrer fargen på et sett av piksler; overlappende elementer gjør ingen forskjell hva så noensinne. Det andre alternativet visker ut prikkene ved å flette dem inn i bakgrunnen. Vi vil bruke dette senere for å skape mer interessante effekter. Du bør være oppmerksom på at denne metoden krever en betydelig lengre beregne tid og bør unngås hvis effektivitet er din eneste bekymring. Vi vil forlate dette til den siste bit av opplæringen der vi ikke sikter for maksimal effektivitet. Dette er vår siste test av hastighet og her vi vil teste hastigheten forskjellen mellom å tegne flere figurer ved hjelp av Bitmap klasser og MovieClip klasse. Her er er: ADVARSEL: Det vanlige createMovieClipCircles () metoden er så ineffektiv at du ikke bør la det kjøre i mer enn noen få sekunder. The Flash Player vil fortsette å avta før den til slutt stopper opp Hva bør du finne etter å ha brukt begge metodene er at: createMovieClipCircles metoden er så ineffektiv fordi den trenger å legge hver sirkel til skjermlisten som forlater Flash Player sliter med å holde vekten av dem alle. Dette er grunnen til at vi må bruke Bitmap og BitmapData klasser i vår partikkel system. Fra å lese dette avsnittet bør du nå være kjent med mange av de metodene vi kan bruke fra Bitmap og BitmapData klasser for å bygge vår partikkel system . Jeg har dekket mye av det vi trenger å vite for å bygge et slikt system, så nå tror jeg det er på tide vi dykke i! Systemet vårt vil ikke være pen , men dang det vil være rask! Det vil være sammensatt av to klasser, den Particle klassen vi har gjort tidligere, og kontrolleren klasse som holder sjekk av alt. Vårt mål er å bygge et system som vil børste av 100k partikler, ler 150k partikler og ta på 200k komfortabelt. Selvfølgelig dette avhenger av systemet ditt, men mine er ca seks år gammel og har ikke blåst opp ennå, så jeg er sikker på at de fleste av dere vil være i orden. Først vil vi begynne med det grunnleggende Particle klassen, . mye av koden som du vil se vil være den samme som i trinnene beskrevet tidligere
av koding, så jeg anbefaler å bruke en mer brukervennlig koding grensesnitt. Jeg anbefaler FlashDevelop, den har noen av de beste koden hinting rundt og best av alt, det er helt gratis! Men jeg er sikker på at de fleste av dere vil bare kopiere og lime om å gjøre noe i det hele tatt :)
Trinn 1 Kontroller at FPS!
stage.frameRate = 30;. Trace (stage.frameRate); //30
Så alt vi trenger er noen måte å spore tidsforskjellen fra denne rammen til den forrige rammen av SWF. Dette bruker dokumentet klassen funksjonen. Hvis du er usikker på hvordan du bruker dette, sjekk ut denne Quick Tips om hvordan du bruker et dokument klasse
pakken {//import importere flash.events.Event.; import flash.utils.getTimer; import flash.display.MovieClip; public class FPSCalculator strekker MovieClip {//variabel for å holde det nåværende tidspunkt private Var currentTime: int = 0; offentlig funksjon FPSCalculator () {//legge enter ramme lytteren, dette er avfyrt når SWF oppdateringer til en ny ramme stage.addEventListener (Event.ENTER_FRAME, onFrameLoop); } Private funksjon onFrameLoop (evt: Hendelses): void {//for tilregnelighet til andre utviklere, prøve å sette hver oppgave i en egen funksjon. //dette gjør det uendelig lettere å lese for dem og deg selv på et stort prosjekt, eller når du kommer tilbake til og gamle //siden getTimer () -funksjonen returnerer spilt tid i millisekunder, og vi ønsker FPSecond, deler vi den i 1000 Var fps: Number = (1000 /timeDifference); trace (fps); } //Dette er en get funksjon så det kan refereres akkurat som en variabel, uten parentes på slutten som en normal funksjon privat funksjon få timeDifference (): int {//den getTimer () -funksjonen returnerer den totale spilletiden av SWF i millisekunder Var totalPlayedTime: int = getTimer (); //Forskjellen i tid fra den forrige rammen til denne rammen vilje til beregnet her Var timeDifference: int = (totalPlayedTime - currentTime); //Den currentTime er satt til den totale spilletiden så den er klar for neste ramme currentTime = getTimer (); //returnerer forskjellen i tid retur timeDifference}}}
Tips 1 Arrays vs. vektorer
private funksjons Arrayvs.VectorDifferences (): void {//delare rekken og vektoren, er dette den eneste forskjellen mellom de to Var myArray: Array = new Array (); Var myVector: Vector < String >. = New Vector. ≪ String >; //fylle dem på samme måte myArray.push ("dette", "er", "et", "Array"); myVector.push ("dette", "er", "et", "Vector"); //kaller elementer og lengde på samme måte trace (myArray [myArray.length - 1]); //Array trace (myVector [myVector.length - 1]); //Vector //Følgende skaper en feil - "Access muligens udefinert eiendom x gjennom en referanse med statiske typen String." trace (myVector [myVector.length - 1] x); //The Flash Player kaster MovieClip som en streng og en streng ikke har en "x" verdi.}
Var myVector < MovieClip >. = New Vector. ≪ MovieClip >;
Speed Test # 1 Array vs. Vector
pakken {//import importere flash.utils.getTimer.; import flash.display.MovieClip; public class Arrayvs.Vector strekker MovieClip {private Var currentTime: int = 0; //vi ønsker å lese og skrive inn i matrise og vektor 10.000.000 ganger. //dette vil gi en god indikasjon på hastighetsforskjellen //Ikke bekymre deg, det vil ikke krasje datamaskinen, men Flash Player vil ta en pause for ca 3 til 5 sekunder private Var n: int = 10000000 //Erklærer Array og Vector private Var myArray: Array = new Array (); private Var myVector. Vector < int > = New Vector. ≪ int >; offentlig funksjon Arrayvs.Vector () {//tid test for å skrive til matrise og vektor write (); trace ("----"); //tid test for å lese fra tabellen og vektor read (); } Private funksjon write (): void {trace ("Writing Times"); timeDifference //for n ganger, skyver jeg inn i array for (var i: int = 0; i < n; i ++) {myArray.push (i); } //Spore den tiden det tar trace ("Array:" + timeDifference + "ms"); //i n ganger skyver j i vektoren for (var j: int = 0; j < n; j ++) {myVector.push (j); } //Spore den tid det tar trace ("Vector:" + timeDifference + "ms"); } Private funksjon read (): void {var num: int = 0; spore ("Reading Times"); timeDifference //for n ganger, satt num til tilsvarende matrise verdi for (var i: int = 0; i < n; i ++) {num = myArray [i]; } //Spore den tiden det tar trace ("Array:" + timeDifference + "ms"); //for n ganger, satt num til tilsvarende vektor verdi for (var j: int = 0; j < n; j ++) {num = myVector [j]; } //Spore den tid det tar trace ("Vector:" + timeDifference + "ms"); } Private funksjon få timeDifference (): int {var totalPlayedTime: int = getTimer (); Var timeDifference: int = (totalPlayedTime - currentTime); currentTime = getTimer (); returnere timeDifference} private funksjons Arrayvs.VectorDifferences (): void {//delare rekken og vektoren, er dette den eneste forskjellen mellom de to Var myArray: Array = new Array (); Var myVector: Vector < String >. = New Vector. ≪ String >; //fylle dem på samme måte myArray.push ("dette", "er", "et", "Array"); myVector.push ("dette", "er", "et", "Vector"); //kaller elementer og lengde på samme måte trace (myArray [myArray.length - 1]); //Array trace (myVector [myVector.length - 1]); //Vector //skyve i en ikke-strengverdi myVector.push (ny MovieClip ()); //Følgende skaper en feil - ". Tilgang muligens udefinert eiendom x gjennom en referanse med statiske typen String" //trace (myVector [myVector.length - 1] x); //The Flash Player kaster MovieClip som en streng og en streng ikke har en "x" verdi. }}}
Array: 2073msVector: 1476ms ---- Reading TimesArray: 190msVector: 134ms
fra en Array vs. fra en Vector, og dette er heldigvis hva du trenger å gjøre mesteparten av tiden hver ramme.
Tips # 2 Arrangement Lyttere
Metode # 1 En List per Partikkel
privat funksjons createPages (): void {//opprette 10 websider for. (Var i: int = 0; i < 10; i ++) {//oppretter en ny webside som MovieClip Var nettside: MovieClip = new MovieClip (); //legger lytteren webpage.addEventListener (Event.ENTER_FRAME, onWebpageLoop); }} privat funksjon onWebpageLoop (evt: Hendelses): void {//alle nettsider kaller denne funksjonen hver ramme //evt.target er nettsiden} Metode # 2 En List å styre dem alle ...
< p> Den andre metoden er den som vi skal bruke, og den foretrukne metoden når du arbeider med en rekke lignende objekter. Ideen her er å feste en enkelt lytter til bare ett objekt - vanligvis scenen - som deretter looper gjennom hver av partiklene og forteller hver enkelt hva de skal gjøre på hver ramme. Denne metoden er litt mer komplisert som vi trenger noen måte å referere partiklene, så vi setter dem inn i en vektor. La oss ta en titt
privat funksjon createPages2 (): void {//opprette 10 websider for. (Var i: int = 0; i < 10; i ++) {//legge en MovieClip til webpagesHolder //redusere antall variabler og trinnene som brukes øker hastigheten webpagesHolder.push (ny MovieClip ()); } //Legge lytteren stage.addEventListener (Event.ENTER_FRAME, onStageLoop);} private funksjon onStageLoop (evt: Hendelses): void {//kalles bare én gang når scenen forandrer rammen for (var i: int = 0; i < 10; i ++) {//webpageHolder [i] er nettsiden}} Speed Test # 2 metoder ved å bruke hendelsen lyttere
Enorm økt hastighet
Mye lettere å referere til andre partikler fra partikler
Tips # 3 Bygg ditt Partikkel
pakke {//import importere flash.geom.Vector3D..; //merke til at klassen strekker ingenting fordi det ikke er behov public class Particle {//definere Vector3D objekter for å holde posisjons- og hastighetsverdier privat Var pos: Vector3D = new Vector3D (0, 0, 0); private Var VEL: Vector3D = new Vector3D (0, 0, 0); offentlig funksjon Particle (stageRect: rektangel) {} offentlig funksjon oppdateringen (): void {//oppdatere posisjonen i henhold til hastigheten i den retningen pos.x + = vel.x; pos.y + = vel.y; } //De getter metoder som skal brukes til å lese posisjonen til partikkelen offentlig funksjon get x (): Antall {return pos.x} offentlig funksjon får y (): Antall {return pos.y}}}
pakken {//import importere flash.sampler.getSize; import flash.display.MovieClip; public class BuildingYourParticle strekker MovieClip {offentlig funksjon BuildingYourParticle () {//simulere 100.000 av de respektive objekt Var n: int = 100000 //definere objektet Var p: Partikkel = ny partikkel (); Var m: MovieClip = new MovieClip (); //bruker getSize () metoden finner minne som brukes for n av m og s. Konvertere dem til megabyte format Var pSizeTotal: Number = (getSize (p) * n) /(1024 * 1024); Var mSizeTotal: Number = (getSize (m) * n) /(1024 * 1024); //spore de respektive størrelsene til to desimaler spore ("Particle Memory:" + pSizeTotal.toFixed (2) + "mb"); trace ("MovieClip Memory:" + mSizeTotal.toFixed (2) + "mb"); }}}
Particle Minne: 1.53mbMovieClip Minne: 40.05mb Speed Test # 3 Vår Particle vs. movieclips
pakke {//import importere flash.utils.getTimer.; import flash.display.MovieClip; public class ParticleSpeedTest strekker MovieClip {private Var n: int = 100000 privat Var currentTime: int = 0; //Erklærer respektive eiere private Var particleHolder. Vector < Particle > = New Vector. ≪ Particle >; private Var movieclipHolder: Vector < MovieClip >. = New Vector. ≪ MovieClip >; offentlig funksjon ParticleSpeedTest (): void {//tid test for å skrive en ny partikkel eller MovieClip write (); trace ("----"); //tid test for å lese fra en partikkel eller MovieClip lese (); } Private funksjon write (): void {trace ("Writing Times"); timeDifference //for n ganger, presse en ny partikkel i vektoren for (var i: int = 0; i < n; i ++) {particleHolder.push (ny partikkel ()); } //Spore den tiden det tar trace ("Particle:" + timeDifference + "ms"); //for n ganger presse en ny MovieClip i vektoren for (var j: int = 0; j < n; j ++) {movieclipHolder.push (ny MovieClip ()); } //Spore den tiden det tar trace ("MovieClip:" + timeDifference + "ms"); } Private funksjon read (): void {var num: int = 0; spore ("Reading Times"); timeDifference //for n ganger, satt num til tilsvarende partikkel s 'x' verdi for (var i: int = 0; i < n; i ++) {num = particleHolder [i] .x; } //Spore den tiden det tar trace ("Particle:" + timeDifference + "ms"); //for n ganger, satt num til tilsvarende MovieClip s 'x' verdi for (var j: int = 0; j < n; j ++) {num = movieclipHolder [j] .x; } //Spore den tiden det tar trace ("MovieClip:" + timeDifference + "ms"); } Private funksjon få timeDifference (): int {var totalPlayedTime: int = getTimer (); Var timeDifference: int = (totalPlayedTime - currentTime); currentTime = getTimer (); returnere timeDifference}}}
Writing TimesParticle: 334msMovieClip: 2096ms ---- Reading TimesParticle: 16msMovieClip: 22ms
Tips # 4 Introduksjon til punktgrafikk
Hva er de
The Bitmap klassen representerer visningsobjekter som representerer bitmap bilder
BitmapData klassen lar deg jobbe med data (piksler) av en Bitmap objekt
Tegning med punktgrafikk
offentlig funksjon SimpleCircle (): void {//definere sirkelens radius Var radius. Int = 30; //tegne en sirkel på vanlig måte. Legg merke til at du ikke legger til den formen som er å bli trukket til displayet liste Var circleShape: MovieClip = new MovieClip (); circleShape.graphics.beginFill (0x555555, 1); circleShape.graphics.drawCircle (radius, radius, radius); circleShape.graphics.endFill (); //skape bitmap og legge den til displayet liste Var BMD: BitmapData = new BitmapData (radius * 2, radius * 2, true); Var bm: Bitmap = new Bitmap (BMD); stage.addChild (bm); //tegne formen bmd.draw (circleShape);}
Den setPixel () Metode
pakke {//import importere flash.events.Event; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.MovieClip; public class SetPixelMethod strekker MovieClip {//definere variabler privat Var n: int = 50; private Var w: int; private Var h: int; private Var bm: Bitmap private Var BMD: BitmapData; offentlig funksjon SetPixelMethod (): void {w = stage.stageWidth; h = stage.stageHeight; //skape bitmap data bredden og høyden på scenen som ikke er gjennomsiktig og grå i fargen BMD = new BitmapData (w, h, falsk, 0x222222); bm = new Bitmap (BMD); addChild (bm); addEventListener (Event.ENTER_FRAME, onFrameLoop); } Private funksjon onFrameLoop (evt: Hendelses): void {for (var i: int = 0; i < n; i ++) {//tilfeldig plukke x, koordinater y for å sette den nye pixel farge Var px: int = Math .random () * bmd.width; Var py: int = Math.random () * bmd.height; //gi pixel en tilfeldig farge Var pc: uint = Math.random () * 0xFFFFFF; //setter pixel på (px, py) til den fargen bmd.setPixel (px, py, pc); }}}}
Låsen () og låse () metoder
offentlig funksjon LockUnlockMethods (): void {//Tegn en enkel sirkel, samme i skritt før denne Div radius: int = 30; Var circleShape: MovieClip = new MovieClip (); circleShape.graphics.beginFill (0x555555, 1); circleShape.graphics.drawCircle (radius, radius, radius); circleShape.graphics.endFill (); //skape bitmap /bitmapdata Var BMD: BitmapData = new BitmapData (radius * 2, radius * 2, true); Var bm: Bitmap = new Bitmap (BMD); stage.addChild (bm); //låse bitmap bmd.lock (); //trekke ressurser bmd.draw (circleShape); //låse opp og oppdater bitmap bmd.unlock ();}
Clearing Din Bitmap
pakken {//import importere flash.geom.Point; import flash.events.Event; import flash.geom.Rectangle; import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.MovieClip; import flash.filters.BlurFilter; public class ClearBitmap strekker MovieClip {//definere variabler privat Var n: int = 50; private Var w: int; private Var h: int; private Var bm: Bitmap private Var BMD: BitmapData; private Var clearRect: rektangel; offentlig funksjon ClearBitmap (): void {w = stage.stageWidth; h = stage.stageHeight; BMD = new BitmapData (w, h, falsk, 0x222222); bm = new Bitmap (BMD); addChild (bm); addEventListener (Event.ENTER_FRAME, onFrameLoop); //skape bitmap data bredden og høyden på scenen som ikke er gjennomsiktig og grå i fargen clearRect = new rektangel (0, 0, w, h); } Private funksjon onFrameLoop (evt: Hendelses): void {//bruker en av disse metodene for å tømme bitmap //bmd.fillRect(clearRect, 0x222222); bmd.applyFilter (BMD, bmd.rect, ny Point (0, 0), ny BlurFilter (1,1, 1,1, 2)); for (var i: int = 0; i < n; i ++) {var px: int = Math.random () * bmd.width; Var py: int = Math.random () * bmd.height; Var pc: uint = Math.random () * 0xFFFFFF; bmd.setPixel (px, py, pc); }}}}
Speed Test # 4 Bitmap Tegning vs. movieclips Tegning
pakken {//import importere flash.events.Event.; import flash.display.Bitmap; import flash.utils.getTimer; import flash.display.BitmapData; import flash.display.MovieClip; public class Bitmapvs.MovieClip strekker MovieClip {//definere variabler privat Var w: int; private Var h: int; Privat var r: int = 5; private Var n: int = 500; private Var currentTime: int = 0; private Var bm: Bitmap; private Var BMD: BitmapData; private Var bmShape: MovieClip = new MovieClip (); offentlig funksjon Bitmapvs.MovieClip (): void {w = stage.stageWidth; h = stage.stageHeight; BMD = new BitmapData (w, h, sant, 0); bm = new Bitmap (BMD); addChild (bm); addEventListener (Event.ENTER_FRAME, onFrameLoop); } Private funksjon onFrameLoop (evt: Hendelses): void {timeDifference; //bruker en av disse funksjonene på en gang //er dette en for å lage punkter ved hjelp av MovieClip metoden //createMovieClipCircles (); //dette er å lage punkter ved hjelp av bitmap metoden createBitmapCircles (); } Private funksjon createMovieClipCircles (): void {//dette vil skape en ny MovieClip for hver sirkel for (var i: int = 0; i < n; i ++) {var m: MovieClip = new MovieClip (); drawcircle (m); addChild (m); } //Spore fps trace (1000 /timeDifference); } Private funksjon createBitmapCircles (): void {//dette vil trekke i samme MovieClip på forskjellige steder over og over bmd.lock (); for (var j: int = 0; j < n; j ++) {drawcircle (bmShape); bmd.draw (bmShape); } Bmd.unlock (); //spore fps trace (1000 /timeDifference); } Private funksjon drawcircle (m: MovieClip): void {//skape den samme funksjonen for å tegne sirkler for både å holde det rettferdig og organisert m.graphics.clear (); m.graphics.beginFill (Math.random () * 0xFFFFFF); m.graphics.drawCircle (Math.random () * w, Math.random () * h, r); m.graphics.endFill (); } Private funksjon få timeDifference (): int {var totalPlayedTime: int = getTimer (); Var timeDifference: int = (totalPlayedTime - currentTime); currentTime = getTimer (); returnere timeDifference}}}
De createMovieClipCircles () -metoden stopper opp etter noen sekunder
De createBitmapCircles ( ) kan fortsette å kjøre hele dagen på 24/24 FPS og ikke bremse ned
Bygge System
pakken {//import - jo mindre jo bedre import flash.geom.Vector3D; import flash.geom.Rectangle; public class Particle {//definere posisjon og hastighet Vector3D objekter privat Var pos: Vector3D = new Vector3D (0,0); import flash.utils.getTimer; import flash.events.Event; import flash.utils.getTimer;