GrafickΘ aplikace ve Visual C++ (3.) V tΘto lekci si koneΦn∞ povφme o zßkladnφch pojmech a principech DirectDraw. V prvnφ Φßsti si rozebereme d∙le₧itΘ pojmy jako jsou nap°φklad povrchy (surfaces) a v druhΘ Φßsti vßm vysv∞tlφm, jak vlastn∞ DirectDraw pracuje. Nakonec si ukß₧eme konkretnφ p°φklad, jak vytvo°it objekt DirectDraw a nastavφme dalÜφ vlastnosti aplikace. Popisuju zde jen re₧im fullscreen (celoobrazovkov² re₧im), ale DirectDraw samoz°ejm∞ pracuje i v okn∞. 3.1. Zßkladnφ pojmyZßkladem ka₧dΘ aplikace zalo₧enΘ na principu DirectDraw je jeden objekt typu IDirectDraw7 (je to vlastn∞ ukazatel na rozhranφ COM), pomocφ kterΘho vytvo°φte vÜechny ostatnφ objekty pot°ebnΘ pro kreslenφ apod. Tak₧e prvnφ, co musφte ud∞lat je, ₧e vytvo°φte tento objekt. Sprite je vlastn∞ vßmi vykreslovan² obrßzek. Sprite je v∞tÜinou vytvo°en z bitmapy, kterou naΦtete z externφho souboru. Pokud budete mφt pohybujφcφ se letadlo, prßv∞ letadlo bude sprite. DalÜφ velmi d∙le₧itou souΦßstφ je tzv. povrch (surface). Povrch je vlastn∞ buffer tzn. kousek pam∞ti, bu∩ ve video pam∞ti nebo v systΘmovΘ RAM. Je to n∞co podobnΘho jako kontext za°φzenφ (DC - viz minulß lekce). Do tohoto bufferu zapisujete data, kterΘ poslΘze vidφte na monitoru v podob∞ obrßzku. Pokud budete pou₧φvat 8-bitovou barevnou hloubku tzn. 256 barev, m∞li byste vytvo°it objekt palety. Pak je tento objekt velice d∙le₧it², jinak se bitmapy zobrazφ chybn∞ (majφ prohßzenΘ barvy a n∞kterΘ barvy dokonce chybφ). Program, kter² pracuje v 16-bitech (65 tisφc barev) ₧ßdnou paletu nepot°ebuje, ale b∞₧φ pomaleji, tak₧e pokud nevlastnφte moc vykonn² poΦφtaΦ doporuΦuji pou₧φvat 8-bit∙. DalÜφm u₧iteΦn²m objektem je tzv. clipper. Abyste pochopili jak pracuje musφte znßt nßsledujφcφ lßtku. Prozatφm vßm musφ staΦit, ₧e zajiÜ¥uje tzv. clipping, co₧ u₧ jste mo₧nß slyÜeli. JednoduÜe °eΦeno Clipper zabra≥uje vykreslovßnφ sprit∙ mimo monitor. 3.2. Zßkladnφ principy DirectDrawJak jsem se ji₧ zmφnil DirectDraw, dokß₧e vykreslovat pouze ve 2D tzn., ₧e vÜechny povrchy jsou plochΘ (majφ dv∞ sou°adnice x a y). BitovΘ kopφrovßnφ mezi povrchy, co₧ je vlastn∞ kopφrovßnφ jednotliv²ch bit∙ vaÜich bitmap, se v terminologii DirectDraw naz²vß blitting (bit block transfer - p°enos bloku bit∙). Mßme dva zßkladnφ povrchy :
Front surface (p°ednφ povrch) je, jak napovφdß nßzev, ten povrch, kter² je prßv∞ vid∞t na monitoru. Back surface (zadnφ povrch) je ukryt n∞kde v pam∞ti jakoby za FS. D∙le₧itΘ je, ₧e v₧dy zapisujete jen do BS nikdy do FS. Kdybyste toti₧ zapisovali do FS p°φmo, docφlili byste podobnΘho efektu jako u GDI.
Tak₧e vy zapφÜete n∞jakΘ data do BS, ale co dßl? Tomuto systΘmu prohazovßnφ povrch∙ se °φkß flipping. Flipping toti₧ prohazuje ukazatele na oba povrchy a nepou₧φvß b∞₧n² blitting, kter² se pou₧φvß pro p°enos bit∙ mezi povrchy a kter² je Φasov∞ mnohem nßroΦn∞jÜφ. Velikost t∞chto dvou buffer∙ zßle₧φ na rozliÜenφ, kterΘ prßv∞ pou₧φvßte. Tyto buffery se zßsadn∞ vytvß°φ ve video pam∞ti, kterß je rychlejÜφ ne₧ systΘmovß RAM, zvlßÜt∞ u modernφch grafick²ch karet. Dßle si v∞tÜinou vytvß°φte tzv. OffScreen surfaces, co₧ jsou povrchy, kterΘ jsou mimo flipovacφ smyΦku. Tyto povrchy pou₧φvßme pro bitmapy, kterΘ teprve budeme chtφt zobrazit tzn. jako pomocnΘ buffery. Z t∞chto povrch∙ se pak blitujφ data do BS. Tyto buffery se vytvß°ejφ v RAM a tudφ₧ mohou b²t v∞tÜφ ne₧ FS a BS. Ve skuteΦnosti se vßm nepoda°φ ve video pam∞ti vytvo°it buffer, kter² je v∞tÜφ ne₧ FS. Leda₧e mßte grafickou kartu, kterß mß hodn∞ pam∞ti a podporuje funkci Wide surfaces (ÜirokΘ povrchy).
Cel² systΘm vypadß nßsledovn∞ : Pokud budete mφt rozliÜenφ 640x480 a 8-bit∙ barev (256 barev) FS vßm zabere p°esn∞ 640 x 480 (plus n∞jakΘ informace o povrchu), co₧ je asi 300 kB pam∞ti tzn. ₧e kdy₧ vytvo°φte FS a BS musφte mφt alespo≥ 600 kB video pam∞ti na grafickΘ kart∞. Pokud tomu tak nenφ, budete muset vytvo°it BS v RAM, ale to se siln∞ nedoporuΦuje. Samoz°ejm∞ pokud zv²Üφte rozliÜenφ nebo hloubku barev, pam∞¥ovΘ nßroky se rovn∞₧ zv²Üφ, tak₧e na to pozor. DneÜnφ grafickΘ karty mφvajφ b∞₧n∞ alespo≥ 16 MB pam∞ti a tam se vßm to vejde s p°ehledem. Dßle je mo₧no vytvo°it vφce BS nap°φklad dva, pak se systΘmu °φkß Triple buffering (mßme celkem t°i buffery : dva back + jeden front) a to u₧ jste urΦit∞ slyÜeli. Ka₧dß aplikace DirectDraw pracuje tak, ₧e se sna₧φ prohazovat oba povrchy jak nejrychleji to jde a p°itom se obΦas n∞co zapφÜe do BS. Prohazovacφ funkce Φekß a₧ se dokreslφ vÜechny blittovacφ operace, tak₧e se nemusφte bßt, ₧e by se n∞co nedokreslilo nebo snad dokonce problikßvalo! ╚φm vφce toho vykreslujete, tφm je prohazovßnφ pomalejÜφ.
Jak ale za°φdit toto rychlΘ prohazovßnφ? 3.3. Objekt DirectDraw
Tak₧e te∩ ji₧ vφme, ₧e ka₧dß
aplikace zalo₧enß na DirectDraw mß jeden objekt
typu Poznßmka: Pro nφ₧e uvedenen² k≤d musφte mφt nainstalovanΘ DirectX SDK 8.0, kterΘ bylo na °ijnovΘm ChipCD. Dßle zkontrolujte v Options VC++, ₧e na kart∞ Directories, je cesta k hlaviΦkov²m soubor∙m naistalovanΘho SDK, pokud ne, musφte polo₧ku p°idat sami. Nynφ m∙₧eme pou₧φt globßlnφ funkci DirectDrawCreateEx() k vytvo°enφ objektu DirectDraw.
Funkce mß nßsledujφcφ deklaraci :
HRESULT DirectDrawCreateEx( GUID FAR *lpGUID, LPVOID *lplpDD, REFIID iid, IUnknown FAR *pUnkOuter );
3.4. Nastavenφ dalÜφch vlastnostφ aplikace
Pomocφ ukazatele na objekt DirectDraw nastavφme, jak se bude naÜe
aplikace chovat v∙Φi jin²m program∙m Windows a
jakΘ rozliÜenφ a hloubku barev budeme pou₧φvat.
HRESULT SetDisplayMode(DWORD dwWidth,
Tato funkce mß p∞t parametr∙:
3.5. P°φklad
Nynφ dßme vÜechny novΘ poznatky dohromady.
Ve t°etφm kurzu o VC++ jste vytvo°ili t°φdu CControl, kde vytvo°te Φlenskou funkci t°eba
4 . Zßv∞r
Aplikace z dneÜnφ lekce akorßt p°epne rozliÜenφ, nic vφc.
P°φst∞ si vytvo°φme front a back buffer a vytvo°φme flipovacφ smyΦku.
|
|
© 2001 Vogel Publishing, design by ET NETERA