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: 19. listopad 2009, 04:01:49 Předmět: Renderovací funkce přímo ve třídách? |
|
|
Zdravím ve spolek
Mám malý dotaz, ale nejprve intro, ve hře na které ted pracuji, má každá třída která je nějak viditelná, vlastní renderovací funkci, a programátor který se přidal a s kterým na té hře pracuji je hodně proti, navrhuje raději jednu třídu která bude schopná renderovat všechny objekty.
No jenže některé třídy jsou hodně komplexní, mají proměnné které ovlivnůjí to jak bude ten objekt vyrenderován, plus obsahují jiné třídy které je nutno taky renderovat, takže by ta třída na renderování musela znát struktůru a logiku všech objektů které bude možno renderovat.
A protože mi to připadalo pěkně trhlé, a myslím si že by to bylo porušení zapouzdření, raději jsem přidal do každé třídy vlatní renderovací funkci, a vytvořil singleton Renderer, který ty třídy používají, jenže ted nemůžeme pokračovat v práci, dokud se neshodneme a nebo neuděláme kompromis.
Takže otázka, jsem pako já a nebo je pako on?
PS: Těmi třídami myslím třeba, gui, svět, mapu, herní objekty... každá má vlastní renderovací funkci render(), které jsou volané při engine.render() |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 19. listopad 2009, 05:22:11 Předmět: |
|
|
Myslím, že ten programátor má pravdu. Nemusíš nutně hrát na zapouzdření. Cpát všechno do jedné třídy taky není dobrý a vlastně to nic nezapouzdřuje, když je uvnitř jednoho objektu úplně všechno. Základ je rozdělit velké třídy na menší ale obecnější entity, tj. třeba oddělit ostatní data (herní, fyzikální, ...) od grafických dat, nemít to všechno v jedné třídě. Tzn. budeš mít třeba obecný grafický objekt, který bude mít svoji geometrii a parametry materiálů a bude umět sám sebe vyrenderovat. Nepotřebuje znát nic víc. Jiný objekt, co načítá grafická data, ho může inicializovat. Herní objekt může občas během hry změnit jeho parametry (především jeho pozici, občas i materiály, pokud je to třeba) a může tak maximálně zavolat jeho metodu render.
Ber na vědomí, že v některých enginech to může být rozděleno na mnohem více objektů a ten řetěz může být celkem dlouhý, třeba:
Herní objekt -> Grafický objekt -> State tracker -> Vlastní grafické API -> OpenGL.
Asi bych se také vyvaroval použití singletonu a předával bych ten globální objekt do všech objektů přes parametry funkcí (konstruktory, ...). _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 19. listopad 2009, 09:20:32 Předmět: |
|
|
Určitě bych oddělil data podle způsobu užití (grafická, herní, fyzika, ...). Zastřešující třída (Game, Car, Weapon, GUI, ...) by se pak měla starat o synchronizaci těch dat, která jsou sdílená mezi komponentami (např. pozice objektu získaná z fyziky by se měla zpropagovat do grafických dat).
Každá třída, která by byla schopná renderingu, by implementovala rozhraní IRenderable (to je na Tobě, co tam vše bude). Pak bych měl jednu třídu Renderer, do které by se nasypaly všechny potenciálně viditelné objekty implemetující rozhraní IRenderable, a Renderer by se postaral o jejich efektivní vykreslení.
Ještě to zkusím z jiného pohledu (možná to tak bude srozumitelnější): Představ si, že vyvíjíš úplně separátně (nezávisle na sobě) grafický engine (má třídy pro uložení geometrie, textur apod. a jejich vykreslování), fyzikální engine (také má svoje specifické třídy), sound engine (opět nějaké specifické třídy) a herní logiku (zase specifické třídy).
Každý herní objekt pak bude jen třída, která bude obsahovat objekty z výše popsaných enginů a bude se starat o synchronizaci dat mezi nimi (tedy jednotlivými enginy). |
|
Návrat nahoru |
|
 |
sulthan

Založen: 24. 10. 2007 Příspěvky: 104
|
Zaslal: 22. listopad 2009, 02:13:54 Předmět: |
|
|
Mozna me oznacite za vola, ale ja bych se spis zeptal jinak... kdo je vedouci projektu? Proc se odvolavas na nase rozhodnuti a ne na rozhodnuti v ramci tymu.
Podle toho, jak je otazka polozena, tak jses si jisty tim, co je spravne, ne? |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 22. listopad 2009, 10:13:18 Předmět: |
|
|
sulthan napsal: |
Mozna me oznacite za vola, ale ja bych se spis zeptal jinak... kdo je vedouci projektu? Proc se odvolavas na nase rozhodnuti a ne na rozhodnuti v ramci tymu.
Podle toho, jak je otazka polozena, tak jses si jisty tim, co je spravne, ne? |
LOL - tak na takovej projekt bych se vysral, kde by vedouci rekl bude to tak jak jsem rekl a pritom to bylo jako treba v tomhle pripade reseni ktere neni 2x idealni
presne proto je valna cast programatoru ve firmach nespokojena - protoze jejich sefove jsou presne takovi jako se tu stavis ty - vyzaduji svoje reseni ktere jim nekde vykvetlo v mozku a basta |
|
Návrat nahoru |
|
 |
Yossarian

Založen: 28. 07. 2007 Příspěvky: 274 Bydliště: Šalingrad
|
Zaslal: 22. listopad 2009, 11:20:27 Předmět: |
|
|
rezna napsal: |
presne proto je valna cast programatoru ve firmach nespokojena - protoze jejich sefove jsou presne takovi jako se tu stavis ty - vyzaduji svoje reseni ktere jim nekde vykvetlo v mozku a basta |
no, a ted si vem, jak by to vypadalo, kdyby si kazdy programator vyvijel podle toho, jak se to zrovna jemu libi  |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 22. listopad 2009, 11:22:47 Předmět: |
|
|
Yossarian napsal: |
rezna napsal: |
presne proto je valna cast programatoru ve firmach nespokojena - protoze jejich sefove jsou presne takovi jako se tu stavis ty - vyzaduji svoje reseni ktere jim nekde vykvetlo v mozku a basta |
no, a ted si vem, jak by to vypadalo, kdyby si kazdy programator vyvijel podle toho, jak se to zrovna jemu libi  |
to jsem ale nikde nerekl - ale musi byt obe strany ochotne diskuze a prizpusobeni a zjevne kraviny se nesmi dit
proto taky delam ve firme o par lidech - a i tak narazim na totalni idiocii lidi s titulem z informatiky
velkym firmam se vyhybam obloukem - tam jsou duleziti manageri kteri vi vsechno nejlip a projekty potapi jeden za druhym - akorat ze, ten pruser si vzdycky odserou jejich podrizeni a tenhle manager jde proste jenom k jinymu projektu
tzn. tady vic nez ocenuju snahu autora vlakna o to zjistit si nazor i jinde nez u sebe |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 22. listopad 2009, 17:34:00 Předmět: |
|
|
sulthan napsal: |
Mozna me oznacite za vola, ale ja bych se spis zeptal jinak... kdo je vedouci projektu? Proc se odvolavas na nase rozhodnuti a ne na rozhodnuti v ramci tymu.
Podle toho, jak je otazka polozena, tak jses si jisty tim, co je spravne, ne? |
Nikdo není vedoucí, já jsem sice ten projekt založil, a většinu výzkumu a kódu jsem dělal taky já, ale za vedoucího se nepovažuji, bereme to jako týmovou práci bez vedoucího kde není nikdo kdo by komu poroučel.
Jinak pracujeme na tom tři, ten poslední co se přidal je právě proti, proto jsem se šel poradit tady, chtěl jsem věděl nározy ostatních abych věděl jestli je jeho návrh správný a realný, chci to totiž brzy vydat veřejně jako open source, takže jsem proti nějakým drastickým úpravám, když všechno už funguje.
Ted koukám že jsem to asi špatně popsal protože se mi zdá že mi navrhujete to co mám už navrhnuté.
Tak ted jinak a podrobněji, mám třídu Engine, ta obsahuje funkci render(), která volá renderovací funkce render() pro třídu World a GUI, třída World volá renderovací fukce pro třídu Sektor, která zase volá funkci render pro herní objekty, které vlastní objekt třídy Sprite, která má taky funkci render, a která volá funkci Renderer::RenderSprite().
Ta třída Sprite je zase komplexní objekt, obsahuje objekty třídy SpriteFrame, které jsou vlastně obrázky, má v sobě funkce pro načítání rámů ze souboru, animování a renderování.
Tato třída není ale vlastníkem grafických dat, obsahuje jen odkazy, vlastníkem je SpriteCache, která je volána třídou Sprite při načítání dat.
Jinak, jak jde vidět, tak to renderování vypadá nějak takhle Engine->World->Sektor->Objekt->Sprite->Renderer->OpenGL.
Když se na to podívám, tak funkce Engine::render() je vlastně tím renderovacím podsystémem jak tu navrhujete. |
|
Návrat nahoru |
|
 |
|