Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 25. únor 2012, 16:15:18 Předmět: Vícevláknový loading zdrojů |
|
|
Zdravím,
snažím se o víkendu zprovoznit pár nových věcí v enginu. Konkrétně teď, načítání zdrojů na pozadí během renderování animované loading obrazovky (aby bylo vidět, že program něco dělá).
Mám hlavní vlákno, kde vytvořím loader, ten vykresluje animovaný loading screen, rovněž na začátku vytvoří nové vlákno pro načítání požadovaných zdrojů a pustí jej.
Jenže jsem narazil na to, že OpenGL kontext může být aktivní pouze v jednom vlákně (resp. jsem to našel přes Google). Což znamená, že OpenGL v načítacím vlákně nereaguje. Někde jsem našel, že by to mělo jít nějak nasdílet (na Windows předpokládám pomocí wglShareLists, na Linux také něco bude).
Ale nějak se mi to nedaří rozfungovat. Neřešili jste to? Nebo nevíte jak na to?
Díky za pomoc. _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 25. únor 2012, 16:51:44 Předmět: |
|
|
Podobnou věc jsem již řešil (myslím vícevláknový loading, OpenGL jsem zbytečně na více vláken neroztahával - nicméně koukni na specifikaci glXCreateContext - http://www.opengl.org/sdk/docs/man/xhtml/glXCreateContext.xml)...
Loading (HDD -> RAM) je nejlepší odložit na jiné vlákno (pokud formát ještě potřebuješ parsovat, tak nejlépe odložit na jiné vlákno - protože je to pomalé). Jakmile máš loading z disku do paměti hotový, je tahle část hotová, přichází druhá fáze:
Loading (RAM -> VRAM) je vhodný řešit takto - http://www.songho.ca/opengl/gl_pbo.html#unpack.
Snad to trochu pomůže... _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 25. únor 2012, 16:58:30 Předmět: |
|
|
opengl by som asi do viacerych vlakien netahal.
a ako otte odkazal tak proste v main vlakne namapovat buffer, pointer poslat do load vlakna, nacitat do namapovaneho priestoru data, poslat signal ze uz jea nasledne zase v opengl vlakne odmapovat. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Crypton

Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 25. únor 2012, 17:15:39 Předmět: |
|
|
Já jsem to z počátku dělal tak, že jsem si v jednom vláknu ty data jen načetl a připravil, a až v tom hlavním vláknu, kde jsem prováděl render scény, jsem si (až při prvním použití) ty data (pro textůry a meshe) nahrál do VRAM. Takže jsem nepotřeboval dva kontexty, a ve VRAM jsem neměl data, které jsem třeba ani jednou nepoužil. A kupodivu to běželo svižně, žádné zamrzání, a ani nějaký šíleně snížený pokles ve FPS.
Ale jestli jde jen o zobrazení průběhu načítání dat, aniž by ti ta hra "zamrzla", tak to jde vyřešit i přes jednoduchý callback.  _________________

Naposledy upravil Crypton dne 25. únor 2012, 17:16:38, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 25. únor 2012, 17:15:43 Předmět: |
|
|
Nakonec jsem to udělal podle této stránky (druhý kód) a zdá se zatím, že to funguje.
Podrobnější popis jak se mi to povedlo udělat napíši až to pořádně otestuji, hlavně na shaderech, ty dělají nejvíce problémů...
Díky.
EDIT: Ještě vymyslet podobný postup pro linux... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 25. únor 2012, 17:58:56 Předmět: |
|
|
Co třeba takhle?
kód: |
Thread_1:
glrc1=glXCreateContext(xdisplay, xvisinfo, NULL, true);
glrc2=glXCreateContext(xdisplay, xvisinfo, glrc1, true);
glXMakeCurrent(xdisplay, xwindow, glrc1);
RunMyGame();
Thread_2:
glXMakeCurrent(xdisplay, xwindow, glrc2);
LoadTexturesOnTheFly();
|
Mělo by to dělat totéž co kód, který je na té stránce (až na to, že nemá ošetřené možné chyby!). _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 25. únor 2012, 18:00:38 Předmět: |
|
|
No, tak asi jo, já se na to zatím nedíval, ale je jasné, že to bude hodně podobné jako na Windows...
Zatím se to snažím otestovat na shaderech, ale shadery prostě trošku zlobí... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 25. únor 2012, 19:36:08 Předmět: |
|
|
Tak díky za pomoc.  _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 25. únor 2012, 20:32:18 Předmět: |
|
|
Asi hloupá otázka, ale kde vezmu XVisualInfo. Resp. vím jak zjistit všechny dostupné visuals, ale já bych potřeboval konkrétně už vytvořeného okna (nějak z Display nebo Window)...
EDIT: Tak už je to jedno, na Linuxech to nefunguje. Jak je to vůbec s GL funkcema, jsou thread-safe? Asi ne co? Všiml jsem si právě toho, že během toho načítání se vygeneruje index pro program, ale nezkompiluje se a index pro textury se negeneruje vůbec. Vždy to vrátí 0.
Škoda, tak hezky to na těch Windowsech vypadá, když se na obrazovce točí ozubená kola a na pozadí se loadují zdroje. _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 25. únor 2012, 21:43:46 Předmět: |
|
|
Pro ukázku, takhle jsem chtěl aby to vypadalo. Zaměrně jsem v načítacím vlákně strčil asi 4s sleep, aby to bylo trochu delší.
Pro méně chápavé, během načítací obrazovky, kdy se točí ozubená kola se nahrávají herní zdroje, textury, shadery, modely, jiná herní i neherní data...
Linux mi to zhatil, taková bezva fíčura...  _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 25. únor 2012, 22:00:17 Předmět: |
|
|
Nezhatil - toto by se nemělo dělat přes více vláken, tahat OpenGL na více vláken není moc dobré (jak si již zmínil, ty funkce nejsou Thread-safe, ani funkce XLib nejsou Thread-safe - a je třeba všechno ošetřovat!).
ad XVisualInfo - ideálně pomocí glXGetVisualFromFBConfig, do něj potřebuješ FBConfig, všechny které máš k dispozici získáš pomocí glXChooseFBConfig, a potom z nich vybereš. Pomůžou ti k tomu funkce glXGetFBConfigAttrib.
Ještě jedna otázka, padá to na glX, nebo na Xku? Zkus kouknout na toto - http://www.x.org/archive/X11R6.8.2/doc/XInitThreads.3.html#sect1, teda v případě že ti to padá na Xku. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 25. únor 2012, 22:32:57 Předmět: |
|
|
Ono to nepadá, jen se ty zdroje (hlavně textury) nenačtou. Ale jinak se mi povedlo nakódit vše (až na ten XVisualInfo) podobně jako na Windows.
Vilem Otte napsal: |
toto by se nemělo dělat přes více vláken, tahat OpenGL na více vláken není moc dobré |
Jenže jak to jinak udělat...když budu mít zdroj, který se bude načítat (a tím myslím z disku i na kartu) třeba 20s, tak bez nějakého signálování to jinak neudělám. Jak už bylo řečeno, možností by bylo nechat v jiném vlákně načítat pouze data z disku, jenže to by znamenalo překopat celý engine...znovu...a na to už fakt nemám...
Když se podíváte, tak v moderních hrách je normální, že při loadingu se tam točí nějaké ukazovátko, aby bylo vidět, že aplikace nezamrzla...
No, mám teď dvě možnosti. Buď budu vyvíjet jen pro Windows a nechám si tuhle fajn fíčuru a mohu zahodit všechny věci, kóděné pro Linux a nebo zahodím tohle a bude vyvíjet pro obě platformy, bohužel bez tohoto...
Těžké to rozhodnutí...  _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 25. únor 2012, 22:47:09 Předmět: |
|
|
Tak udělej kompromis: Na linuxu holt budou loadovací obrazovky statické a budou se hýbat jen na windows (tento z mého pohledu detail můžeš koneckonců dodělat později i na linux, až zjistíš, jak). _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
 |
perry

Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 25. únor 2012, 22:55:25 Předmět: |
|
|
Nejde jen o točení kolečka... často to "kolečko" funguje jako progress bar.. což mi přijde dobrý.. pak vím že to něco dělá a ne že se jen točí kolečko a jinak se to seklo _________________ Perry.cz |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 25. únor 2012, 22:58:27 Předmět: |
|
|
a ako si vytvaras okno. sam pomocou glx alebo mas na to framework. pokial si spominam tusim si pouzil SDL co dost efektivne brani pristupovat poriadne k tvorbe kontextu. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
|