.[ ČeskéHry.cz ].
Jaderná část enginu
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
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

PříspěvekZaslal: 28. srpen 2012, 20:45:58    Předmět: Jaderná část enginu Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 28. srpen 2012, 21:01:17    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 28. srpen 2012, 21:40:24    Předmět: Odpovědět s citátem

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" Smile

Proste, musis si polozit otazku - chces byt ty otrok enginu, alebo ma engine otrocit tebe Very Happy ? Je engine ten finalny komponent, alebo len prostriedok ako zabit cas popri kodeni hry ?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 28. srpen 2012, 23:01:30    Předmět: Odpovědět s citátem

VladR napsal:
chces byt ty otrok enginu, alebo ma engine otrocit tebe

Obě možnosti jsou ekvivalentní ale. Smile (záměr?)
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VladR



Založen: 30. 07. 2007
Příspěvky: 1322
Bydliště: Greater New York City Area

PříspěvekZaslal: 28. srpen 2012, 23:35:08    Předmět: Odpovědět s citátem

Marek napsal:
VladR napsal:
chces byt ty otrok enginu, alebo ma engine otrocit tebe

Obě možnosti jsou ekvivalentní ale. Smile (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 Twisted Evil

"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 Twisted Evil
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 29. srpen 2012, 00:23:02    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Jakub Doucek



Založen: 08. 12. 2011
Příspěvky: 14
Bydliště: Pardubice

PříspěvekZaslal: 29. srpen 2012, 06:59:14    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 29. srpen 2012, 07:27:07    Předmět: Odpovědět s citátem

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? Wink
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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 29. srpen 2012, 08:36:57    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 29. srpen 2012, 10:11:51    Předmět: Odpovědět s citátem

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í Smile
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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Jakub Doucek



Založen: 08. 12. 2011
Příspěvky: 14
Bydliště: Pardubice

PříspěvekZaslal: 29. srpen 2012, 10:34:31    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
mar



Založen: 16. 06. 2012
Příspěvky: 610

PříspěvekZaslal: 29. srpen 2012, 10:56:03    Předmět: Odpovědět s citátem

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) Smile
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
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 29. srpen 2012, 11:23:13    Předmět: Odpovědět s citátem

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é Smile), 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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 29. srpen 2012, 14:30:24    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 29. srpen 2012, 14:46:26    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna