Rezolvarea problemei de performanță în bliț

Inițial, lucrul la jocul "Ciupercă" a mers repede și progresiv. Am fost foarte mulțumită de tehnologia de nobilime a lui Flash pentru ușurința în utilizare și a fost plină de optimism. Dar, mai târziu, am fost îngrozit să aflu că Flash nu reușește să dea numărul corect de cadre atunci când obiectele devin mai mult de o sută.







Și în joc ar trebui să existe o hartă cu dimensiunea celulelor de 20x20 și chiar și cu mai multe straturi. Adică obiectele de pe hartă într-un singur strat pot fi cu ușurință de până la 300 de bucăți. Și unele obiecte sunt, de asemenea, animate, ceea ce este și mai rău pentru performanță, deoarece animații precum Motion și Shape Tween sunt programabile. Și acest lucru înseamnă că fiecare cadru nu este doar redat, dar și o mulțime de calcule se fac în afara codului meu pentru a calcula cadrele intermediare în MovieClips. Și chiar și o redare șirefătoare în Flash, care redă doar secțiunile actualizate ale ecranului - nu salvează situația.

Aici - atunci optimismul meu este puțin decolorat. M-am supărat. Este o tehnologie minunată, cum ar fi Flash, potrivită doar pentru bannere și jocuri primitive!

Grafica grafică în sine este un lucru foarte complicat. Oricine este cel puțin familiarizat cu grafica vectorială, trebuie să înțeleagă perfect că toate curbele sunt calculate prin formule matematice complexe. Iar când vine vorba de animație, nu este nevoie doar de afișarea unei serii de puncte și de trasarea unor curbe între ele, dar și de a găsi poziții intermediare de curbe între cadrele cheie. Și astfel de calcule ar trebui să fie efectuate de cel puțin 25 de ori pe secundă pentru joc. Aceasta este, se dovedește că costul calculelor sunt maxime, iar rezultatul este foarte mediocru.

Rezultatul este cu siguranță acolo - să abandoneze utilizarea graficii vectoriale, traducând totul în grafica bitmap. Cu grafica raster, este cu siguranta mai usor pentru un calculator sa efectueze calcule si sa faca, deoarece este doar o gama de pixeli cu cele mai simple informatii. Prinde-mă pe acest gând, mi-a fost frică pentru un moment: "De aceea a plecat și, în cele din urmă, a venit". Și am început să-mi imaginez cum aș exporta toate acestea într-un raster, și apoi înapoi pentru a compila MovieClip cu imagini raster manual. Aici, toate avantajele principale ale graficii vectoriale: calitatea în orice dimensiune și spațiul minim pentru stocarea datelor - încep să se estompeze. Dar decizia ar trebui să fie definitivă.

În Flash există o opțiune specială «cache ca bitmap», care poate fi setat pentru clipuri individuale - acest lucru înseamnă că clema undeva în memorie este salvată ca bitmap și nu mai este recalculat ca imagine vectorială. Experimentele mele au arătat că acest lucru dă o creștere a productivității, dar pentru fericirea completă nu este suficientă. Motivul este cel mai probabil ca din când în când aceste clipuri "cache" să fie din nou actualizate, ceea ce poate duce la frânare. Și numărul de obiecte este în continuare același, ceea ce continuă să provoace probleme de performanță.

Pentru a admite, practic nu cunosc dispozitivul Flash intern, dar în cursul experimentelor practice sa dovedit că pentru aplicațiile Flash este mai rapid să procesați o imagine mai mare decât multe clipuri mici. De ce este așa, cred, dar nu voi descrie, din moment ce va fi plictisitor și plictisitor și poate mă înșel, în general, în presupunerile mele. Numai o astfel de imagine mare nu ar trebui să constea dintr-o masă de clipuri încorporate, ci dintr-un bitmap mare. Pur și simplu pune, în cazul în care jocul este planificat pentru mai multe obiecte diferite (clipuri), acestea ar trebui să fie împărțite în grupe (prim-plan, fundal, obiecte dinamice, și așa mai departe), apoi o dată toate „fac“, într-un mare bitmap utilizate ulterior ca fundal, și toate obiectele originale eliminate.







Rezolvarea problemei de performanță în bliț

Faceți o imagine raster din masa de clipuri pur și simplu. Noi compunem toate clipurile în ordine și ordine după cum este necesar și apoi, ca și cu o cameră foto, le facem o imagine a acestora în bitmap, care este apoi folosit ca un substrat sub forma unui nivel de joc. Detalii despre cum se face acest lucru sunt foarte bine spuse în exemplul-lecție de la Heath.

Acest lucru este cu siguranță mare și starea mea de spirit sa îmbunătățit deja, deoarece performanța nu este metodă viclean ar putea ridica aproape două. Dar problema nu este rezolvată complet, deoarece cota de productivitate a leului este încă consumată de "animație vector". Deja încep să se gândească la ce se întâmplă dacă ceva de genul la fel, dar sub forma de o serie de cadre individuale bitmap-uri salva de la MovieClip`ov, și apoi, la fel ca vremurile bune sunt afișate în locul potrivit cu cadrul din dreapta. Și nu am avut timp să digest acest gând până la capăt, deoarece am descoperit că această "bicicletă" este deja inventată înaintea mea, ci doar trebuie să ajusteze "pedalele" și "sidushka".

Mai simplu, găsesc mai multe clase care rezolvă complet problema animației vectoriale, transformând fiecare cadru al clipului specificat într-o serie de imagini raster. Și totul este implementat astfel încât, în cele din urmă, să ajungem descendentul filmului MovieClip și să lucrăm cu el ca în cazul filmului obișnuit, numai conținutul său fiind complet raster.

În prezent, clasa cu implementarea animației vectoriale de conversie într-un raster pentru AS3 poate fi descărcată aici. În arhiva sursă există un exemplu de utilizare a acesteia.

Lucru util AS3 Bitmap Cached Animații :) Mulțumesc.
Aș dori să menționez despre cache ca bitmap.
Astfel de obiecte sunt considerate într-adevăr foarte repede, dar există multe restricții privind utilizarea. Nu o utilizați dacă:
există o schimbare în conținutul filmului (animație internă), filmul va fi redesenat.
Filmul este rotit sau scalat, filmul va fi redesenat.
dacă imaginea cache este mare și vectorul din care este făcut este foarte simplu (va dura o grămadă de RAM pentru a reconstrui bitmap-ul).

Trebuie să experimentați cu animație :)

Apropo, focul are o temă în acest sens.
Și voi da un link către același site pe care l-ați dat doar acolo unde puteți vedea testul de funcționare a diferitelor tehnici.
1. uncached
2. memorate ca cadre
3. stocate pe foaia de sprite

Primele două sunt clare, dar a treia nu a înțeles. Dar arată viteza medie, pentru că probabil nu merită să se deranjeze.

var someArray: Array = Array nou ();
pentru (var i: int = 0; i .
scriem:
var someArray: Array = Array nou ();
var len: int = someArray.length;
pentru (var i: int = 0; i .

scrie:
someConditions. rezultat. rezultat

sau
i = i + 1; schimbați la i ++;

sau i = i + someVal; Schimbați la i + = someVal;

și așa mai departe. Cred că am înțeles :)))
)

@ Sasha, despre cache ca bitmap - care este opțiunea potrivită, casual pentru gospodine :) Prin caching grafică și animație bitmap-uri ar trebui, de asemenea, controlul manual cantitatea de memorie RAM utilizată, fără ca în vreun fel, în aceste cazuri. Și în cazul în care volumul de animații și grafica sunt foarte bune, poate doriți să cache doar un singur desen, ceea ce este necesar pentru nivelul actual, este de a economisi memorie și timpul de așteptare player-ul atunci când începe jocul;)

@VirtualMaestro, doar în acest exemplu, Hitry sugerează transformarea graficii în manual, din care apar imediat două probleme: timpul pentru conversie cu orice corecție și greutatea mare a unității flash.

Mărturisesc cu cache-ul pe spritesheet, de asemenea, nu am înțeles pe deplin. Dar mi sa părut că această metodă rupe fiecare cadru în plăci. De ce nu am înțeles asta. Din moment ce performanța de la această recepție este într-adevăr îndoielnică, eu personal nu m-am deranjat :)

În ceea ce privește optimizarea tehnică a codului, vă voi oferi cu plăcere câteva link-uri interesante despre cum să scrieți cel mai bine codul:
- Creșterea performanțelor aplicațiilor AS3
- Practici eficiente de programare
Desigur, trebuie avut în vedere că dacă tot codul este scris cu aceste tehnici luate în considerare, atunci nu este un fapt că, de fapt, va fi posibil să obțineți cel puțin 1-2 fps. Deoarece totul depinde de complexitatea aplicației și de jocurile / aplicațiile simple, astfel de trucuri nu pot da niciun efect. Pur și simplu urmează aceste tehnici de a-și aminti și de a folosi ca abordare standard în munca lor;)

Mulțumesc pentru linkurile, în special pentru cel de-al doilea (primul care a trecut :)), a învățat metode noi (m-am gândit că știu totul despre arrays :) naiv).
Bine cod de optimizare de lucru a scris Kris Kaspersky (nu există doar optimizarea lucrărilor sale nu este vorba despre Flash -. De mai jos pentru procesoare (AFM)) aminteau mai ales a lucra cu cicluri (matura miracole, etc.).
Ciclurile, mi se pare, sunt una dintre cele mai mari deficiențe ale tuturor aplicațiilor critice (și nu numai).

Dacă convertiți procesul de conversie ca o unitate flash, utilizatorul nu observă deloc nimic :)
În aproape toate jocurile, Nitrome a făcut așa :)







Articole similare

Trimiteți-le prietenilor: