Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Crypton
Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 18. květen 2009, 19:44:26 Předmět: Návrh herního enginu |
|
|
Zdravím ve spolek,
Četl jsem ten topic níže viz:
http://www.ceske-hry.cz/forum/viewtopic.php?t=1480
A jak jsem pochopil tak single ton je velké zlo i když jsem četl články kde to vyvracejí.
Zajímalo by mě jestli je tento návrh enginu hodně špatný:
citace: |
Jeden globální záznam "TCoreInfo" který obsahuje všechny proměnné které budou potřebovat ostatní třídy:
D3D zařízení, DirectSound, poslední zprávu windows, pozici myši, stav klávesnice, informace o rozlišení herní obrazovky, třídu pro renderování grafiky, fontů, nějaký ten manažer zdrojů apod.
-Hlavní třída TGame, Vstupní parametr TCoreInfo:
*Inicializace všech potřebných, vytvoření okna, zařízení apod.
*Vytvoření potřebných tříd
*Kopírování všech informací do záznamu TCoreInfo
-Třída TWorld, je vytvořena v třídě TGame, Vstupní parametr TCoreInfo:
*Načtení mapy, hýbání objekty apod.
Všechny ty třídy mají v kontruktoru ukazatel na globální proměnnou TCoreInfo, a všechny existují jen jednou, ukazaten na jejich instanci je uložen v tom záznamu TCoreInfo.
Takže třeba třída TFontLoader, Vstupní parametr do kontruktoru TCoreInfo. Tato třída má metodu:
LoadFontFromFile(FileName, Font) kde Font je je záznam. |
A takhle to řeším všude, jedna globální instance třídy (uložena v TCoreInfo) která pracuje nad záznamem.
Zajímalo by mě jestli je tento přístup opravdu tak špatný a taky by mě zajímalo jak předáváte potřebné informace jiným třídám, třeba máte interface ID3DDevice9 který vytvoříte v grafickém enginu, ten třeba budete potřebavat i jinde, pro vytvoření textůry při načítání objektů apod.
Co jsem viděl zdrojové kódy tak jsem viděl jen globální proměnné, právě třeba pro interface ID3DDevice9, instance tříd pak přistupovali k těmto globálním proměnným, takže o nějaké zapozdřenosti není ani náznak. |
|
Návrat nahoru |
|
|
MD
Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 19. květen 2009, 08:28:40 Předmět: |
|
|
Tak jsem si myslel, ze debat na tema singleton je toto forum plne (sam jsem do nich prispival), tak ze zkusim neco najit. A ono houby, naslo mi to jen 2.
Takze jdem na dalsi!
Ano singleton je zlo, zvlaste v tak velkem rozsahu, jak to navrhujes ty.
Singleton se hodi pro objekty, u kterych jsi si 100% jisty, ze vzdy (i za 3 roky vyvoje) budes od nich potrebovat prave tu jednu instanci. Rekneme, ze singleton by mohl byt objekt klavesnice. To by mohlo fungovat, ta je jen jedna. Takze naprogramujes tenhle objekt a pak na spouste mistech (500+) sveho enginu budes s klavesnici pracovat. Jenze pak zjistis, ze k pocitaci se da pripojit klavesnic nekolik a ty se rozhodnes, ze kazdy hrac si bude svou postavicku ovladat svou klavesnici. Najednou potrebujes vice instanci a musis projit vsech tech 500+ mist a opravit je.
Tohle byl jen jeden umely priklad. Je schvalne voleny tak, ze na zacatku to vypada, ze navrh je ok, ale pak se to zvrtne. Tohle se prave stava u singletonu casto. Ja napriklad mel jako singleton jadro hry, ktere ridi beh hernich objektu (runtime). Jenze pak jsem zjistil, ze budu potrebovat abych umel soucasne spustit vice her (1 v editoru, 1 jako test, 1 jako main menu, 1 jako vlastni level, 1 jako mezihru.. a vse najednou), takze jsem to musel prepsat (1000+ mist!!)
O tom jestli je vhodne mit jako singleton DirectX Device Manager, File System (treba ja FS jako singleton mam) se da jeste uvazovat.
Ale nedoporucuju mit jako singleton Hru nebo Herni svet.
Taky pozor u singletonu, pokud programujes multithreadove. Pak pri pristupu k nim musis implementovat synchronizaci. _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
|
|