Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Poky
Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 26. prosinec 2014, 15:16:50 Předmět: OpenGL ES 2 - update a draw |
|
|
Zdravím všechny,
mám takový dotaz. Pro projekt do školy mám vytvořit aplikaci pro Android v Jave, a protože jsem kdysi dávno dělal Pong3D pro klasické PC (také v Jave), napadlo mě překodit to do mobilní verze, jenže jsem se zasekl na jedné (asi) kravině.
Na mobilních zařízeních není nekonečný while cyklus, kde se provádí update a draw, ale onDrawFrame event a zde nastává má otázka. Jak řešíte update objektů (myslím obecně)? Děláte to vše v této metodě nebo v onDrawFrame jen vykreslujete a o update se stárá "něco jiného" nezávisle. Pokud je to druhá možnost, jak dosahujete oné nezávislosti (PS: Do vláken se mi moc nechce ...), když není možné použít nekonečný cyklus... (Nebo je )
Díky moc za odpověď. |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 26. prosinec 2014, 17:00:55 Předmět: |
|
|
A co si takhle vnitřek toho nekonečného cyklu představit jako volání metody onDrawFrame?
kód: |
while(true)
{
onDrawFrame();
} |
Takže se vlastně samotným cyklem nebudeš zabývat... onDrawFrame může vypadat takto (což znáš):
kód: |
void onDrawFrame(void)
{
float dt = getElapsedTime();
doInput();
updateSimulation(dt);
clearBuffers();
renderFrame();
swapBuffers();
} |
Pokud nemám pravdu, tak mě opravte. Ale já bych se to pokusil udělat přesně takhle. onDrawFrame se bude volat s nějakou cca "fixní" periodou, takže bych typoval, že to takhle bude fungovat. Ale žádnou OpenGL aplikaci pro Android jsem nedělal, takže se mohu plést. _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
Poky
Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 26. prosinec 2014, 17:16:48 Předmět: |
|
|
Jj to samozřejmě vím, toto řešení mě také napadlo, jen se mi právě trochu nelíbí, že by se Renderer (onDrawFrame je jeho metoda) staral i o update... Z hlediska jednoduché aplikace to asi je jedno, ale z hlediska nějaké řádné struktury enginu mi to vadí. Proto se ptám... má mi to opravdu vadit nebo mám sklopit zrak a napsat to jak uvedl VODA? |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
|
Návrat nahoru |
|
|
Vilem Otte
Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 26. prosinec 2014, 19:09:38 Předmět: |
|
|
Nevím jestli jsi posílal "fixed" verzi Lunar Lander - je třeba tady - https://gist.github.com/mikehibm/1623649
Update dej do samostatného threadu, v Javě to je na pár řádků navíc. _________________ Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. |
|
Návrat nahoru |
|
|
mar
Založen: 16. 06. 2012 Příspěvky: 608
|
Zaslal: 26. prosinec 2014, 19:15:39 Předmět: Re: OpenGL ES 2 - update a draw |
|
|
No pro Android jsem nic nedělal,
ale asi bych to vyřešil jak píše VODA, ne? To mi přijde nejjednodušší.
Pokud budeš mít zvlášť vlákno, musíš to tak jako tak řešit zamykáním (aspoň na kratičkou dobu).
Co mě napadá je buď:
- zamknout objekty, renderovací vlákno je projde a vyrenderuje (toto se mi vůbec nelíbí, i když je to nejjednodušší možnost,
protože update by mohl zabrat relativně dlouhou dobu a tím pádem tím úplně zabiješ smysl dalšího vlákna)
- vytvořit jejich kopii (resp. část stavu, která důležitá pro renderování), pak zamknout (na velmi krátkou dobu, stačilo by předání pointeru) a předat renderovacímu vláknu - tím minimalizuješ contention
- bufferovat rendering commands, pak zamknout a předat renderovacímu vláknu (nevýhoda je, že bys musel wrapnout gl příkazy a logika, která řeší update, by řešila i renderování)
- možná by šel místo toho použít lock-free ring buffer, kde commands sypeš renderovacímu vláknu, akorát bys musel nějak řešit synchronizaci se začátkem framu (v podstatě obdoba předchozí možnosti)
Doufám, že mi neuniklo nějaké elegantní řešení, osobně jsem renderer nikdy ve speciálním vlákně neřešil (nebylo potřeba pro mé jednoduché projekty).
Nicméně úplně oddělit logiku renderování snad vlastně ani nejde, vždycky musíš aspoň vědět, co je pro renderování důležité a co ne.
Nemluvě o tom, když to pojede na zařízení s jedním core (i když dnes je toto už u mobilních zařízení spíš vzácnost), tak si dalším vláknem vůbec nepomůžeš (právě naopak).
Poslední věc, co mě napadá je, že je sice fajn mít nezávislý update, nicméně zase tím permanentně vytěžuješ CPU (1 core), což není u mob. zařízení moc dobré na životnost baterie.
Hmm tak ta poslední poznámka tak úplně neplatí, můžeš čekat na condition variable (event), až renderovací vlákno dokončí práci. |
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 27. prosinec 2014, 18:13:01 Předmět: |
|
|
Poky: Dalsi vlakno je ve tvem pripade uplne zbytecne, delej to normalne v jednom. Dela se to tak standardne i v libGDX, na kterem jsou postavene stovky her pro Android. Chapu, ze ti muze byt proti srsti volat update logiky z metody s nazvem render() nebo neco podobneho... Ale to prezijes
Vilem otte: Ano, odstartovat vlakno je opravdu "par radku navic", ale ono je taky potreba ta vlakna synchronizovat. A to je pomerne netrivialni zalezitost, kdyz to chces delat efektivne. U zacatecniku to vetsinou dopada tak, ze render a update na sebe navzajem cekaji a volaji se pekne sekvencne. Uplne jako by byly v jednom vlakne, ale s overheadem navic |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 27. prosinec 2014, 18:32:37 Předmět: |
|
|
Plus vlákna v Javě jsou celkově dost divně řešený, takže bych se do nich raději nepouštěl tak jako tak. _________________ Perry.cz |
|
Návrat nahoru |
|
|
Poky
Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 28. prosinec 2014, 16:47:06 Předmět: |
|
|
Díky za reakce... opravdu se asi vykašlu na další vlákno a vše nasypu do té metody onDrawFrame |
|
Návrat nahoru |
|
|
]semo[
Založen: 29. 07. 2007 Příspěvky: 1526 Bydliště: Telč
|
Zaslal: 29. prosinec 2014, 11:15:31 Předmět: |
|
|
Poky napsal: |
Z hlediska jednoduché aplikace to asi je jedno, ale z hlediska nějaké řádné struktury enginu mi to vadí. |
Naopak. Řádná struktura enginu ti umožní integraci s různými okeními systémy a i s tím onDrawFrame. Neni na tom opravdu nic špatného. Podle mě engine nemá mít pod kontrolou mainloop. _________________ Kdo jede na tygru, nesmí sesednout.
---
http://www.inventurakrajiny.cz/sipka/
Aquadelic GT, Mafia II, simulátory |
|
Návrat nahoru |
|
|
|