ефективно оказване геометрия технологии

В тази статия ще се опитам да светне такова банално, може би, на въпроса как изходната геометрията. Въпреки това, независимо от нейната "простота", форума е все още често се повдига въпроси като това, което е по-добре, VBO или CVA / VAR, как най-добре да се покаже геометрия - ленти или триъгълник списъци, за да се оптимизира кеш паметта, която индекси ushort или uint са по-бързи е възможно да се използват целочислени типове данни за върхове / нормали / teks.koordinat, както и много други подобни въпроси. На всички тези въпроси, както и някои други, и аз ще се опитам да отговоря в тази статия.

Е, първите няколко въпроси ще отговорят веднага, без обяснение и доказателства. Мисля, че трябва да се приема като аксиома. Що се отнася до първото, разбира се, VBO. И по-добре за съхранение на данни само в режим GL_STATIC_DRAW (защо -. Виж по-долу). Що се отнася до втория, по-добри триъгълник ленти, така че изродени триъгълници не дават дузпа при скорости до надхвърляйки целевите 2 индекс делта, но можете да се запишете на честотната лента, това е едно нещо, което да премине три, да кажем, 32-битов индекс в триъгълника или само един индекс (въпреки че и триъгълни списъци могат да бъдат полезни, например, за извеждане на растителност, т.е., в такива случаи, когато геометрията слабо представени непрекъснати ленти TR-позиция, но практиката показва, че лентите имат четири 8 (16 TR-Ing) добавя с двойка дегенеративен триъгълници между всеки Q тази лента не само губят и дори надмине триъгълника изброява изпълнение). Останалите проблеми са обсъдени по-долу.

Също така казват, че няколко думи за заглавието на статията. И въпреки, че не се споменава OpenGL, всичко тук ще се разглежда във връзка с това GAPI. Разбира се, съветите в тази статия, не са подходящи само за OpenGL, но аз избрах този GAPI, като е по-лесно да се разбере примери във връзка с това са по-често тези въпроси (особено първата, тъй като всяко удължаване за показване на примитиви има достатъчно), добре, само защото аз не знам D3D :-).

Сега обратно към въпроса за VBO. Защо го направи сам, и защо само статична геометрия. Ще започна отдалеч.

2,2 пъти, и графики - в

3.3 по време на същия период. "

Какво е динамичен VBO буфера се актуализира всеки кадър?

1. Обработката в процесора върховете (по избор по принцип).

Е, всяка програма е приключила, обръщане на подпората, но основната част на статията. Много вероятно сте чували / използва glBegin / glEnd. Ако целта ви - най-ефективното предоставяне, а след това да забрави за тях! За dysplay списъци толкова сигурна! Аз не говоря за пост-обработка, например. с един четириядрен на цял екран или бутони интерфейс - прави каквото искаш. Всички посочени по-долу (и по-горе) се отнася само за времето критична оказване, CPU-ограничена, връх процесор, ограничена или трафик ограничени (да кажем веднага, ако някой не знае, модерна 3D-приложения обикновено са на процесора или fillrate ограничена, така че първо се уверете, че приложението ви е не-fillrate оградена, зададен като в противен случай по-долу оптимизация просто ненужно).

Така че първото нещо, което трябва - той има какво да се хранят vidyuhi триъгълници, че тя ги поглъщат възможно най-бързо. С оглед на изложеното по-горе, трябва да има:

1. Сключване на възможно най-голям брой триъгълници на партида (тук, аз няма да се спре това - всичко това на снимките се обяснява ясно в посочените по-горе "Партида, партида, партида").

2. VBO, GL_STATIC_DRAW (може GL_DYNAMIC_DRAW, ако геометрията променя рядко).

3. триъгълник ленти.

4. Предварително TNL оптимизация.

5. След TNL оптимизация.

Веднага отивам да практикува, ще дам няколко обяснения за начинаещи. Ако някой не знае:

Бъч - обадете glDrawElements / glDrawArrays (DrawIndexedPrimitive в D3D), с други думи, на единица продукция геометрия (по-подробно тази концепция се счита, че сега времената нататък се нарича "Партида, Batch, Партида", въпреки че мнозина все още спорят за това дали да се обсъжда промяна членка на Бъч, колко от тези промени могат да бъдат в една Бъч, glDrawElements предизвикателство с предварително промяна членка - е една партида или две, и т.н., и т.н. като цяло се счита, че партидата - абстрактно понятие (бих казал дори философски: -)), което показва определен набор от определени функции пряко или непряко свързване свързани с оказване на геометрия :-)-кратък важно да запомните едно - от техните (партиди) по-малко - толкова по-добре);

Триъгълник ленти, в действителност, - геометрия, изтеглени от GL_TRIANGLE_STRIP, обяснението в описанието;

Предварително TNL оптимизация - оптимизация Предварително TNL кеш, който съхранява нетрансформираното връх. Е, съответно, но кеша на Post-TNL съхранява трансформира връх. Трансформация - концепцията е леко остаряла, а сега тя е в резултат на не само позицията на върха в координатите на прозореца и цвета, като се вземат предвид осветлението, но и за всеки изход на Shader на връх (всички различни променливи в частност). Съответно, в кеш магазини Предварително TNL всякакви атрибути на върха (позицията координати на текста може нормално и т.н.) и след TNL а - резултат обработка във върховете на тези атрибути. шейдъри.

Така че аз ще започна от края, т.е. за подготовка на данни (индекси и върхове) за буфери VBO обмислят Предварително TNL и следприватизационен TNL оптимизации. Тук ние ще се съсредоточи само върху предоставянето на редовна мрежа (за необходимото произволна геометрия да се коригира това дори разделено на ивици, това не се счита тук - има много безплатни библиотеки по този въпрос и на информация на този сайт е тук например.). Да започваме.

С предварително TNL по принцип всичко е ясно - на върха трябва да бъдат разположени по такъв начин, че да мине по всички показатели връх процесор ги поиска строго в реда, в който се появи в паметта. Страшен ако един възел ще се дублира няколко пъти - паметта ще отнеме малко по-иначе. Затова Предварително TNL трябва да върви след оптимизация на Post-TNL, като това е последният и определя реда на индексите.

Нека A, B, C, D - първата лента и Е, F, G, Н - втората. Strip резултат на тяхното свързване - А, В, С, D, D, Е, Е, F, G, Н. Дегенеративна TR-ки: (С, D, D), (D, Е, D), (D, Е, Е), (Е, F, E).

На тази очевидни неща, да се сложи край, и да отида, в действителност, на принципа на изграждане на списък от показатели, оптимизиран за Post-TNL кеш.

В тази статия ще разгледаме най-ефективни (което знам :-)) оптимизиране на кеш паметта, която нарекох DECU Tech - Удвояване Ефективност на Cache Употреба Техника, тук става дума за пост-TNL кеша, разбира се. Какво е значението му. Ние приемаме, че кеша на Post-TNL работи при стриктно спазване на принципа на FIFO, т.е. редят на опашки. Да разгледаме следната ситуация:

ефективно оказване геометрия технологии

за редовни индекси мрежата започват в долния ляв ъгъл и си отиват по вертикални ивици. Нека след TNL кеш е с размер от 8 върхове. Показва се геометрията на лентата (. 107.101.108.102.109.103.110.104.). Да предположим, че GPU достигнал до топ 108 и топ 100-107 някак си вече в кеша на Post-TNL и се поставя в него строго във възходящ ред (кеш - FIFO, се добавят нови върхове, за да края на кеш-линия, т.е. . 107, след като в началото и отстранява стари - на първо място е намалял от кеша на връх 100). Чертеж TR-к (107,101,108). Първите две върхове (107 и 101) идват от кеша. 108 години от кеша на върха не е - има операция за добавяне на нов възел на кеш паметта - добавя се 108 години от върха до края на опашката, и на 100-е отстранен от самото начало. Допълнително внимание на ТР (101102108). Всички върхове в кеша, следователно, всяка операция не се получават с кеша. Чертеж TR-к (108,102,109). Първите две върхове (108 и 102) са взели от кеша, а 109 се добавя към кеша в крайна сметка, и в същото време (!) Сто и първият кеш връх е изтрита (както можете да видите, сто и първия връх от нас на и не е необходимо). Ако мислите продължават да продължи, той ще бъде видим за една интересна картина - кеша е винаги в точния момент се отстранява само на върха, която се използва в предишния триъгълник и вече не са необходими. Какво прави този подход? Очевидно е, че ефективността на увеличението на кеш почти наполовина, тъй като на кеш не е необходимо да се съхранява на снимачната площадка на върха в средата, към които се обръща повече няма - кеша на контролера не знае, че на върха в средата на редицата, кеша вече се използва, няма да се повтори, а на върха в началото (за отстраняване на кандидата) - скоро може да бъде необходимо. Не е ясно за какво става дума? Ще се опитам да обясня нагледен пример.

Ляв - индекси в реда на DECU Tech, прав - доста на обща процедура за индекса, когато странна жилка на сметка постановено в една посока, а дори (например от ляво на дясно.) - в другата (отдясно наляво). Както се вижда, в първия случай, размерът на кеш паметта, която не трябва да се преизчисли и да е двоен връх, е 5, а вторият - 9, т.е. съблича същата дължина в първия случай се изисква почти два пъти по-малък обем Post-TNL кеш. (Всъщност, в този пример, има и уловка. И дори не един :-), но основната идея отразява истинската примера).

Въпреки това, докато неговата ефективност, тази техника има много недостатъци: твърда привързаност към размера на кеша архитектура специфичните (ако поне един връх не се намира в кеша, той генерира поредица от кеш пропуска, тогава ние трябва винаги да "реорганизира" Индекси на архитектурата, на която е започнало прилагането или винаги използвайте индекса на структурата на архитектурата с най-малкия размер на кеша), сложността на алгоритъма за адаптация за нередовни мрежи (аз няма да се спирам на това, обаче, и така е очевидно, че сегашните начини за генериране UU ленти като NVTriStrip, Tristripper не е подходящ за генериране на ленти на базата на произволни мрежи с оптимизацията на кеша).