.[ ČeskéHry.cz ].
Vícevláknový loading zdrojů
Jdi na stránku 1, 2, 3, 4  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
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ň

PříspěvekZaslal: 25. únor 2012, 16:15:18    Předmět: Vícevláknový loading zdrojů Odpovědět s citátem

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



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 25. únor 2012, 16:51:44    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 25. únor 2012, 16:58:30    Předmět: Odpovědět s citátem

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



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 25. únor 2012, 17:15:39    Předmět: Odpovědět s citátem

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. Wink
_________________


Naposledy upravil Crypton dne 25. únor 2012, 17:16:38, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



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

PříspěvekZaslal: 25. únor 2012, 17:15:43    Předmět: Odpovědět s citátem

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. Wink

EDIT: Ještě vymyslet podobný postup pro linux...
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 25. únor 2012, 17:58:56    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
VODA



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

PříspěvekZaslal: 25. únor 2012, 18:00:38    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 25. únor 2012, 19:36:08    Předmět: Odpovědět s citátem

Tak díky za pomoc. Very Happy
_________________
Opravdovost se pojí s trýzní...
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: 25. únor 2012, 20:32:18    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 25. únor 2012, 21:43:46    Předmět: Odpovědět s citátem

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... Crying or Very sad
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 25. únor 2012, 22:00:17    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
VODA



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

PříspěvekZaslal: 25. únor 2012, 22:32:57    Předmět: Odpovědět s citátem

Vilem Otte napsal:
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.

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í... Shocked
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1561

PříspěvekZaslal: 25. únor 2012, 22:47:09    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 25. únor 2012, 22:55:25    Předmět: Odpovědět s citátem

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



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 25. únor 2012, 22:58:27    Předmět: Odpovědět s citátem

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
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 -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3, 4  Další
Strana 1 z 4

 
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