.[ ČeskéHry.cz ].
OpenGL ES 2 - update a draw

 
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
Poky



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 26. prosinec 2014, 15:16:50    Předmět: OpenGL ES 2 - update a draw Odpovědět s citátem

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 Confused ...), když není možné použít nekonečný cyklus... (Nebo je Question )

Díky moc za odpověď. Smile
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: 26. prosinec 2014, 17:00:55    Předmět: Odpovědět s citátem

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



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 26. prosinec 2014, 17:16:48    Předmět: Odpovědět s citátem

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 Laughing nebo mám sklopit zrak a napsat to jak uvedl VODA?
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: 26. prosinec 2014, 17:44:49    Předmět: Odpovědět s citátem

http://www.edu4java.com/en/androidgame/androidgame3.html
http://obviam.net/index.php/a-very-basic-the-game-loop-for-android/
http://www.codeproject.com/Articles/827608/Android-Basic-Game-Loop
http://www.javacodegeeks.com/2011/07/android-game-development-game-loop.html
http://blorb.tumblr.com/post/236799414/simple-java-android-game-loop
http://stackoverflow.com/questions/14077403/android-game-loop-vs-updating-in-the-rendering-thread
https://www.youtube.com/watch?v=ztFzofX66Vo

Ve všech těchto odkazech používají speciální vlákno...
Stejně bych ale pro malou hru jako je Pong nechal logiku hry v onDrawFrame... je tu nějaký expert na Android? Smile
_________________
Opravdovost se pojí s trýzní...
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: 26. prosinec 2014, 18:07:39    Předmět: Odpovědět s citátem

While v samostatném threadu... já když dělal před lety první hru pro Android (tower defense) tak jsem vyšel ze samplu Lunar Lander od Googlu. Akorát v současném SDK už asi není nebo je obsolete (a ta prapůvodní verze byla taky zabugovaná co se týče pauzování main activity, ale to jsou malé věci Wink)
https://gitorious.org/replicant/development/source/3eda8fc3859c243df4a1f892a11e2da84b49cb94:samples/LunarLander/src/com/example/android/lunarlander/LunarView.java
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Vilem Otte



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

PříspěvekZaslal: 26. prosinec 2014, 19:09:38    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 26. prosinec 2014, 19:15:39    Předmět: Re: OpenGL ES 2 - update a draw Odpovědět s citátem

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



Založen: 29. 03. 2014
Příspěvky: 235

PříspěvekZaslal: 27. prosinec 2014, 18:13:01    Předmět: Odpovědět s citátem

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 Smile

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



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

PříspěvekZaslal: 27. prosinec 2014, 18:32:37    Předmět: Odpovědět s citátem

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



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 28. prosinec 2014, 16:47:06    Předmět: Odpovědět s citátem

Díky za reakce... opravdu se asi vykašlu na další vlákno a vše nasypu do té metody onDrawFrame Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
]semo[



Založen: 29. 07. 2007
Příspěvky: 1526
Bydliště: Telč

PříspěvekZaslal: 29. prosinec 2014, 11:15:31    Předmět: Odpovědět s citátem

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
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
Strana 1 z 1

 
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