făcând în mod eficient tehnologia geometriei

In acest articol voi încerca pentru a ilumina o astfel de banală, probabil, problema modului în care geometria de ieșire. Cu toate acestea, în ciuda ei „simplitate“, forum este încă ridică adesea întrebări, cum ar fi, ceea ce este mai bine, VBO sau CVA / VAR, cel mai bun mod de a afișa geometrie - benzi sau triunghi listează pentru a optimiza memoria cache, care indexează ushort sau uint sunt mai rapide este posibil să se utilizeze tipuri de date întregi pentru noduri / normalele / teks.koordinat, precum și o mulțime de întrebări similare. La toate aceste aspecte, precum și altele, și voi încerca să răspund în acest articol.

Ei bine, primele câteva întrebări să-ți răspund imediat, fără explicații și dovezi. Cred că ar trebui să fie luate ca o axiomă. În ceea ce privește prima, desigur, Vbo. Și mai bine pentru a stoca date numai în modul GL_STATIC_DRAW (de ce -. Vezi mai jos). În ceea ce privește al doilea, benzi mai bune triunghi, astfel încât triunghiuri degenerate nu dau o penalizare la viteze de până la depășirea țintei de 2 indice de delta, dar puteți salva pe lățime de bandă, acesta este un lucru să treacă trei, spun indicele de 32 de biți în triunghiul sau doar un singur index (deși și liste de triunghi pot fi utile, de exemplu, la ieșirea vegetației, adică, în astfel de cazuri când geometria reprezentate slab fâșii continue tr-ing, dar practica arată că benzile au un quad 8 (16 tr-ing), introdus cu o pereche de degenerat triunghiuri între fiecare Q această bandă nu pierde numai, și chiar depăși triunghiul listele de performanță). Problemele rămase sunt discutate mai jos.

De asemenea, spun câteva cuvinte despre titlul articolului. Și, deși nu este menționat OpenGL, totul aici vor fi luate în considerare în legătură cu acest GAPI. Desigur, sfaturile din acest articol nu sunt potrivite numai pentru OpenGL, dar am ales acest GAPI, ca este mai ușor de înțeles exemple în legătură cu acesta sunt mai frecvente la aceste întrebări (în special prima, deoarece orice extindere a afișa primitivele există suficient), ei bine, pur și simplu pentru că nu știu D3D :-).

Acum, înapoi la problema Vbo. De ce face acest lucru singur, și de ce doar o geometrie statica. Voi începe de departe.

De 2,2 ori, și grafică - în

3.3 în aceeași perioadă. "

Care este tamponul dinamic VBO este actualizat la fiecare cadru?

1. Prelucrarea în nodurile procesor (opțional în principiu).

Ei bine, orice program sa încheiat, la rândul său a propunerii, dar partea principală a articolului. Mulți au auzit, probabil / folosit glBegin / glEnd. În cazul în care obiectivul dvs. - cel mai eficient de redare, apoi uita de ele! Despre dysplay-liste prea sigur! Nu vorbesc despre post-procesare, de exemplu. cu un quad la ecran sau butoanele de interfață completă - face după cum doriți. Toate prezentate mai jos (și de mai sus), se aplică numai la redarea de timp critic,, procesor nod delimitat sau lățime de bandă limitată (să zicem, la o dată, dacă cineva nu știe mărginit-CPU, modern, 3D-aplicații sunt, de obicei CPU sau rata de completare delimitate, astfel încât asigurați-vă că că aplicația nu este delimitată-o rată de completare, altfel prezentate mai jos optimizare pur și simplu inutile).

Deci, primul lucru de care avem nevoie - ea are ceva să se hrănească vidyuhi triunghiuri pe care ea le-a înghițit cât mai repede posibil. Având în vedere cele de mai sus, trebuie să existe:

1. Încheierea cel mai mare număr posibil de triunghiuri pe lot (aici, nu se va opri acest lucru - toate acestea în imagini este explicat în mod clar în cele de mai sus menționat „Lot, lot, lot“).

2. VBO, GL_STATIC_DRAW (poate GL_DYNAMIC_DRAW, dacă geometria schimbă rar).

3. benzi de triunghi.

4. Optimizarea pre-TNL.

5. Optimizarea post-TNL.

De îndată mă duc să practice, voi da câteva explicații pentru începători. Dacă cineva nu știe:

Butch - apel glDrawElements / glDrawArrays (DrawIndexedPrimitive în D3D), cu alte cuvinte, o unitate de geometrie de ieșire (mai în detaliu acest concept este considerat acum că timpurile se face referire aici „Lot, Lot, Lot“, deși mulți sunt încă argumentând cu privire la posibilitatea de a lua în considerare schimbarea de stat de Butch, cât de multe dintre aceste modificări pot fi într-o singură Butch, glDrawElements provocare cu statul de pre-schimbare - este un lot sau doi, etc, etc este considerat, în general, că lotul - un concept abstract (aș spune chiar filosofic: -)), ceea ce indică un anumit set de anumite funcții, direct sau indirect, legarea asociată cu o geometrie de redare :-) mai scurt important să ne amintim unul - decât lor (loturi) mai puțin - cu atât mai bine);

benzi triunghi, de fapt, - geometria, retrase din GL_TRIANGLE_STRIP, explicația în caietul de sarcini;

Optimizarea pre-TNL - optimizarea cache pre-TNL, care stochează vârful netransformat. Ei bine, respectiv, dar cache-ul post-tnl stochează vârful transformat. Transformare - conceptul este ușor învechit, iar acum este rezultatul nu numai poziția de sus în coordonatele ferestrelor și culoare, ținând cont de iluminat, dar, de asemenea, la orice ieșire din vertex shader (toate variabilele diferite, în special). Prin urmare, în magazinele de cache pre-tnl tot felul de atribute de noduri (coordonatele poziției textului normale poate etc.) și un post-tnl - rezultat de procesare la nodurile acestor atribute. shader.

Așa că voi începe de la sfârșitul anului, și anume, de preparare a datelor (indici și vârfuri) pentru tampoane Vbo considerând pre-tnl și post-tnl optimizări. Aici ne vom concentra doar pe redarea unei rețele regulate (este necesară o geometrie arbitrară a corecta chiar împărțit în fâșii, acest lucru nu este considerat aici - există multe biblioteci gratuite pe subiect și a informațiilor de pe acest site este aici, de exemplu.). Să începem.

Cu pre-TNL, în principiu, totul este clar - partea de sus ar trebui să fie aranjate în așa fel încât să treacă peste toți indicii procesor vârf le solicită strict în ordinea în care apar în memorie. Scary în cazul în care un nod va fi duplicată de mai multe ori - memoria va dura un pic, oricum. Prin urmare, pre-tnl ar trebui să meargă după optimizarea post-TNL, ca este acesta din urmă și determină ordinea indicilor.

Fie A, B, C, D - prima bandă, și E, F, G, H - al doilea. Rezultatul Strip legăturii lor - A, B, C, D, D, E, E, F, G, H. Degenerate tr-ki: (C, D, D), (D, E, D), (D, E, E), (E, F, E).

Pe aceste lucruri evidente ajuns la capăt, și mă duc, de fapt, principiul de construire a unei liste de indici, optimizat pentru post-cache TNL.

In acest articol voi discuta despre cele mai eficiente (pe care eu știu :-)) optimiza memoria cache, pe care am numit DECU Tech - Dublarea Eficacitatea Tehnica Cache Usage, aici vorbim despre Post-Cache TNL, desigur. Care este esența ei. Presupunem că cache-ul post-tnl funcționează strict în conformitate cu principiul FIFO, și anume, coadă. Luați în considerare următoarea situație:

făcând în mod eficient tehnologia geometriei

pentru indicii de grila începe de la stânga jos și du-te de-a lungul dungile verticale. Lăsați post-TNL cache are o dimensiune de 8 noduri. Este afișată geometria Strip (. 107.101.108.102.109.103.110.104.). Să presupunem că unitatea de procesare vizuală a ajuns în top 108 și top 100-107 într-un fel deja în cache-ul post-tnl și plasate în ea strict în ordine crescătoare (cache - FIFO, noi noduri sunt adăugate la sfârșitul cache-line, și anume, . 107 după partea de sus și îndepărtat vechi - în primul rând, este scăzut din vârf cache 100). Desen tr-k (107101108). Primele două vârfuri (107 și 101) provin din cache. cache-nod nu este 108th - există o operație de adăugare a unui nou nod la cache - vârf 108th este adăugat la sfârșitul cozii de așteptare, iar 100-lea este îndepărtat de la început. În continuare trase mp-to (101,102,108). Toate nodurile din cache-ul, prin urmare, orice operațiune nu este efectuată cu cache. Desen tr-k (108102109). Primele două vârfuri (108 și 102) au luat din memoria cache, și se adaugă 109th la cache-ul în cele din urmă, și în același timp (!) O sută primul cache vârf se elimină (după cum se poate vedea, o sută primul vârf de noi și nici nu au nevoie). Dacă gândurile continuă să meargă mai departe, va fi vizibil pentru o imagine interesantă - cache-ul este întotdeauna la momentul potrivit este îndepărtat numai în partea de sus, care a fost folosit în triunghiul anterior și nu mai sunt necesare. Ce face o astfel de abordare? Evident, eficiența crește cache cu aproape jumătate de la cache-ul nu are nevoie pentru a stoca setul de noduri pe mijloc, la care se face apel nu va mai - controlerul cache nu știe că vârful în mijlocul gama, cache-ul este deja utilizat nu va fi repetată, iar vârful la început (pentru a elimina candidatul) - poate fi necesară în curând. Nu este clar despre ce era vorba? Voi încerca să explic exemplu ilustrativ.

Stânga - indici în ordinea DECU Tech, dreapta - destul de o procedură comună pentru indicele atunci când o dungă impar de cont redat într-o singură direcție, și chiar (de exemplu, de la stânga la dreapta.) - în cealaltă (dreapta la stânga). După cum se poate observa, în primul caz, dimensiunea cache, care nu trebuie să recalculeze un top dublu, este 5, iar al doilea - 9, adică benzi aceeași lungime, în primul caz, necesită aproape de două ori mai mic volum de post-cache TNL. (De fapt, în acest exemplu, există o captură. Și nici măcar unul :-), dar ideea de bază reflectă adevăratul exemplu).

Cu toate acestea, în timp ce eficacitatea sa, această tehnică are multe dezavantaje: atașament rigid la dimensiunea memoriei cache arhitectura specifică (în cazul în care cel puțin un nod care nu se află în cache-ul, acesta generează o serie de ratări cache, atunci trebuie să ne întotdeauna „remodeleze“ Indicii pentru arhitectura pe care este pornit aplicația sau de a folosi întotdeauna structura indicelui a arhitecturii cu cea mai mică dimensiune cache), complexitatea algoritmului de adaptare pentru rețelele neregulate (nu voi locui pe el, cu toate acestea, și așa este evident că mijloacele generatoare de curent uu cum ar fi benzi de NVTriStrip, Tristripper nu sunt adecvate pentru generarea de benzi pe bază de ochiuri arbitrare, cu optimizarea cache).