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. 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 tu manuální i automatizovanou poradí tento článek.

Textury a polygony CAD modelu

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 a textury definující jeho vzhled (povrch a barvu). 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ů vedle sebe, do tzv. sítě (anglicky mesh). Ony vrcholy polygonu jsou poté současně konsolidovaný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 jakýkoli polygon 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ýkonnové 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 rendru, 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 rendru 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 řídkou 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ě.

    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. 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 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 více vrstev textury pro dosažení realistického vzhledu zahrnující například odlesky.

    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í".

    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.


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 potřebě optimalizace na úkor 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.

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í RGBA 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 a GPU, v principu renderer konkrétní části (objekt, textura...) vždy při své inicializaci zakřičí na GPU požadavek na své 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 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ů. Je-li cílem s modely dále pracovat například 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. 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. V případě zájmu Unity nabízí 30 dnů zdarma na ozkoušení.

Obecnějším a levnějším řešením je s cenovkou $ 99.9 měsíčně Substrance3D od Adobe.


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