Je nutno uznat, že kdo nechce, nemusí se touto problematikou příliš
zabývat. Pouze si poskládá vybrané komponenty do podoby své aplikace a
má práci hotovou. Se znalostí věci ale můžeme dokázat vice.
V ideálním světě bychom se o metody vykreslování grafiky nemuseli
vůbec zajímat. Počítač a operační systém by poskytovaly rychlou 2D i
3D grafiku, k tomu i kvalitní a vždy ostrá písma a vše by samozřejmě
bylo možno plynule zvětšovat a zmenšovat. Kvalita, hladkost a současně
ostrost by byly vždy maximální bez ohledu na fyzické rozlišení
obrazovky. A že by se vše vždy bleskurychle překreslovalo bez
jakéhokoliv mihotání, blikání a jiných rušivých efetků se rozumí samo
sebou. V prostředí systému Control Web se nám podařilo tohoto ideálu
dosáhnout, nebo alespoň jsme se k němu velice přiblížili. Nejdříve si
ale odpovězme na několik otázek.
Co jsou to vykreslovače grafiky? Jaký mám zvolit vykreslovač
v panelu své aplikace? Jak bude vykreslování grafiky rychlé a jaký
na to budu potřebovat počítač?
Vykreslovače grafiky jsou programové komponenty, které pro
aplikace zajištují veškeré služby spojené s vykreslováním grafiky.
Virtuální přístroje v aplikaci pak tyto služby používají zcela
nezávisle na konkrétním typu vykreslovače. Lze volit mezi několika
grafickými vykreslovači. Již samotná tato možnost volby může být
pro někoho mírně matoucí a vede k několika dalším otázkám. Správný
výběr vykreslovače podstatně ovlivňuje vlastnosti vyvíjené
aplikace. Pokusme se proto problematiku vykreslování grafiky blíže
popsat.
Obr. 1: Volba typu vykreslovače v inspektoru
virtuálního přístroje
Pro virtuální přístroje v aplikacich systému Control
Web můžeme pro parametr graphics_mode zvolit jednu z
následujících možností:
inherited - programová komponenta přebírá
vykreslovač od svého vlastníka ve vizuální struktuře.
gdi - klasické grafické rozhraní Windows GDI
(Graphics Device Interface) s celočíselnými souřadnicemi a
vykreslováním přímo do obrazovkové paměti
gdi_off_screen - pomocí rozhraní GDI je
kresleno do paměti a poté je hotový obrázek přenesen do
obrazovkové paměti
gdi_plus - grafické rozhraní řešené
prostřednictvím C++ tříd využívající již souřadnice v plovoucí
řádové čárce
direct2d - grafické API, které využívá
systému Direct3D. Vektorová grafika je z větší části řešena
softwarovým rasterizerem.
opengl - otevřené grafické rozhraní, které
je používáno řadou operačních systémů. Grafická služby jsou
podporovány vždy výrobci grafických karet a grafických
procesorů. Odtud plyne maximální akcelerace pomocí hardware a
programovatelnost grafických procesorů.
Proč je správná volba jedné z této možností pro kvalitu
aplikace důležitá?
Operační systém Windows si s sebou nese docela velkou
historickou zátěž. Tato zátěž se pak samozřejmě týká i většiny
programového vybavení, které je v tomto operačním systému
instalováno. My se nyní z celého rozsáhlého aplikační programové
rozhraní Windows budeme zabývat jen podporou vykreslování grafiky.
Od počátků existence Windows je jednou z jeho hlavních součástí
rozhraní GDI. Byť jsou možnosti GDI v mnoha směrech na dnešní dobu
velmi omezené, pro použití při vykreslování např. textů a tabulek
nebo klasických dialogových oken je stále velmi dobrým řešením.
Výkon je limitovám prakticky nulovým využíváním grafických
procesorů ale největším problémem je pro nás omezení na
celočíselné souřadnice. Obecné křivky jsou kostrbaté bez možnosti
vyhlazování antialiasingem. Omezenost na celá čísla také
znemožňuje plynulé zvětšování a zmenšování grafiky. Vzhledem k
tomu, že při DGI vykreslování se každý virtuální přístroj
překresluje nezávisle na ostatních virtuálních přístrojích
ležících vedle něj i pod ním, může u transparentních přístrojů,
které nepřekreslují celou svou plochu, docházet k blikání, neboť
je nutno překreslovat vše odspodu nahoru. Blikání lze eliminovat
volbou gdi_off_screen, kdy se vše pomocí GDI překreslí v paměti
počítače a teprve poté se hotový obrázek přenese na obrazovku.
Obr. 2: Panel s přístroji s nastaveným GDI nebo OpenGL
vykreslovačem
GDI vykreslovač je výbornou volbou pro grafiku, která obsahuje
např. hodně textu a tabulek. Naopak kvalita vektorových kreseb je
velmi problematická. Také je tento grafický systém nutností v
panelech, které obsahují např. ActiveX komponenty nebo také OpenGL
vykreslovací kontexty kamer využívajících masivně paralelního
výkonu grafických procesorů.
Prostřednictvím GDI není možno dostatečně kvalitně vykreslovat
obecnou vektorovou grafiku, o 3D grafice nemluvě, proto bylo do
Windows doplněno grafické rozhraní GDI+. Toto rozhraní, které je
mimochodem tvořeno přímo C++ třídami, přináší do 2D grafiky
souřadnice v plovoucí řádové čárce, antialiasing, alpha blending,
gradientní výplně a maticové transformační operátory. Obdobně jako
GDI, ani GDI+ grafika není nijak hardwarově akcelerována.
Vektorová grafika je vykreslována kvalitně, ale výkon může být
často nedostatečný.
Obr. 3: Virtuální přístroje 2D a 3D přepínačů umístěné
ve scéně nebo v panelu
Větší využití hardwarové akcelerace ve Windows poskytuje
aplikační knihovna Direct2D, která využívá grafického systému
Direct3D. Klíčovou komponentou systému Direct2D je ale softwarový
rasterizer, který využívá pouze CPU počítače. Není tedy zcela
zdokumentováno ani není zřejmé, co vše je při používání tohoto
rozhraní hardwarově akcelerováno. Vykreslovací výkon je však
znatelně vyšší než u GDI+ při srovnatelné kvalitě vykreslené
grafiky.
Vykreslovače DGI+ a Direct2D umožňují plynulé zvětšování a
zmenšování grafické podoby aplikací. Největší míru hardwarové
akcelerace poskytuje grafické rozhraní OpenGL. Tento vykreslovač
nejenže poskytuje vysoký výkon, plynulé zvětšování a zmenšování
grafiky aplikací, ale jako jediný umožňuje také neomezené současné
používání 2D i 3D virtuálních přístrojů ve společném panelu. To
zní jako onen ideál, zmíněný v úvodu tohoto článku.
Největším problémem OpenGL grafiky je asi to, že toto grafické
rozhraní nemá firma Microsoft příliš ráda. Nejviditelnějším
projevem toho vztahu je fakt, že operační systém Windows
neposkytuje pro OpenGL prakticky žádnou podporu rasterizace a
vykreslování fontů, která je samozřejmá, a mimochodem velmi
kvalitní, pro všechna ostatní grafická API z dílny Microsoftu.
Obr. 4: I v klasickém 2D panelu lze využívat grafické
efekty 3D přístrojů
Proto byl v systému Control Web 7 pro vysoce kvalitní
rasterizaci fontů v OpenGL vykreslovači použit rasterizer
FreeType, jaký je využíván např. v operačních systémech Linux,
Android, iOS, macOS, PlayStation a v prostředí Java atd. Fonty
jsou při zvětšování a zmenšování obrazu vždy rasterizovány s
maximální ostrostí ve všech velikostech a ve všech poměrech šířky
k výšce. Rozsah znaků byl ale stále omezen na aktuální kódovu
stránku. Až Control Web 8 byl vybaven správou fontů v plném
rozsahu UNICODE kódování. Problém byl tedy odstraněn.
Předností je hodně, k těm důležitým snad patří,
že:
OpenGL je podporováno výrobci grafických procesorů.
Konkurence mezi firmami Nvidia, AMD a Intel má pozitivní vliv na
výkon a kvalitu - tedy za předpokladu, že si vždy nové grafické
ovladače také nainstalujeme.
OpenGL poskytuje jednotný programovací standard GLSL pro
masivně paralelní běh shaderů v grafických procesorech. To je
velkým přínosem mimo jiné pro akceleraci virtuálních přístrojů
kamer a strojové vidění VisionLab.
V jednom panelu nebo scéně lze neomezeně používat
virtuální přístroje s tradiční grafikou, přístroje s 2D
vektorovými kresbami i virtuální realitu s plně 3D prostorovými
přístroji.
Velké části grafiky jsou pro zrychlení vykreslování
uschovávány v rychlé grafické paměti grafického adaptéru. Značná
část grafické zátěže běží v grafickém procesoru a nijak
nezatěžuje CPU počítače při běhu aplikace v reálném čase. Při
vykreslování 3D scén se uplatňuje architektuta klient - server,
také CPU část grafiky běží ve vlastním prováděcím toku.
Při vykreslování vektorové grafiky na GPU Nvidia může být
využíváno rozšíření nv_path_rendering a veškerá rasterizace
grafických objektů včetně písma pak běží s fragmentovou
přesností masivně paralelně v GPU. Na grafických adaprérech
jiných výrobců bohužel tato technika není k dispozici. Zde
musíme využít vestavěnou tesselaci, tj. rozklad kresby do
elementárních objektů. Množiny elementů jsou i tak často uloženy
do grafické paměti a následně vykreslovány rychle a
efektivně.
Při vykreslování rasterizovaného písma a některých
grafických objektů, jako jsou např. čáry a obdélníky jsou jejich
pozice počítány vzhledem k obrazovým bodům aktuálně použité
obrazovky pro dosažení maximální ostrosti.
Musíme se při tvorbě aplikace tímto vším zabývat?
Nemusíme, ale pro tvorbu vizuálně působivých aplikací je
výhodou znát přednosti i nedostatky jednotlivých grafických
vykreslovačů. Náš aplikační program pak může být nejen hezčí, ale
také současně i rychlejší a plynuleji běžící.
Obr. 8: Ukázka kvality vestavěné softwarové tesselace a
triangulace vektorové grafiky
Snad se nedopustíme přílišného zjednodušení, když
uvedeme:
Jestliže máme panel s ovládacími prvky v klasickém stylu
dialogoných oken systému Windows nebo chceme zobrazovat rozsáhlé
tabulky a textové výpisy, zvolíme vykreslovač gdi. Stejně tak
musíme učinit u panelu, do kterého vložíme nějaký objekt, který
má vlastní vykreslovací kontext, např. ActiveX komponentu nebo
virtuální přístroj gl_camera.
Vykreslovač gdi_off_screen vybereme tehdy, postačuje-li
nám kvalita GDI grafiky, ale chceme odstranit blikání při
postupném překreslování jednotlivých grafických objektů nebo
chceme-li používat částečně transparentní přístroje.
Chceme-li mít hladkou a čistou vektorovou grafiku a
nemáme výkonný grafický adaptér ani příliš velké nároky na
rychlost, můžeme zvolit vykreslovač gdi_plus.
Máme-li lepší grafický adaptér a nebudeme-li v panelu
používat trojrozměrné virtuální přístroje, dobře nám vyhoví
vykreslovač direct2d.
Máme-li výkonný grafický adaptér nebo chceme-li mít v
panelu také 3D virtuální přístroje, pak zvolíme vykreslovač
opengl. Panel s tímto vykreslovačem bude zobrazovat veškeré 3D
komponenty, i když pouze v kolné projekci a bez možnosti pohybu
prostorem. Budeme-li chtít využít všech možností, které nám 3D
grafika přináší, použijeme místo panelu scénu, která umožňuje
zobrazovat prostor s perpektivní projekcí, v tomto prostoru se
volně pohybovat, zobrazovat 3D objekty se všemi efekty, jako
jsou např, prostorové stíny, mlha, světelné a čočkové efekty,
postprocesové filtry atd. Také 3D scéna ale dokáže vykreslovat
veškeré 2D virtuální přístroje s klasickým vzhledem v DGI stylu.
Obr. 9: Editaci přístrojů v prostoru scény usnadňují
mechanismy lepení a spojování přístrojů i hromadná manipulace s
přístroji
Univerzální systém pro moderní grafiku.
Architektura komponent grafických vykreslovačů přináší
virtuálním přístrojům možnost používat grafiku na abstraktní
úrovni zcela nezávisle od jednotlivých implementací grafických
funkcí. To nám otevírá přístup k moderním a výkonným technologiím
počítačové grafiky a současně dlouhodobě zachová zpětnou
kompatibilitu a umožňuje provoz prostředí Control Web na široké
škále počítačů.
Článek
tak, jak vyšel v magazínu Elekto Průmysl je v PDF podobě zde: ElektroPrumysl2018grafika.pdf.
Roman Cagaš
|