Libgdx spritebatch, regiuni de textură și sprite

Desenarea imaginilor

De foarte multe ori textura este desenată cu o cartografiere pe o geometrie dreptunghiulară. De asemenea, foarte des, de multe ori se face desenul aceleiași texturi sau diferitele lor regiuni. Nu ar fi eficient să trimiteți un dreptunghi de fiecare dată către procesorul grafic pentru redare. În schimb, o mulțime de dreptunghiuri de aceeași textura, puteți descrie și trimite tot timpul procesorului grafic. Aceasta este ceea ce face clasa SpriteBatch.

Clasa SpriteBatch oferă coordonatele texturii pentru fiecare desen un dreptunghi. El face o colecție de geometrie, fără ao transfera procesorul grafic. Dacă el devine textura este diferită de ultima, atunci el leagă ultima textura, trimiterea geometriei asamblate pentru desen, și începe să culeagă o nouă textură la geometrie.

Fiecare schimbare a texturii atunci când desenați mai multe dreptunghiuri conduce la faptul că SpriteBatch grupează o mulțime de geometrie. De asemenea, legarea texturii este o operație destul de costisitoare. Din aceste motive, stochează multe imagini mici într-o singură imagine mare și apoi desenează regiuni dintr-o imagine mare pentru gruparea geometrică maximă și pentru a împiedica modificările frecvente ale texturii. Pentru mai multe informații, consultați TexturePacker.

SpriteBatch

Utilizarea programului SpriteBatch în aplicație arată astfel:

Toate apelurile de desen SpriteBatch trebuie făcute între metodele begin () și end (). Desenarea care nu aparține SpriteBatch nu poate fi între metodele begin () și end ().

Clasa Texture decodează fișierul imagine și îl încarcă în memoria GPU. Fișierul imagine trebuie să se afle în directorul de materiale, așa cum este descris în configurația manuală a proiectului. Dimensiunea imaginii ar trebui să fie o putere de două (16x16, 64x256 și așa mai departe).

Textura creată este transferată în SpriteBatch pentru redare. Textura va fi desenată într-un dreptunghi cu o poziție de 10.10 și o lățime și înălțime de diferite dimensiuni ale texturii. SpriteBatch are multe metode pentru desenarea texturilor:

Metode și descriere

(Textură textura, float x, float y)

Desenează o textură folosind lățimea și înălțimea texturii.

desena (Texture textura, float x, float y, int srcX, int srcY, int srcWidth, int srcHeight)

Desenează o bucată de textură.

desena (Texture textura, float x, float y, latime float, inaltime float, int srcX, int srcY, int srcWidth, int srcHeight, flipX boolean, flipY boolean)

Desenează o parte din textură, o întinde la lățimea lățimii și înălțimea înălțimii. cu posibilitatea de a se întoarce.

remiză (Texture textura, float x, float y, float originX, float originY, latime float, inaltime float, float scaleX, float scaleY, rotatie float, int srcX, int srcY, int srcWidth, int srcHeight, flipX boolean, flipY boolean)

Această metodă atrage o parte din textură, o întinde la lățimea lățimii și înălțimea înălțimii. Cântarează și se rotește în jurul originalului cu capacitatea de a răsturna.

(textură textura, float x, float y, lățimea flotorului, înălțimea flotorului, float u, float v, float u2, float v2)

Această metodă atrage o parte din textură, o întinde la lățimea lățimii și înălțimea înălțimii. Aceasta este o metodă oarecum avansată, deoarece folosește coordonatele de textură de la 0 la 1, în loc de coordonatele pixelilor.

(Textura textura, float [] spriteVertices, int offset, lungime int)

Aceasta este o metodă avansată pentru transferarea geometriei coordonatelor de textură și a informațiilor de culoare. Această metodă poate fi utilizată pentru a desena orice patrulater, nu doar dreptunghiuri.

TextureRegion

Clasa TextureRegion descrie un dreptunghi în interiorul texturii și este util atunci când desenați doar o parte din textură.

Aici, 20, 20, 50, 50 descriu o parte a texturii care este desenată în mod vizibil ca 10,10. Același lucru poate fi obținut prin transferarea texturii și a altor parametri către SpriteBatch. dar TextureRegion o face mai convenabil, având doar un obiect care descrie ambele.

Clasa SpriteBatch are multe metode pentru a desena regiunile de textura.

Metode și descriere

trageți (regiunea TextureRegion, float x, float y)

Desenează o regiune folosind lățimea și înălțimea regiunii.

tragere (Regiunea TextureRegion, float x, float y, lățimea flotorului, înălțimea flotorului)

Desenează o regiune, care se întinde la lățime și înălțime înălțime.

trage (regiune TextureRegion, float x, float y, float originX, float originY, latime float, inaltime float, float scaleX, float scaleY, rotatie float)

Desenează o regiune, care se întinde la lățime și înălțime înălțime. se scade și se rotește în jurul originalului.

Clasa Sprite este o regiune de textura și geometrie, unde va fi desenată și colorată pentru desen.

Aici, 20, 20, 50, 50 descriu o parte din textura care este rotită la 45 de grade și trasă în poziția 10,10. Același lucru se poate realiza prin trecerea texturii sau texturii și altor parametri în SpriteBatch. dar clasa Sprite o face mai convenabil, având un obiect care descrie totul. În plus, deoarece Sprite conține geometria și o recalculează numai atunci când este necesar, este puțin mai eficient dacă scala, rotația sau alte proprietăți rămân neschimbate între cadre.

Rețineți că Sprite amestecă informații despre model (poziție, unghi și așa mai departe) cu informații despre formă (textură pentru desen). Acest lucru face Sprite irelevant atunci când aplicați un model de design care separă strict modelul de vizualizare. În acest caz, utilizarea Texture and TextureRegion poate avea mai multă sens.

tonifiere

Atunci când o textura este desenată, ea poate fi tonată cu o anumită culoare.

Acest cod arată cum să desenezi o textură, o regiune și o sprite cu o nuanță. Valorile culorii sunt descrise folosind formatul RGBA, cu o valoare cuprinsă între 0 și 1. Valoarea alfa este ignorată atunci când amestecul este oprit.

amestecare

Amestecarea este activată implicit. Acest lucru înseamnă că, atunci când o textură este desenată, zonele semi-transparente ale texturii sunt combinate cu pixelii deja pe ecran.

Atunci când amestecarea este dezactivată, tot ceea ce se află pe ecran în acest loc este înlocuit cu o textură. Acest lucru este mai eficient, deci amestecarea ar trebui să fie oprită dacă nu este necesară. De exemplu, atunci când o imagine de fundal mare este desenată pe întreg ecranul, performanța poate fi obținută prin oprirea mixării:

Notă: asigurați-vă că ecranul este șters de fiecare dată. Dacă acest lucru nu este realizat, textura cu canalul alfa poate fi desenată peste o sută de ori, făcând-o aparent opacă. În plus, unele arhitecturi GPU funcționează mai bine atunci când ecranul este șters la fiecare cadru, chiar dacă imaginile opace sunt desenate pe ecranul complet.

Reglarea performanței

Clasa SpriteBatch are un constructor care stabilește numărul maxim de sprites care pot fi plasate în tampon înaintea dornului către GPU. Dacă numărul este prea mic, acest lucru va duce la apeluri suplimentare către GPU. Dacă este prea mare, SpriteBatch va folosi mai multă memorie decât este necesar.

SpriteBatch are un câmp public numit maxSpritesInBatch. Acest câmp indică cel mai mare număr de sprite, atribuite imediat GPU-ului, pe toată durata de viață a SpriteBatch. Setarea unei dimensiuni foarte mari a SpriteBatch și apoi verificarea acestui câmp vă poate ajuta să determinați dimensiunea optimă pentru SpriteBatch. Ar trebui să aveți o dimensiune egală sau puțin mai mare decât maxSpritesInBatch. Acest câmp poate fi setat la zero sau resetat în orice moment.

SpriteBatch are un câmp public numit renderCalls. După apelarea metodei end (), acest câmp indică de câte ori grupul de geometrie a fost transferat GPU între ultimele apeluri begin () și end (). Acest lucru se întâmplă atunci când o altă textura trebuie legată sau când SpriteBatch are suficiente sprite în memoria cache și devine complet populată. În consecință, dacă dimensiunea este schimbată pentru SpriteBatch și renderCalls este de mare importanță (poate mai mult de 15-20), atunci acest lucru indică faptul că există mai multe cartografiere texturi.

SpriteBatch are un constructor suplimentar care ia dimensiunea și numărul de tampoane. Aceasta este o caracteristică suplimentară care vă permite să utilizați VBO. și nu o matrice obișnuită de vârfuri. Astfel, există o listă de tampoane și de fiecare dată când este apelată vizualizarea, se folosește tamponul următor din listă (schimbând într-un cerc). Când valoarea maxSpritesInBatch este mare și renderCalls este mică, acest lucru poate da un impuls mic de performanță.