Nelze volat glGenTextures na vícevláknové aplikace pro Android

hlasů
2

Dělám aplikaci OpenGLES systémem Android Android NDK, rozšiřující se od gljni například android, které lze nalézt zde

Je to pomocí GLSurfaceView. Textury jsou inicializovány v závislosti JNI volat z onSurfaceChanged () ze dne GLSurfaceView.Renderer

Když se uživatel dotkne obrazovky, aplikace potřebuje více textur. Aby bylo možné učinit, glGenTextures () je volána ve funkci JNI stavil onTouchEvent ().

Problém je v tom, že závit id (který gettid () vrací) se zdá zcela arbitrární a ne vždy to samé závitu id, který má kontext OpenGL.

Načte a objeví textury, je-li tato funkce JNI s názvem ve stejném závitu, ale selže, pokud je to na jiném vlákně. Takže to působí docela náhodně.

Mohu udělat něco jako:

  • sdílet kontext OpenGL, takže můžu zavolat glGenTextures () úspěšně v jakémkoliv nití.

  • aby onTouchEvent (), které se nazývá pouze v jednom vlákně, který má OpenGL kontext

  • nebo cokoliv, co můžu dělat to pracovat

?

dík

Položena 20/08/2010 v 03:57
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
2

To není náhodné chování, že to, jak OpenGL spolupracuje s nití. Kontext je jen proud pouze na jedno vlákno, další témata nemají GL kontextu, pokud si výslovně vytvořit kontext pro každé vlákno, které chcete použít s OpenGL. Bez kontextu, všechny hovory GL nezdaří.

Odpovězeno 20/08/2010 v 05:32
zdroj uživatelem

hlasů
2

Mám to pracovní použití GLSurfaceView.queueEvent ().

Dokument říká, že GLSurfaceView je opatrný oddělení UI vlákno a renderování nit a

queueEvent () je kód spuštěn v jeho rendering závitu.

Odpovězeno 20/08/2010 v 04:13
zdroj uživatelem

hlasů
2

Nemám pracoval s NDK a OpenGL. Ale s čistou verzi Javy, nemůžete sdílet závity. GLSurfaceView nemá rád sdílení GL souvislostí mezi závity. Důvodem (z toho, co jsem byl schopen říci), je to, že po drawFrame () volání, kontext ztratí. Pokud se pokusíte použít tento kontext, aniž by uvnitř onSurfaceCreated, onSurfaceChanged nebo onDrawFrame (), bude vaše GL metody nefungují. Z tohoto důvodu, s jiným závitem je zde vysoká pravděpodobnost, že pokud tato jiná nit provede, GL nit již dokončil svou metodu drawFrame (), zrušení platnosti kontext.

Odpovězeno 20/08/2010 v 04:09
zdroj uživatelem

hlasů
0

Popsal jsem java jen řešení pro nahrání textury na samostatné vlákno jako odpověď na jinou otázku: Navlékání textury proces zavádění pro android opengl hru

Mělo by to fungovat dosti podobné s NDK.

Odpovězeno 02/11/2013 v 11:27
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more