Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 21. říjen 2017, 19:41:43 Předmět: Android - rotace obrazovky |
|
|
Nevím jeslti se s tím někdo setkal, ale mám OpenGL apku, kde renderuju do GLSurfaceView. Všechno běží, bohužel když udělám rotaci displeje, všechno spadne - resp. resetuje se mi OpenGL kontext a vytváření znovu sice jde, ale nepřipadá v úvahu, protože to je na hrozně dlouho (v poměru času když uživatel rotuje tam a zpátky). Na iOS se rotace děje automaticky a kontext se neztrácí.
Rendering mám v C++ přes JNI a GUI je v nativním androidu (Kotlin, ale podobně to bude i v Javě) a volá se to mezi sebou.
Pokud někdo ví co s tím, můžu případně poslat i nějaké zdrojáky. _________________ Perry.cz |
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 23. říjen 2017, 08:44:15 Předmět: |
|
|
Ja delam presne tohle (C++ rendering a Java/JNI) a resim to standardne - v onSurfaceCreated() vsechno inicializuju znova, v mem pripade to funguje perfektne a rychle. V Androidu 3.2+ mas jeste k dispozici metodu GLSurfaceView.setPreserveEGLContextOnPause(). Ta ti sice nezaruci zachovani kontextu na vsech zarizenich a za vsech okolnosti, ale treba to pro tebe bude lepsi, nez kdyz se kontext vytvari znovu uplne pokazde. Dalsi moznost uz je pak jen pouzivat misto GLSurfaceView ciste SurfaceView a resit si lifetime EGL kontextu a threading sam, ale do toho bych se nepoustel. |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 23. říjen 2017, 09:35:09 Předmět: |
|
|
No to s tím "resetem" není možnost, protože rozbaluji různé dlaždice z JPG / PNG a cold start trvá v tomto případě skoro 2s+. V praxi při klasickém startu se to nestává, protože se to načítá postupně a "doskakuje". Nicméně při rotaci asi uživatel nebude moc "happy" když bude pořád čekat.
Další problém je, že používám "render to vertex buffer", takže ztáta kontextu = ztáta dat, protože nemám jejich kopii na CPU.
Zatím jsem našel¨připsání
kód: |
android:configChanges="orientation|screenSize|keyboardHidden" |
do manifestu a nastavení
kód: |
setPreserveEGLContextOnPause(true)
|
.
Zdá se, že to funguje, ale nevím, zda to skutečně vždy ten kontext onPause zachová nebo ne. _________________ Perry.cz |
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 23. říjen 2017, 10:04:13 Předmět: |
|
|
citace: |
ale nevím, zda to skutečně vždy ten kontext onPause zachová nebo ne. |
Kdyz je aplikace aktivni a jen menis orientaci displeje, tak je nepravdepodobne, ze by se kontext ztratil. Kdyz zamknes telefon a odemknes, tak uz treba jo. Zalezi na telefonu. Na high endech to nebude takovy problem jako na low endech, ktere nemaji dost pameti, aby udrzovaly nekolik kontextu se vsemi texturami. A nektera zarizeni vubec setPreserveEGLContextOnPause() nepodporuji. Proste zarucene to neni, takze to musis naprogramovat tak, aby aplikace nepadala, kdyz kontext ztratis. Holt si uzivatele se starymi telefony budou muset par sekund pockat |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 23. říjen 2017, 10:53:34 Předmět: |
|
|
No vzhledem k tomu, že cílím zatím na ES 3, tak myslím ten problém bude ještě menší _________________ Perry.cz |
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 23. říjen 2017, 12:52:13 Předmět: |
|
|
Na to bych moc nespolehal. Jsem schopny vyvolat ztratu kontextu i na svem telefonu za 20k. To, ze cilis na high endy, by nemela byt omluva pro odbyte programovani. Ten kontext proste ztratit muzes a aplikace by pri tom crashovat zrovna nemusela |
|
Návrat nahoru |
|
|
perry
Založen: 28. 07. 2009 Příspěvky: 879
|
Zaslal: 23. říjen 2017, 15:36:38 Předmět: |
|
|
Jo, já vím že by to nemělo crashovat... Jen že ten "fix" není otázka dnů a je lepší vydat aplikaci co opravuje kritické chyby, ale padá občas, než nechat tu, co padá za běhu _________________ Perry.cz |
|
Návrat nahoru |
|
|
|