În acest articol vreau să împărtășesc experiența mea în dezvoltarea unui joc mobil, deoarece sunt dezvoltator de Windows Phone, voi vorbi despre experiența mea cu acest sistem.
Memorie și texturi
Dacă ați dezvoltat deja jocuri pe mobil, răul principal nu este lipsa resurselor CPU / GPU, ci în lipsa de memorie. Este vorba despre memorie pe care ar trebui să o gândiți în primul rând în dezvoltarea mobilă. În Windows Phone 7, limitarea a fost de 100mb, Window Phone 8 sa îmbunătățit, dar nu prea mult:
Tabelul 1. Viteza de încărcare a imaginilor.
256 de texturi de 128 * 128
1 origine 2048 * 2048
1 origine 2048 * 2047
Pentru claritate, graficul dependenței diferitelor metode de încărcare la timp (Figura 1)
Figura 1. Graficul dependenței diferitelor metode de încărcare la timp.
Tabelul 2. Dimensiunile imaginii
Dimensiunea 256 texturi la 128 * 128
Textură dimensiune 2048 * 2048 fără compresie
Dimensiunea textului 2048 * 2048 cu compresie
După cum vedem din experimentele prezentate, compresia Dxt este foarte eficientă. Să o analizăm în detaliu.
Compresia DXT (cunoscută și sub numele de compresie S3) este de fapt foarte simplă. Iată cum funcționează:
- Imaginea este împărțită în blocuri de 4x4
- Pentru fiecare bloc, există două culori cele mai importante
- Cele două culori rezultate sunt stocate în 16 biți, în format RGB 5.6.5
- Pentru fiecare dintre cei 16 pixeli din bloc, este stocată o valoare pe 2 biți indicând cât de departe se află între cele două culori primare
Această schemă simplă se dovedește a funcționa surprinzător de bine pentru multe imagini din lumea reală.
Există cinci opțiuni pentru compresia DXT:
- DXT1 funcționează, așa cum am descris mai sus, plus câteva magie extra pentru codarea canalului alfa
- Culoarea DXT3 este codată, precum și DXT1, și stochează, de asemenea, 4 biți de valoare a canalului alfa în pixeli
- Culoarea DXT5 este codificată ca și DXT1, iar un circuit similar este folosit pentru a codifica un canal alfa
- DXT2 și DXT4 nu au fost o încercare foarte bine gândită a standardizării și nu a existat nimic de făcut. Trebuie să pretinzi că nu există
DXT1 utilizează 64 de biți pe un bloc 4 × 4. În comparație cu textura necomprimată pe 32 de biți, aceasta este o rată de compresie de 8 ori mai mare. DXT2-5 utilizează 128 biți într-un bloc 4 × 4 care oferă un raport de compresie de 4 ori.
Și acum vestea proastă: compresia DXT este compresia pierdute. Uneori pot fi foarte mari. De fapt, funcționează foarte bine pentru unele imagini și nu este deloc potrivit pentru alții.
Deci, atunci când doriți să utilizați compresie DXT pentru a spune de XNA, când setați proprietatea parametrului de format textură Texture DxtCompressed, Pipeline conținut selectează automat între DXT1 și DXT5, în funcție de faptul dacă canalul alpha textura. În cazul în care nu conține un canal alfa sau conține un canal alfa omogen va folosi DXT1, pentru a obține cel mai bun raport de compresie, dar dacă textura cuprinde valori fracționare canal alpha, se va alege DXT5 în schimb.
Să analizăm în detaliu fiecare dintre metodele de comprimare:
Să ne uităm la Figura 2 de mai jos:
Imaginea din stânga este originalul. Dreptul ilustrează comprimarea în format DXT1.
Figura 2. Exemplu de compresie Dxt1.
Imaginea comprimată vizual nu diferă de original, ceea ce face ca rezultatele comprimării să fie acceptabile pentru majoritatea utilizatorilor. Compresia, totuși, reduce semnificativ dimensiunea texturii.
În acest caz, de la 256 KB la 32 KB.
Cu toate acestea, totul nu este atât de roz cu această textură (Figura 3):
Figura 3. Exemplu de compresie Dxt1.
Principala problemă este apariția zgomotului în interiorul textului, precum și a unor benzi distincte pe fundalul gradientului.
Figura 4. Zgomote în interiorul textului.
Figura 5 arată cum comprimarea afectează culoarea. În stânga, vedeți 16 nuanțe de roșu, de la roșu pur la negru pur. În partea dreaptă, vedeți cele patru culori care sunt rezultatul compresiei DXT, din aceste 16 nuanțe.
Figura 5. Efectul compresiei asupra culorii.
Figura 6 arată ce se întâmplă atunci când diferite culori nu se află pe aceeași linie în spațiul de culoare. În acest caz, toate extremele paletei RGB (roșu, verde și albastru) au fost folosite. Evident, ca rezultat, culorile interpolate nu coincid cu originalele. De obicei, în zona de 4 × 4 pixeli nu există o selecție atât de largă de culori, dar arată că texturile cu culori diferite suferă mai mult.
Figura 6. Efectul compresiei asupra culorii.
Compresia DXT1 funcționează, de obicei, bine pentru texturi zgomotoase și nu este la fel de bună pentru imagini curate precum și pentru gradienți. Trucul este să îl folosești ori de câte ori este posibil și să nu îl folosești doar pe acele texturi în care artefactele de compresie sunt prea nedorite.
DXT5, diferă de formatul DXT3, prin faptul că stochează informații despre canalul alfa, similar cu modul în care se stochează informații despre culoare.
Pentru informații despre canalul alfa, acesta folosește o paletă similară cu modul în care se stochează informațiile digitale. Această paletă conține valoarea minimă și maximă a canalului alfa. Există două variante cu 6 și 4 puncte de referință.
Șase alte valori alfa sunt interpolate între acest minim și cel maxim. Astfel, aceasta permite o schimbare mai graduală a valorii alfa.
A doua opțiune face interpolarea numai pentru 4 alte valori ale canalului alfa între valorile minime și maxime, dar adaugă și valorile alfa 0 și 1 (pentru transparență totală și netransparență). Pentru unele texturi acest lucru poate da rezultate mai bune.
Figura 7. Exemplu de comprimare Dxt5.
După cum puteți vedea, marginile nu sunt foarte bine prelucrate în unele părți.
Figura 8. Margini marcate când se folosește compresia Dxt5.
Dimensiunea texturii a scăzut de la 256 KB la 64 KB.
Pierderile de calitate pe imaginile reale nu sunt atât de semnificative și pot fi neglijate pentru majoritatea imaginilor.
Utilizarea compresiei Dxt permite:
- Reduceți dimensiunea pachetului de instalare
- Reduceți utilizarea RAM
- Creșteți viteza de redare a imaginilor
În proiectul său, după ce a creat o textură atlas, am obține de ieșire .jpg / .png / .bmp și descrierea satin în .xml / .txt / .json. Din moment ce eu sunt, folosind XNA de compresie / Monogame în .xnb Eu folosesc XNA 4.0 Conținutul de compilatoare ca un întreg este foarte clar și soluție ușor de compresie DXT are nevoie doar pentru a termina în ContentBuilder'e o altă proprietate la crearea buildProject: