CAD modely - Jak na výkonnostní optimalizaci a její automatizaci?

CAD modely - Jak na výkonnostní optimalizaci a její automatizaci? Tagy: Vývoj aplikací
| Publikováno dne

Zkratka CAD vychází z anglického Computer-Aided Design, v doslovném překladu "počítačem podporované projektování", nebo lidsky, využití počítače ke konstrukčním a designovým pracím. Obecně lze tedy nazvat jakýkoli grafický 3D model CAD modelem, a jakýkoli 3D editor CAD softwarem.

Jedním z prvních a doposud nejvyužívanějších CAD nástrojů mezi profesionály je program AutoCAD od neméně významné společnosti Autodesk. Od vydání prvního Autocadu v roce 1982 daná společnosti doručila hned desítky dalších profesionálních konstrukčních a designérských CAD nástrojů určených pro nejrůznější odvětví, zejména pak strojírenství, stavebnictví, architekturu a design. Z modernějších bych zmínil nástroje pro animace, speciální efekty nebo fotogrammetrii.

Otázkou tedy není, kdy se s CAD modely při vývoji aplikací pro virtuální realitu setkáte, ale zda s nimi pracujete co nejefektivněji. Bez ohledu na to, zda používáte profesionální software od Autodesku, nebo raději preferujete levnější alternativu, daný software je často designován pro specifický účel - modelování ve vysoké přesnosti rozměrů, vysoké tvarové přesnosti, generování výrobních výkresů a další dokumentace, vykonávání přesných pevnostních výpočtů, renderování fotorealistických vizualizací a dalších zaměření často v rozporu s jakoukoli optimalizací daných modelů pro bezproblémové zobrazení například v méně výkonných zařízeních.

Jenže, co když je potřeba s CAD modely pracovat i jinak, než na bázi vývoje? Například je využít v rámci interaktivní aplikace ve virtuální realitě, údržbářské aplikace v rozšířené realitě, nebo třeba jen ve webovém katalogu? U všech těchto aplikací jste omezeni výkonovými možnostmi platformy a zařízení, na němž má být model zobrazen. V takovém případě budete pravděpodobně řešit výkonovou optimalizaci CAD modelu. Jak na ni poradí tento článek.

Textury a polygony CAD modelu, Draw Calls

Podíváme-li se na jakýkoli 3D počítačový model, jeho vzhled lze zjednodušeně definovat jako soustavu na sebe navazujících mnohaúhelníků (polygonů) vzájemně utvářejících síť definující tvar objektu. Na této síti je poté umístěna textura definující vzhled (zbarvení) a vlastnosti povrchu onoho modelu. Výkonová náročnost renderu daného objektu je potom funkcí obojího. Zjednodušeně:

  • Polygony

    Polygon je uzavřený tvar určený definitivním počtem úseček na sebe vzájemně navazujících ve vrcholech polygonu (anglicky verticles). Jestliže polygon vyplníme, získáme uzavřenou plochu (anglicky face). Jedním polygonem jsme schopni dosáhnout pouze roviny - chceme-li vymodelovat jakýkoliv tvar, je nutné skládat více polygonů k sebě, do tzv. sítě (anglicky mesh). Ony vrcholy polygonu jsou poté současně agregovanými vrcholy sítě. Čím je povrch modelu členitější, případně vyžadujeme přesnější propočet vedoucí ke kvalitnější modelaci deformací, tím více vrcholů je k zaznamenání všech členitostí vyžadováno.

    Náročnost zobrazení modelu je v principu funkcí počtu vrcholů (verticles), hran (edges) a ploch (faces). Pro zjednodušení se často mluví pouze o polygonech, jelikož ony vrcholy, plochy a hrany jsou právě funkcí jejich počtu. Zažitým standardem je dělení modelů na základě počtu polygonů na "Low poly" a "High poly", naneštěstí tohle označení může být zavádějící hned z více důvodů, obecně to nejzákladnější:

    • Označení Low poly není striktně limitováno maximálním možným počtem polygonů. Obecně se za low poly považují modely s méně jak 5 až 10 tisíci polygony, avšak technicky je low poly model takový, jenž dosahuje požadovaného tvaru při co nejnižším počtu polygonů bez ohledu na jejich konečný počet.
    • Počet polygonů je silně závislý na jejich geometrickém tvaru. Principiálně by se mělo vždy vycházet ze základního polygonu - trojúhelníku (trojúhelníkové polygony jsou anglicky označovány triangles). Ostatně, právě s trojúhelníkovým formátem, do nějž lze polygon jakéhokoli tvaru rozložit, pracuje grafická karta při svých výpočtech. Naneštěstí, grafické programy, včetně Unity, umožňují používání i jiných než triangle sítí, například typu squad (variace kosodélníku). A jestliže je použita např. obdélníková mřížka, počet polygonů oné mřížky je oproti trojúhelníkovým zdánlivě poloviční.

    Při posuzování výkonové náročnosti renderu modelů lze namísto počtu polygonů sledovat relevantnější informaci, a to počet vrcholů (verticles) sítě. Každý takovýto vrchol má přiřazenou přesnou polohu v rámci XYZ prostoru a její odolnost vůči změně na základě napětí v onom bodě sítě (například pro výpočet deformace při konfliktu s jiným tělesem). Právě jejich počet je zásadní při grafickém renderu, kdy se v reálném čase sleduje a počítá poloha a tvar celého tělesa na základě polohy vrcholů sítě, respektive jednotlivých polygonů. Čím vyšší počet vrcholů náš 3D model obsahuje, o to více bodů musí GPU koncového zařízení při jeho renderu projít a přepočítat, aby správně určilo jeho tvar, pohyb a deformace.

    Extrémem v počtu polygonů jsou modely využívané pro MKP analýzy ve strojírenství. Zde se však ona nejčastěji trojúhelníková síť tvoří až v specializovaném softwaru pro provádění daných pevnostních výpočtů (zjišťuje se napětí v každém bodě při definovaném zatížení a následně porovnává s maximálním dovoleným napětím v materiálu pro daný typ namáhání) - dostaneme-li tedy model, jenž má velmi hustou síť polygonů (volí se dle členitosti součásti) a požadované přesnosti výpočtu v jednotlivých místech), je vhodné požádat si o model ve fázi ještě před aplikací této sítě, což je časově efektivnější než snažit se o její redukci za použití modifiers nástrojů (o nich si povíme více dále v textu).

    Kde zjistit počet polygonů, vrcholů. ploch a dalších daného modelu?

    Počet polygonů a jim souvisejících informací lze zjistit prostřednictvím jakéhokoli softwaru pro 3D modelování a renderování modelů, napřiklad:

    • 3D modelovací software Blender: V Blenderu jsou statistiky modelů dostupné vždy naprosto dole v pravo - v informačním pruhu programu (v Blenderu ver. 2.9+ je nutné si daný box aktivovat). Nalézt zde lze počet vrcholů (Verts), hran (Edges), ploch (Faces) i počet trojúhelníkových polygonů (Tris).
    • Herní engine Unity: V herním enginu Unity lze získat v jakémkoli momentě celkové statistiky o renderovaných objektech pro kameru - naleznete jej v okně "Game", pod záložkou "Stats". Unity ukazuje počet trojúhelníkových polygonů pod klíčem "Tris" a počet vrcholů mřížky pod klíčem "Verts". V případě meření se ujistěte, že máte v zobrazovacím poli kamery celý objekt (všechny celé objekty), pro něž počet polygonů a vrcholů chcete zjistit.
  • Textury

    Texturou si můžeme představit vystřižený obrázek, kterým se kompletně obalí síť definující tvar tělesa z předchozího bodu. Daný obrázek přitom reflektuje vzhled konkrétní části, kterou obaluje. Pokud bychom obalovali krychli, měli bychom texturu ve tvaru podobném "skákacímu panákovi", kterého dříve skákaly děti na ulici. V praxi se však používá čtvercových textur o velikostech 64x64, 128x128, 256x256 a dále až k hodnotám 8K. Tyto čtverce se posléze skládají vedle sebe (pojem tiling) na povrchu sítě polygonů.

    V nejjednodušším případě daná textura je jen "balící papír" jedné barvy. Ovšem, chceme-li dosahovat skutečně realistického vzhledu, používáme "k obalování" nejen fotografie ve vysoké kvalitě, ale zároveň i umístění textur ve více vrstvách pro dosažení realistického vzhledu zahrnující například odlesky a hrubost. Jednotlivé vrstvy a jejich vlastnosti jsou definovány v rámci "materiálu".

    Aby námi takto nasazená textura byla se sítí definující daná objekt skutečně svázaná, body tvořící polygony z předchozího bodu mají vyjma souřadnice XYZ ještě navíc i souřadnici U a V, které říkají který konkrétní bod textury by na onom konkrétním bodě objektu měl ležet. Tomuto principu se říká "UV mapování". Jestliže se chceme např. z důvodu zamýšlené funkce UV mapování vyhnout, lze pracovat s "World-aligned" texturami.

    Poměr mezi kvalitou textury a počtem polygonů modelu obvykle volíme dle potřeb užití - například vizuálně orientované produkty mají polygonovou síť co nejřidší při dodržení potřebného tvaru následně obalenou co nejkvalitnějším materiálem. Neplatí tedy žádná úměra mezi počtem polygonů a vzhledem povrchů.

    Proč je volba správných textur důležitá?

    Pokud si na počítači otevřeme stejný obrázek s různou kompresí, zjistíme, že čím vyšší je množství jeho pixelů a s tím spojená velikost zdrojového souboru, tím déle se bude načítat. To samé platí ještě výrazněji pro textury v aplikacích - čím vyšší nároky na jejich zobrazení na konkrétním objektu jsou, tím vyšší jsou i nároky pro běh aplikace.

  • Struktura 3D modelu a Draw Calls

    Při běhu hry / aplikace jsou v herním enginu a posléze hře / aplikaci renderovány pouze objekty v zorném poli. Díky tomu je dosahováno násobného zlepšení výkonu. Problém nastává u rozsáhlejších scén a modelů - například velké budovy. Jestliže takový model naimportujeme jako jeden celek, bez ohledu, kde v budově budeme / jakou její část uvidíme, aplikace bude vždy renderovat celý objekt (aplikace samotná není schopna rozlišovat a renderovat pouze konkrétní část celistvého modelu). Naopak, pokud ten samý objekt bude složen z tisíců dílčích částí, i přes render pouze těch viditelných budou naskakovat vysoké počty Draw Calls spojené s jejich renderem (Draw Call = přepočet polohy a vzhledu v CPU následně renderované v GPU, provádí se zvlášť pro každý material, více informací v textu níže). Přitom právě Draw Calls jsou jednou z nejnáročnějších operací, nízký počet Draw Calls je násobně důležitější než nízký počet polygonů. Pro optimální funkci je tedy nutné hledat kompromis - seskupování jednotlivých částí scény do logických celků.


Jak vypadá optimálně optimalizovaný CAD model?

Optimálně optimalizovaný CAD model je takový, který je zobrazen s využitím co nejnižším možného výpočetního výkonu při dodržení všech s ním spojených potřeb v dané aplikaci.

Princip optimalizace počtu polygonů

Když uvažujeme nad redukcí počtu polygonů, musíme si nejdříve ujasnit dvě zásadní otázky:

  1. Jak vysoké rozměrové přesnosti musí optimalizovaný CAD model dosahovat, respektive, v jak velké rozměrové a tvarové odchylce se lze pohybovat?
  2. Pokud daný model má být v aplikaci destruktivní (= např. destrukce jeho tvaru po nárazu), jak přesná a kvalitní tato destrukce musí být?

Jak již bylo vysvětleno dříve, tvar objektu je vždy definován krajními body polygonů, jejichž poloha je v reálném čase při běhu aplikace přepočítávána. Čím více těchto bodů na povrchu objektu máme, tím přesnějších tvarů a rozměrů lze ve výchozím i destruktivním stavu dosahovat.

Z hlediska principu výpočtů prováděných v GPU zařízení je optimální, pokud jednotlivé polygony jsou podobného tvaru a co největší možné velikosti (= nejmenšího počtu) při dodržení jejich funkce . Pro eliminaci zbytečných výpočtů bychom se měly vyvarovat i situacím, kdy vlivem zhuštění sítě dochází ke zbytečným výpočtům vlivem zastínění, pro více informací o dané problematice Googlete pojem "overshading".

Optimalizovali-li bychom počet polygonů ručně, což by bylo enormně časově náročné, nudné, chybové a někdy i hloupé, nahlíželi bychom vždy na konkrétní síť polygonů a tu v závislosti na konkrétním místě na objektu a jeho funkčnosti optimalizovali na optimální počet polygonů. V praxi při objektech při potřebě optimalizace na úkor tvarové přesnosti lze použít "hack" s normálovou mapou - vychází se při tom z předpokladu, že je důležitější jaký tvar "vidíme", než jaký skutečně je. Zjednodušeně to znamená, že detaily tvořené polygony přeneseme do normálové mapy textury a namísto většího počtu malých polygonů použijeme menší počet polygonů větších. Samozřejmě, samotné těleso, leč se jeví tvarově, je v takovém případě při 3D pohledu ploché. Jestliže pracujeme v 3D a VR, alternativou je lehce náročnější parallax mapping, jež je vytvořen na principech map normálových, avšak obsahuje dodatečnou hloubkovou vrstvu.

Ovšem k fakeování skutečného tvaru objektů dodatečnými vrstvami textury ve virtuální realitě Timothy Lottes (Epic Games, Nvidia), údajně tvrdí [in VR] textures are virtually useless because they look like images painted on toys instead of real geometry..

Princip optimalizace textury pro rychlejší render

Podíváme-li se na typy textur, objevíme 3 typy textur - rastrovou texturu, procedurální texturu a vektorovou texturu. Grafika v každé z těchto textur se tvoří v odlišném 2D grafickém editoru a již vytvořená grafika je do jiného typu textury nepřevoditelná.

Optimálním řešením, je-li to možné, je využívání vektorové grafiky. Nicméně mnohem více používanou grafikou je stále rastrová - jedná se například o všechny obrázky tvořené v Malování, Photoshopu nebo Gimpu, zkrátka ty s koncovkami .jpg, .png a podobně.

  1. Pixelová velikost textury (rozlišení textury)

    Rastrový obrázek je definován jednotlivými pixely, každý pixel má velikost 1 bitu. Textura o rozměru 100x100px má tedy 10 000bitů, respektive 10 000 bit / 8 (převod do bytů) / 1000 (převod do kilobytů) = 1,25kB.

    Rozměru 100x100px, respektive 10 000 pixelových bodů - je to málo, hodně, nebo akorát pro texturu? Na to Vám nikdo neodpoví - to je odvislé od konkrétní textury, její vzdálenosti od kamery a velikosti RAM cílového zařízení.

    Obecně lze říci, že při aktivním map filteringu a antialisingu je potřeba k rendru textury o nižším rozlišení méně paměti RAM, avšak rendrovací čas je vyšší z důvodu více výpočtů za účelem vyhlazení oné textury.

  2. Kanály barev

    Aby byl pixel vidět, musí mít přiřazenou určitou barevnou informaci. Přirozeným formátem barev pro zobrazení na počítačových a televizních obrazovkách je formát RGB, jenž zahrnuje všechny odstíny barev utvořitelných kombinací červené (R), zelené (G) a modré (B). Jednotlivé barvy onoho formátu RGB, tedy R, G a B nazýváme kanály. Existence kanálu má velikost 1bitu, tedy každý bit z předchozího bodu obsahuje další 3 bity barevného kanálu. V praxi často požadujeme i možnost nastavení průhlednosti, dostupné pod kanálem Alpha, tedy A. Vzniká tím formát RGBA, a s tím i požadavek na jeden další bit.

    Původní textura po přiřazení RGB formátu má rázem velikost 10 000 bit * 3 = 30 000 bitů = 3,75kB.

  3. Barevná hloubka

    S existencí barevných kanálů můžeme konečně pracovat s barvami. Celkový rozsah dostupných barev pro 1 pixel definujeme barevnou hloubkou opět v bitech. Hloubka 1 bit je dostatečná na černobílý obrázek. Dále to z principu závislosti na množství kanálů roste exponenciálně.

    • Při barevné hloubce 8 bitů a použití RGB formátu barev je k dispozici 256 barevných kombinací (rozsah u 8bitů je 0 až 255, při 3 kanálech s vyřazením duplicit tedy 28 = 256. Pronásobíme-li toto číslo 3 kanály (2563), získáme 16,7 milionů možných RGB kombinací.

      Obrázky s 8 bity na kanál jsou často označovány za 24 či 32 bitové obrázky. Jde přitom jen o rozdílné značení, kdy nejdříve hovoříme o hloubce na kanál (tedy 3 kanály po 8 bitech = 24bitů) a posléze hloubce na celý obrázek, tedy opět 24. 32bitová varianta je v případě aplikace průhlednosti, tedy doplňkového kanálu Alpha (formát RGBA).

      Při barevné hloubce 8bitů na kanál má naše počáteční textura navýšenou velikost na 30 000 * 8 = 240 000 bitů = 30kB.

    • Barevná hloubka 16 bitů při použití RGB formátu barev, respektive 48 bitový obrázek umožňuje oproti 24 bitovému násobně jemnější nastavení barev. Při 8 bitech hloubky na kanál je k dispozici 256 odstínů jedné barvy (= počet barev na kanál), kdežto při 16 bitech to je již 65536 dostupných odstínů na barvu, při třech kanálech tedy vzniká celkem 281,5*1012 kombinací barev.

    Hloubku 16 bitů lze používat v průběhu různých editačních úprav (aplikace filtrů, nastavování kontrastů atd.), během nichž při použití 8-bit hloubky může dojít ke ztrátě přesnosti barevných informací. Pro konečný build se však vždy používá maximálně 8bitová hloubka, která je plně dostačující v rámci rozlišovací schopnosti lidského oka).

  4. Komprese velikosti

    Velikost souboru textury lze snížit i její kompresí, což je jednoduše snížením počtu dat, které společně s daným souborem obrázku ukládáme. To může samozřejmě být na úkor jeho kvality.

    Typy komprese
    • Lossless compression (bezztrátová komprese) - kompresní algoritmus zredukuje pouze datové informace, které nemají vliv na kvalitu obrázku. To umožňuje opakované konvertování a přeukládání obrázku beze ztráty kvality. Typickým formátem bezztrátové komprese je .PNG.
    • Lossy compression (ztrátová komprese) - kompresní algoritmus používá aproximaci a částečně vyřazuje všechna data bez ohledu na snížení kvality obrázku. Síla komprese může být nastavena uživatelem. Typickým kompresním výstupním formátem je .JPG.

    Součástí obrázků jsou zpravidla i metadata. Může jít o název autora, místo pořízení snímku, použitý software k úpravě a podobně. Metadata jsou textové informace o velmi nízké velikosti a na výkon mají téměř nulový vliv. Přesto, odstranění je snadné - jejich přítomnost v exportovaném obrázku se volí zaškrtávátkem při exportu z grafického editoru.

  5. Počet textur přiřazených k objektu

    Při vykreslení objektu probíhá komunikace mezi rendererem CPU a GPU, v principu CPU přepočítá renderer konkrétní části (objekt, textura...) a zašle GPU požadavek na její zobrazení / změnu. Pokud tedy máme na objektu pouze jednu texturu, požadavek do GPU přijde pouze jeden. Máme-li ale náš objekt segmentovaný, s různými texturami na různých částech, požadavků do GPU přichází v jednom čase více, což způsobuje jeho vyšší vytížení. Počet nutných spojení mezi GPU a rendererem z hlediska nastavení materiálů je značeno klíčem "SetPass calls", "DrawCalls" se poté váží ke každé odeslané položce.

Optimálně optimalizovaná textura je taková, která má požadovanou grafickou kvalitu při nejnižší možné velikosti a nejrychlejším možném renderu. Jestliže vyvíjíme pro více zařízení, s diametrálně odlišným výpočetním výkonem, vhodným způsobem k dosažení maximální možné kvality vzhledu řešit textury pro každé zařízení individuálně.

Manuální optimalizace CAD modelů

Výše jsou popsány základní principy, které vývojář aplikací potřebuje znát pro vývoj optimalizovaných aplikací. Ačkoli se seznam může zdát dlouhý, při vhodných návycích pro správu a používání modelů jeho dodržení vyžaduje při jednorázovém použití pouze minimální časovou investici navíc. Náročnějším problémem k řešení mohou být výrobní a jiná data spojená s exportovanými 3D modely - ty je nutné buď odstranit, nebo v případě potřeby vizuálního zachování převést do normálových map. Největší časový problém ovšem nastává v momentě, kdy se výchozí modely v průběhu vývoje a provozu aplikace mění - v takovém případě by se při každé úpravě výchozího modelu musela jeho výkonová optimalizace opakovat. Takový proces je značně nudný a časově neefektivní, zkrátka, optimální pro automatizaci.

Přesto, zde je pár typů na rychlou základní optimalizaci:

  • Počet polygonů modelu lze redukovat v každém 3D modelovacím softwaru. V Blenderu to je možné přes modifikátor "Decimate".
  • Počet dotazů do GPU potřebných k vykreslení objektů (SetPass calls) lze zredukovat zapečením světelných map (baked lightmaps).

Automatická optimalizace CAD modelů

Potřebujeme-li schopnost časově efektivní práce s CAD modely v herním enginu či možnost výkonově optimalizovat v krátkém čase nebo i průběžně větší počet CAD modelů, automatizace tohoto procesu může být velmi přínosnou. Podíváme-li se na dostupná řešení na trhu, najdeme zde hned několik řešení. Rozhodnutí je poté odvislé od zamýšleného použití modelů a používaného herního enginu. Je-li cílem s modely dále pracovat v herním enginu Unity, může přijít vhod balíček Unity Pro + PiXYZ Plugin + PiXYZ Studio přímo od tvůrců tohoto enginu, případně nástroj Unity Reflect. Použitím balíčku lze značně zjednodušit a urychlit převod CAD modelů do onoho herního enginu, avšak není to zadarmo - roční licence pro jednoho uživatele vychází na $2,100 za Pixyz Studio, $1,150 za Pixyz Plugin, případně ještě $1,800 za Unity Pro. U herního enginu Unreal od Epic Games je vhodným řešením bezplatný soubor nástrojů Datasmith pro importování CAD modelů, případně také Twinmotion. Zajímá-li vás výkonový rozdíl mezi PiXYZ od Unity a DataSmith od Unreal, můžete se podívat na zprávu od Tata Elxis publikovanou Unity.

Trváte-li na Unity, obecnějším a levnějším řešením s cenovkou $ 99.9 měsíčně se nabízí Substrance3D od Adobe.


Pokračování článku v následujících dnech.

Následující optimalizace v herním enginu

  • Vhodné nastavení "Levels of Details" (LODs) a "Hiearchical Level of Details" (HLODs) pro maximální redukci Draw Calls. LOD (+culling) obstarává snížení počet polygonů a redukci kvality a počtu zobrazených materiálů se vzdalující se kamerou od objektu. HLOD seskupuje modely, kombinuje materiály a textury a nahrazuje více modelů statickými sítěmi - vše opět v zájmu snížení počtu Draw Calls. Výhodou HLODs je i nedestruktivní způsob fungování (modifikace objektů neovlivňuje nastavení HLODs).
  • Pro další snížení počtu Draw Calls lze sjednotit vhodné sítě (merge meshes), stejně tak nastavit Instanced rendering.
  • Používání Mip-maps pro redukci paměti nezbytné pro render materiálů
  • Minimalizovat opakující se výpočty - výpočty provádět pouze v případě potřeby, ne za každého framu. Spouštění přes události namísto podmínek kontrolovaných v každém framu. Rotující pohyb grafiky lze namísto přepočtem provádět shadery. S kalkulacemi shaderů u zařízení s nižším výkonem pracovat na základě vertexů namísto pixelů.
  • "Bake" a "Cull" vše možné, pokud již není zapečeno z 3D modelovacího softwaru

Konečně - kontrola výsledku

Po důkladné optimalizaci by mělo být možné zobrazovat CAD model v jakékoli apliakci vždy v nejvyšší možné kvalitě vztahující se k výkonu zařízení. Jestliže se tomu neděje, je na čase podívat se na Profilling - náročnost zobrazení jednotlivých částí modelu a celkově celé aplikace.

Profilování a optimalizace v Unreal Engine 4