Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Jakub Doucek
Založen: 08. 12. 2011 Příspěvky: 14 Bydliště: Pardubice
|
Zaslal: 28. srpen 2012, 20:45:58 Předmět: Jaderná část enginu |
|
|
Smolím si vlastní engine a řeším jakým způsobem implementovat graphic core (vlastně se ta problematika dotýká jakékoliv části jádra enginu). Jde mi v podstatě o zastřešení grafické knihovny do vlastního rozhraní. Napadají mě tři možnosti, jak to řešit ale nemůžu se rozhodnout, která bude nejlepší.
1. Singleton - pravděpodobně by se instancoval při startu aplikace a pokaždé, když bych chtěl něco vykreslit, tak by bylo potřeba získat pointer, což se mi zdá mírně nešikovné.
2. Třída s veřejnými metodami - pořád je to třída, takže může nějakým způsobem dodržovat určité rozhraní. Navíc by se její metody volali celkem jednoduše.
3. Funkce zabalené do namespace - samozřejmě ten namespace by tam ani být nemusel ale pro přehlednost bych ho tam určitě dal.
Co myslíte? Jak jste řešili tento problém? |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 28. srpen 2012, 21:01:17 Předmět: |
|
|
singleton je trida - ale ma nevyhodu, ktera se tu nekolikrat resila - neudelas je 2!
problemu na 'ziskani' pointeru bych se opravdu nebal - to se da velice dobre vyoptimalizovat a vyresit
ale problem nemoznosti vytvorit enginy 2 v jednom programu je zasadni - treba v momente kdy clovek dela editor a chce v nem otevrit dve sceny tak pekne narazi
takze trida s danym rozhranim a pekne predavat |
|
Návrat nahoru |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 28. srpen 2012, 21:40:24 Předmět: |
|
|
Problem je, ze toto je tazky flamewar - toto su subjektivne veci - ja ked vidim engine ako singleton, tak sa mi vo vrecku startuje motorova pila, niekto iny to iste pri moznosti c.2. Kazdemu vadi nieco ine a bude sa bit do hrude, ze je to ta najlepsia mozna alternativa.
Nech uz zvolis kerukolvek alternativu, tak ten namespace ani len neuvazuj ako o puhej alternative, ale ber to ako hotovu vec.
Pokial si ale engine totalne odseparujes od kodu hry do separe namespaceu, tak sa priprav na nekonecne dlhe deklaracie/definicie, co sa na 2 riadky nevojdu. Pokial teda, nepouzijes nazov enginu namespacu "namespace E"
Proste, musis si polozit otazku - chces byt ty otrok enginu, alebo ma engine otrocit tebe ? Je engine ten finalny komponent, alebo len prostriedok ako zabit cas popri kodeni hry ? |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 28. srpen 2012, 23:01:30 Předmět: |
|
|
VladR napsal: |
chces byt ty otrok enginu, alebo ma engine otrocit tebe |
Obě možnosti jsou ekvivalentní ale. (záměr?) _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 28. srpen 2012, 23:35:08 Předmět: |
|
|
Marek napsal: |
VladR napsal: |
chces byt ty otrok enginu, alebo ma engine otrocit tebe |
Obě možnosti jsou ekvivalentní ale. (záměr?) |
Preco ? Keby tam bola koncovka "-a" ("(z)otrocit teba"), vtedy by to bolo to iste.
Moja pointa je, ze pred 8 rokmi som bol otrokom enginu ja, kdezto teraz som ja ten, kto rozkazuje a engine len poslusne klopi usi
"Co bolo, to bolo, terazky som 3D koderom" (TM)
Pokial ale narazas na otrocenie v zmysle kodenia hry, tak to samozrejme, plne, suhlasim - to je, de facto, dozivotny rozsudok  |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 29. srpen 2012, 00:23:02 Předmět: |
|
|
No já nechápu rozdíl mezi "tebe" a "teba" ve slovenštině.
Doživotní rozsudek to být nemusí. Člověk se může rozhodnout dělat něco jinýho než hry. Ovšem neřekl bych, že takové 3D drivery jsou zrovna lepší možnost co se nervů týče. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Jakub Doucek
Založen: 08. 12. 2011 Příspěvky: 14 Bydliště: Pardubice
|
Zaslal: 29. srpen 2012, 06:59:14 Předmět: |
|
|
rezna napsal: |
singleton je trida - ale ma nevyhodu, ktera se tu nekolikrat resila - neudelas je 2!
|
Ano ale to já přeci chci. Nevidím problém v tom vytvořit dva enginy. Za prvé neplánuju vytvářet třídu Engine, ve které by bylo úplně vše. Naopak bych jednotlivé části enginu rád držel odděleně aby se dali používat i samostatně. Jde tedy jen o to zavolat:
kód: |
CGraphic *gr = CGraphic::GetInstance();
gr->drawImage(...); |
A to můžu kdekoliv a kolikrát chci.
citace: |
Pokial si ale engine totalne odseparujes od kodu hry do separe namespaceu, tak sa priprav na nekonecne dlhe deklaracie/definicie, co sa na 2 riadky nevojdu. |
Vždyť to přeci vyjde nastejno jestli budu volat
kód: |
Graphic::DrawImage(...); |
DrawImage z namespace nebo ze statické metody. Naopak u namespace si to můžu zkrátit tím, že použiju using.
Přijde mi to ovšem jako výhoda. Nevadí mi napsat víc textu, když získám přehlednější kód.
Myslím, že to začnu nějak kodit a uvidím, jak mi to vyhovuje... |
|
Návrat nahoru |
|
 |
Mem

Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 29. srpen 2012, 07:27:07 Předmět: |
|
|
Marek napsal: |
No já nechápu rozdíl mezi "tebe" a "teba" ve slovenštině. |
Tak když nerozumíš slovensky, tak proč na to reaguješ a vymýšlíš si něco o ekvivalenci?
engine má otročiť tebe [těbe] - engine má sloužit tobě
engine má otročiť teba [těba] - engine bude zotročovat tebe
Jakub: Nevím, jestli jsi řezňu pochopil. Ten ti říká, že nevytvoříš 2 instance třídy vzoru singleton, což by se ti ale v praxi mohlo někdy hodit (viz ten editor), a z toho důvodu bys měl zvážit, jestli do toho jít. To, že získáš pointer na ten singleton kdekoliv v enginu je jasné, pokud použiješ svou třídu, budeš si ho muset nějak předávat, ale to taky není problém. |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 29. srpen 2012, 08:36:57 Předmět: |
|
|
Jakub Doucek napsal: |
rezna napsal: |
singleton je trida - ale ma nevyhodu, ktera se tu nekolikrat resila - neudelas je 2!
|
Ano ale to já přeci chci. Nevidím problém v tom vytvořit dva enginy. Za prvé neplánuju vytvářet třídu Engine, ve které by bylo úplně vše. Naopak bych jednotlivé části enginu rád držel odděleně aby se dali používat i samostatně. Jde tedy jen o to zavolat:
kód: |
CGraphic *gr = CGraphic::GetInstance();
gr->drawImage(...); |
A to můžu kdekoliv a kolikrát chci.
|
jenomze ono toto
kód: |
CGraphic *gr = CGraphic::GetInstance();
gr->drawImage(...); |
musi byt nejak inicializovany, mit okno, GL/DX kontext - a v tom pripade proste neudelas dve kreslici okynka v jedne aplikaci - zamrznes s jednim
v jistym case je to OK, ale pak presne prichazi ta rozhodnuti jako, kruci ted by se mi hodilo abych ten TextureManager mohl mit dvakrat a je to v pytli
navic Singleton je de facto proste globalni promenna - a tech by se clovek proste mel vyvarovat - doba se posunula |
|
Návrat nahoru |
|
 |
mar
Založen: 16. 06. 2012 Příspěvky: 610
|
Zaslal: 29. srpen 2012, 10:11:51 Předmět: |
|
|
No nevím, ale zrovna textury jsou mezi kontexty v OpenGL doufám sdílené?
Určitě bych byl nerad, abych musel každou texturu znovu někam ládovat jenom kvůli tomu,
že si vykreslím 4-krát totéž do různých oken s jinak nastevenou kamerou a projekcí
Mělo by snad stačit přepnout kontext a kreslit.
Kdysi jsem něco takového řešil a nevzpomínám si, že by v tom byl problém... |
|
Návrat nahoru |
|
 |
Jakub Doucek
Založen: 08. 12. 2011 Příspěvky: 14 Bydliště: Pardubice
|
Zaslal: 29. srpen 2012, 10:34:31 Předmět: |
|
|
rezna napsal: |
jenomze ono toto
kód: |
CGraphic *gr = CGraphic::GetInstance();
gr->drawImage(...); |
musi byt nejak inicializovany, mit okno, GL/DX kontext - a v tom pripade proste neudelas dve kreslici okynka v jedne aplikaci - zamrznes s jednim
v jistym case je to OK, ale pak presne prichazi ta rozhodnuti jako, kruci ted by se mi hodilo abych ten TextureManager mohl mit dvakrat a je to v pytli
navic Singleton je de facto proste globalni promenna - a tech by se clovek proste mel vyvarovat - doba se posunula |
Inicializace aplikace probíhá na zcela jiném místě. Neplánuju ani v budoucnu vytvářet dvě okna aplikace. Nejsem si jistý jestli by mi to vůbec sdl umožnilo. Pokud bych chtěl v jednom okně více "pohledů", tak to budu řešit spíš přes viewporty nebo tak nějak.)
Šlo mi ale o trochu něco jiného. Managery budu řešit zvlášť. Jde spíš o to jak zastřešit základní funkce grafické knihovny. Například místo:
kód: |
glBegin(GL_TRIANGLES);
glVertex3f(...);
glVertex3f(...);
glVertex3f(...);
glEnd();
|
abych mohl napsat:
kód: |
drawTriangle(new MyTriangle(...));
|
Nebudu potřebovat ukládat žádné stavy a vlastně asi vůbec nic nebudu muset ukládat (alespoň si to teď myslím), takže singleton není problém jde spíš o to jestli je teda vůbec nutný používat něco takového jako je singleton. |
|
Návrat nahoru |
|
 |
mar
Založen: 16. 06. 2012 Příspěvky: 610
|
Zaslal: 29. srpen 2012, 10:56:03 Předmět: |
|
|
Zabalit low level API je IMHO dobrý nápad (ale asi do metody nějaké třídy, nebo alespoň předat (context/renderer/device/jakkoli to nazveš) jako parametr)
PS Pokud budeš kreslit každý trojúhelník zvlášť (a zároveň budeš kvůli každému alokovat /uvolňovat paměť),
nepočítej, že se ti to bude moc hýbat (pokud jich nehodláš kreslit jenom pár)
Takhle to fungovalo v dobách starého dobrého 3dfx, kdy si člověk clipping
dělal ručně a volal pak Glide, mělo to své kouzlo.
Dnes pochopitelně letí dávkové zpracování. |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 29. srpen 2012, 11:23:13 Předmět: |
|
|
Zabalit API je určitě dobrý nápad... a to celé.. já mam zabalené API přes vsrtvu abstraktních tříd.
Tzn. engine jako takový neví v čem renderuje. Když na začátku vyměním inicializační flag, tak přepnu DX na OpenGL (teda za předpokladu, že bych to měl implementované ), popř. na ray-tracer apod.
Singleton bych použil max. na kontext zařízení, a na obalovací funkce mého API, jinak ne
př.
kód: |
abstract class VertexBuffer
{
virtual void Render() = 0;
.... další metody
}
class VertexBufferDX11 : VertexBuffer
class VertexBufferDXOpenGL : VertexBuffer
a pak inicializátor
VertexBufferInitializator::Init(DX11);
VertexBuffer * vb = VertexBufferInitializator::Create();
|
v Init vytvořím singleton, Create pak vezme ten singleton a podle typu vrací buď new VertexBufferDX11 nebo VertexBufferOpenGL _________________ Perry.cz |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 29. srpen 2012, 14:30:24 Předmět: |
|
|
Pár věcí...
1) Textury v OpenGL jsou defaultně nesdílené mezi kontexty, ale dá se při vytvoření kontextu zadat, že textury sdílet chci. Má to ale háček - modifikace nad texturama (např. glTexImage) nemusí být za určitých okolností okamžitě vidět v jiných kontextech.
2) Jo, singleton je jenom globální proměnná, takže je to dost amaterské řešení. Problém je v tom, že všechny objekty, které do toho singletonu dáš, jsou pak automaticky globální taky, takže budeš mít prakticky celej engine v globálních proměnných a ještě budou silně provázané, což je další zásadní nevýhoda. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 29. srpen 2012, 14:46:26 Předmět: |
|
|
Marek napsal: |
2) Jo, singleton je jenom globální proměnná, takže je to dost amaterské řešení. Problém je v tom, že všechny objekty, které do toho singletonu dáš, jsou pak automaticky globální taky, takže budeš mít prakticky celej engine v globálních proměnných a ještě budou silně provázané, což je další zásadní nevýhoda. |
To je přesně důvod, proč jsem přestal úplně používat statické metody a atributy...
Kdysi se to tu řešilo, i když ani nevím, k čemu jsme v threadu došli (já jsem došel k závěru že singleton = špatný návrhový vzor)... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
|