Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 11. listopad 2007, 09:49:29 Předmět: LPDIRECT3DDEVICE - kam s nim ? Singleton ? Referencia ? |
|
|
V predoslej diskusii o designe 3D enginu bol jeden zaujimavy link na nazor o singletonoch. Padla tam aj zmienka o tom, ze casto pouzivane parametre by mohli byt referencovane v triedach.
Dotycnemu to prislo ako "ciste", ze to vsade vchadza ako parameter, co je ale vrcholne nepohodlne.
Na druhej strane, je podla mna absurdne, aby kazda trieda mala vlastnu referenciu na LPDIRECT3DDEVICE - to by bol uz bordel, aby to clovek ustrazil pri stovkach tried, ze kde to je a kde este nie je zinicializovane.
Tu mi pride globalna premenna ako najpraktickejsie riesenie.
Ja to tak sice nepouzivam, lebo to pcham do kazdej funkcie ako parameter, ale pri buducom refactore by som to uz rad zriesil nejako pohodlnejsie a cistejsie.
Nejake napady ? |
|
Návrat nahoru |
|
|
Mnemonic
Založen: 28. 07. 2007 Příspěvky: 93
|
Zaslal: 11. listopad 2007, 10:24:49 Předmět: |
|
|
Posilat vsude LPDIRECT3DDEVICE mi taky prijde absurdni. Ale posilat vsude nejaky "globalni manager", tedy objekt, ktereho se doptas na ruzne sdilene odkazy (treba vcetne toho D3D device, ale to by mela byt spis vlastnost rendereru), to uz mi tak absurdni neprijde, protoze to presne tak delam |
|
Návrat nahoru |
|
|
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 11. listopad 2007, 10:31:41 Předmět: |
|
|
Ale to je vlastne to iste, ked budes posielat nejaky iny objekt, z hladiska pohodlnosti (furt musis daco pisat do vstupnych parametrov a ked v nejakej funkcii vnorenej do 4 urovne zistis, ze to potrebujes, tak zrazu musis zasvinit vsetky hlavicky 3 urovne vyssie), i ked je to aspon o to cistejsie, ze tam uz mas viacej objektov.
Singleton by mal tu vyhodu, ze ho vidi kazda trieda a nikde nemusi vstupovat ako parameter. Ale to by uz bol vlastne globalnou premennou, cize by to bola len kamuflaz
Cize, pre pohodlnost globalna premenna, ale co pre cistotu designu (mne to neprijde osobne designove ciste, to pchat ako parameter vsade) ? |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 11. listopad 2007, 11:04:21 Předmět: |
|
|
posilani referenci je nepohodlne, ale IMHO prave objektove ciste.
podle me ve spravnem objektovem navrhu bys mel vystacit s prave 0 globalnimi promennymi/objekty (resp. singleton - bo to je jenom schovani globalni promenne za jeji inicializaci)
s tim ze si posilas primo LP...DEVICE je to podle me spatne - protoze pak opravdu vsude musis kontrolovat jestli uz je nastaveny nebo ne - tu je cistejsi to delat jak to ma Mnemonic - zaobalujici trida, ktera ti tu referenci/pointer preda - vyhoda je v tom ze ten "test" jestli uz je device ready mas potom na jednom miste.
obecne ale pokud vim ze v aplikaci je treba prave jeden objekt daneho druhu (tedy treba ten Engine nebo device) - tak bych se spis priklonil k pouziti singletonu - nebude to uplne objektove ciste, ale bude to zase kodove cistejsi. |
|
Návrat nahoru |
|
|
Quiark
Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 11. listopad 2007, 11:07:31 Předmět: |
|
|
Podle mě se člověk musí zamyslet, jaké mu může přinést problémy, když to bude mít v globální proměnné/singletonu. Designovou čistotu bych sem v tomhle případě netahal, protože se jedná o jeden specifický případ.
Jediný problém, který mě napadá je, jak už jsem asi třikrát psal, kdybys chtěl mít více instancí toho device a potom rozlišovat, které třídy budou používat kterou instanci.
Další možné řešení, které mě teď napadlo je v The Nebula Device (nebo alespoň něco podobného). Tam mají strom objektů a v tomto případě by mohl být ten direct3D device kořenem takového stromu (a každý objekt ve stromu se umí dostat na jeho kořen). Pak by v případě potřeby více dx devices bylo možné mít více stromů, přičemž v daném stromě by byly objekty závislé na jeho kořeni.
Samozřejmě vícenásobný dx device je docela diskutabilní záležitost. _________________ Mám strach |
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 11. listopad 2007, 14:31:24 Předmět: |
|
|
no v predchazdjucom threade MD nieco hovoril ze sa musel zbavit singletonov aby mohol spustit dve runtime naraz. to znamena ze singleton je spolocny aj pre dve instancie spusteneho prgramu? to snad nie. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
Quiark
Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 11. listopad 2007, 14:35:04 Předmět: |
|
|
Zřejmě chtěl spustit dvě runtime v jednom procesu. _________________ Mám strach |
|
Návrat nahoru |
|
|
MD
Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 11. listopad 2007, 15:04:15 Předmět: |
|
|
Ja pouzivam asi mix uplne vseho: Pokud je neco, u ceho si sem jistej, ze je naprosto nelogicke to mit 2krat, tak mam singleton, obcas predavam objekty v parametrech, ale asi nejvice pouzivam tu stromovou hierarchii. Priklad: objekt Expression se postupne dokaze dostat ke vsem svym rodicum: Statement, MethodAnalysys a Compilation (pozn. Nejsou to predci ve smyslu objektovho dedeni ) a z nich pak ma pristupne uplne vse. Protoze tam mivam pomerne velkou hloubku rekurze, tak radeji, nez abych pro dany blok kroku predaval parametry, tak si vytvorim specializovanou tridu, ktera parametry prevezme a sama to udela. Taky se daji parametry sdruzovat ve tride (strukture) a pak je predavat nebo vracet v jednom "baliku".
2nou: jj je to v jednom procesu. Predstav si ze mas napriklad editor levlu (ktery uz sam o sobe vyuziva runtime (nebo engine, chces-li)), neco tam pridas a chces to vyzkouset aniz bys editor ukoncoval (-> novy runtime). Podobne je to s vyvojovym prostredim, kde si pises skriptiky a muzes je spoustet a ladit (take paralelne). Puvodne jsem mel "Runtime" jako singleton, takze jsem pak predelaval asi milion odkazu ... _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
|
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 11. listopad 2007, 16:56:13 Předmět: |
|
|
rezna napsal: |
posilani referenci je nepohodlne, ale IMHO prave objektove ciste. |
To je prave ta ironia. je to sice ciste, ale nepohodlne
rezna napsal: |
s tim ze si posilas primo LP...DEVICE je to podle me spatne - protoze pak opravdu vsude musis kontrolovat jestli uz je nastaveny nebo ne |
Nechapem, preco by som to mal vsade kontrolovat. To staci len raz pri inicializacii gfx modu (Alt-Tab neratam - to je separe problem). Potom uz to nepotrebujes testovat, ci je to inicializovane nikdy pocas behu enginu.
rezna napsal: |
tu je cistejsi to delat jak to ma Mnemonic - zaobalujici trida, ktera ti tu referenci/pointer preda - vyhoda je v tom ze ten "test" jestli uz je device ready mas potom na jednom miste. |
Vyhodu vidim skor v tom, ze tam mozes predat viacero polo-globalnych instancii, pekne zapuzdrenych v 1 triede.
rezna napsal: |
obecne ale pokud vim ze v aplikaci je treba prave jeden objekt daneho druhu (tedy treba ten Engine nebo device) - tak bych se spis priklonil k pouziti singletonu - nebude to uplne objektove ciste, ale bude to zase kodove cistejsi. |
Bude to aj prehladnejsie, co rozhodne nie je na skodu.
Ja ked teraz prezeram hlavickove subory a v kazdej tretej funkcii vidim LPDIRECT3DDEVICE m_pd3dDevice, tak to hodne rusi a dosial som si na to za tie roky nezvykol - odvadza to totiz pozornost, kedze je to tak dlhy zhluk pismen, preto s tym chcem nieco urobit.
Asi tam radsej hodim singleton, nech je to prehladnejsie - cisty design je pekna vec, ale urcite nie za cenu znizenej orientacie. |
|
Návrat nahoru |
|
|
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 11. listopad 2007, 17:05:39 Předmět: |
|
|
Quiark : Fakt by ma zaujimalo prakticke vyuzite viacerych devices. Ake to vlastne su ? |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 11. listopad 2007, 17:14:39 Předmět: |
|
|
VladR:
kód: |
#define PD3D LPDIRECT3DDEVICE |
to preci jisti ne? |
|
Návrat nahoru |
|
|
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 11. listopad 2007, 17:27:11 Předmět: |
|
|
VladR - running in circles spreading unarticulated screams...
....
5 minutes later....
To mam za to, ze som takym zaprisahlym odporcom makier... |
|
Návrat nahoru |
|
|
Mnemonic
Založen: 28. 07. 2007 Příspěvky: 93
|
Zaslal: 11. listopad 2007, 17:27:33 Předmět: |
|
|
Nevim, jak dalece je to "objektove ciste", ale mam tridu Game, jejiz instanci predavam vetsine hernich objektu uz v kontruktoru (tedy vsem autonomnim objektum typu Actor, ne pidiobjektum jako Point), a ty si na ni pak drzi odkaz. A pres Game se jsem schopen odkudkoliv dostat na Renderer, TextureManager, SoundManager, ScriptManager atd. Duvod je prave ten zmineny, ze potrebuji mit v jedne aplikaci vic Game objektu (editor = vic dokumentu). Za ty roky se mi to dobre osvedcilo, a ani me moc neotravuje, ze kazdy konstruktor musi mit jako prvni parametr odkaz na Game.
Ciste akademicky objektove vzato, asi neni uplne idealni, ze si kdejaky objekt muze sahat na kterykoliv herni manazer, ale v praxi je to pohodlne a efektivni. |
|
Návrat nahoru |
|
|
Quiark
Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 11. listopad 2007, 17:28:54 Předmět: |
|
|
VladR: To byl jen hypotetický námět na zamyšlení. V praxi se to asi nevyskytuje. _________________ Mám strach |
|
Návrat nahoru |
|
|
goddard
Založen: 06. 11. 2007 Příspěvky: 175 Bydliště: Brno
|
Zaslal: 11. listopad 2007, 17:44:43 Předmět: |
|
|
je asi lepsi udelat jedinacka ktery bude vracet odkaz na device, a ty odkazy pak pouzivat tam kde je potreba.
globalni promenna neni dobry napad, protoze jediny zpusob jak si ohlidat zda jsem nekde neumyslne nezmenil objekt reprezentujici device je cpat nejaky test vsude mozne. coz zvysuje nekolikrat nachylnost k chybe a zhorsuje to udrzovatelnost kodu.
jeste by snad slo udelat konstantni odkaz ktery ukazuje jen na dany device a ten pak pouzivat vsude. jenze to zase nezajisti ze si nevyrobim nekde jiny odkaz na device. proste je lepsi kodovat defenzivne a pouzit jedinacka. |
|
Návrat nahoru |
|
|
|