C++ & C# Programming page
 

 

# Úvod
# Tvůrci
# C++
# C#
# Linky





Mini-seriál o grafice - 5. díl

Dnes se ještě nedostaneme k samotnému programování. Jak jsem minule napsal, bude to teoretický článek, vysvětlující fungování DirectDraw.

Možná se vám někomu již stalo, že když se vykresluje složitá grafika, nebo dokonce pohyblivá grafika, dojde k "problikávání" jednotlivých objektů. To je jeden z důvodů, proč se používá DirectDraw, lépe řečeno DirectX všeobecne. V DirectDraw se používá speciální termín - FS a BS - Front Surface a Back Surface.
Front Surface reprezentuje něco jako DC - kontextové zařízení - v GDI. Jde o oblast dat v grafické paměti, do které se zapisují grafické informace, podle nichž se následovně vykreslí obraz na monitor. Kdyby se zapisovalo přímo do FS, dosáhl by se teoreticky ten samý blikající efekt jako u GDI.
Back Surface je další oblast v paměti. Dalo by se říct, že FS je (jak napovídá jméno) vepředu a BS vzadu, tudíž ho nevidíme. Do BS se zapisují grafické informace, jako do FS, jediný rozdíl je v tom, že BS se nikdy nezobrazí, dokud nedáme programu příkaz, aby z BS udělal FS a naopak z FS - BS. (Prakticky jde jen o přehození pointerů)  Tehdy nastane onen magický moment, ve kterém si DirectDraw "počká" na paprsek vykreslující obraz na monitor a začne vykreslovat až když je vše připraveno a není šance, aby došlo k probliknutí. Výsledkem je, že bliknutí nenajdete ani kdyby jste skákali po hlavě :).
Když už jsme u těch termínů, tak prohazování BS a FS se jmenuje Flipping. Oblasti, kde se uchovávají obrázky, potřebné pro "skládání" scény do BS se jmenují OffScreen Surfaces - Povrchy mimo obrazovku. Název mluví sám za sebe. Povrchy sou jen v paměti. Pokud chceme tyto oblasti nakopírovat do jiného povrchu, říká se tomu Blitting.
Vykreslování vypadá tedy následovně: Drawing do OffScreen Surfaces, Blitting do Back Surface a nakonec Flipping.
Ještě taková zajímavost. Pokud chceme nějak naplnit OffScreen Surface, máme 2 možnosti. Buď to nějak zařídíme přes DirectX (což je docela složité), nebo se obrátíme na staré dobré GDI. Výhodou je, že příkazy GDI už známe a tak není potřeba se učit něco nového, navíc je práce s GDI pohodlnější. Kdosi ohledně tohoto problému řekl: "Proč znovu vynalézat kolo, když už jedno máme?" Nevýhodou jsou zdlouhavé operace a celkově náročnost. Proto načítat při každém snímku obrázek ze souboru by stíhalo jen dobré PC, na 100% zatížené a s mizerným výsledkem po grafickém stránce.
Naštěstí se to dá obejít jednorázovým načtením. Určite to z her znáte. Takový ten "obdelníček", co hrozně dlouho najíždí a teprv pak začne hra. Do paměti se načtou všechna potřebná data přes GDI, popřípadě tedy DirectX, potom se používají a nakonec se z paměti odstraní. Bohužel, když nemá PC dostatek paměti, není možné nahrát všechna data najednou, takže některé hry načítají třeba jen část lokace (mapy) a při přechodu určité hranice se načítá znova. Sice dost nepříjemná záležitost, ale aspoň se hra neseká v průbehu.
Úschova dat se dá uskutečnit na dvou místech - paměť grafické karty a RAM paměť samotného PC. Grafická karta má většinou menší velikost než PC, ale přístup do paměti grafické karty je mnohonásobně rychlejší. Proto pokud to je možné, všechno cpěte tam.
No a nakonec, poslední teoretická poznámka. Herní smyčka zpráv se liší od smyček programů. V programové se zkontroluje fronta zpráv, vykoná se potřebné a pokud se nic neděje, program spí a nic nedělá. U herní smyčky je potřebné využít maximální výkon procesoru, tudíž místo čekání na zprávu, smyčka jen nakoukne, jestli nějaká zpráva přišla, pokud ano, tak ji přednostně vyřídí, jinak pokračuje ke grafice a snaží se co nejrychleji vykreslovat.

No to je asi tak vše, příště se pustíme do prvního fullscreen okna, to bude zábava ;)



Správce sekce: Dejvino



14.2 2005

C++: pridano par odkazu na clanky o OpenGL, IRC, POP3 a BMP
14.8 2004

C++: přidán klient pro Internet Relay Chat (IRC)
11.7 2004

C++: opravil jsem zdrojak WebServeru, byla tam navic jedna funkce kterou jsem nepridal a mnoho zacatecniku by si s tim nemuselo vedet rady...
27.6 2004

Vytvořen IRC kanál #c-prog na serveru Quakenet
10.6 2004

C++: přidán program WebServer, stojí za prohlédnutí!
5.6 2004

C++: přidán článek o CheckBoxu
29.5 2004

C++: přidán program WinSock Mail
28.5 2004

C#: přidán program DNStoIP
Vaše IP je 54.92.170.142
Stránka byla načtena za 0.01829 sekund.