Android élőháttérkép renderelése nagyon lassú

Android élőháttérkép renderelése nagyon lassú
2012-01-26T16:00:01+01:00
2012-02-06T19:53:15+01:00
2022-11-24T14:45:40+01:00
vsandor
Sziasztok! A helyzet az, hogy nem rég kezdtem el Java nyelven ügyködni, hogy Androidra tudjak fejleszteni OpenGL ES használatával. Ugye normál alkalmazásokkal nincs probléma, ott adott egy GLSurfaceView nevű osztály, azzal egyszerüen lehet inicializálni a GL-t, és az foglalkozik is a render-eléssel. A probléma ott van, hogy az élő háttérképeknél nem alkalmazható ez az osztály, ezért a GLSurfaceView implementációja alapján összedobtam a saját kis osztályomat, aminek segitségével sikerült is renderelni háttérképre. Eddig minden nagyon szépen hangzik, de nagyon-nagyon belassitja a telefont az egész, még ha csak pár kockát render-elek is ki, ezért én arra gyanakszom - mélyebb Java szálkezelési ismeretek nélkül -, hogy valamiért a Thread-em nagyon eszi a CPU-t. Megköszönném, ha vetnétek egy pillantást az osztályra, és adnátok ötleteket, hogy mit kezdjek vele, hogy összehangoltabban működjön. (Vagy igazából nem tudom biztosra mondani, hogy ez a hiba. A lényeg, hogy szeretném, ha nem lenne ennyire lassú az egész.) Előre is köszönöm, és ime az osztály:

public class VSGLThread extends Thread { public interface VSGLRenderer { public void onInit(GL10 gl); public void onResize(GL10 gl, int w, int h); public void onRender(GL10 gl); public void onDestroy(GL10 gl); } private SurfaceHolder holder = null; private VSGLRenderer renderer = null; private Runnable event = null; private EGL10 egl = null; private EGLContext eglContext = null; private EGLSurface eglSurface = null; private EGLDisplay eglDisplay = null; private EGLConfig eglConfig = null; private GL glHandle = null; private int contextVersion = 1; private boolean running = false; public VSGLThread(SurfaceHolder holder, VSGLRenderer renderer, int contextVersion ) { super(); this.holder = holder; this.renderer = renderer; this.contextVersion = contextVersion; } @Override public void run() { GL10 gl = (GL10) glHandle; synchronized(this) { initGL(); renderer.onInit(gl); } running = true; while (running) { synchronized (this) { if ( event != null ) { event.run(); event = null; } // render renderer.onRender(gl); egl.eglSwapBuffers(eglDisplay, eglSurface); /*try { Thread.sleep(10); } catch (InterruptedException ex) { }*/ } } synchronized(this) { renderer.onDestroy(gl); destroyGL(); } } public void event(Runnable e) { this.event = e; } private void exit() { running = false; } private void initGL() { egl = (EGL10) EGLContext.getEGL(); eglDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); int[] version = new int[2]; egl.eglInitialize(eglDisplay, version); EGLConfig[] configs = new EGLConfig[1]; int[] num_config = new int[1]; int[] configSpec = new int[] { EGL10.EGL_RED_SIZE, 8, EGL10.EGL_GREEN_SIZE, 8, EGL10.EGL_BLUE_SIZE, 8, EGL10.EGL_ALPHA_SIZE, 8, EGL10.EGL_DEPTH_SIZE, 24, (contextVersion!=1)? EGL10.EGL_RENDERABLE_TYPE : EGL10.EGL_NONE, (contextVersion!=1)? 4 : EGL10.EGL_NONE, EGL10.EGL_NONE }; egl.eglChooseConfig(eglDisplay, configSpec, configs, 1, num_config); eglConfig = configs[0]; int contextAttribs[] = new int[] { 0x3098, contextVersion, EGL10.EGL_NONE }; eglContext = egl.eglCreateContext(eglDisplay, eglConfig, EGL10.EGL_NO_CONTEXT, (contextVersion!=1)? contextAttribs : null); eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig, this.holder, null); egl.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext); glHandle = eglContext.getGL(); GL10 gl = (GL10)glHandle; } private void destroyGL() { egl.eglMakeCurrent(eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT); egl.eglDestroySurface(eglDisplay, eglSurface); egl.eglDestroyContext(eglDisplay, eglContext); egl.eglTerminate(eglDisplay); } }
Mutasd a teljes hozzászólást!

  • Van már erre osztály

    http://www.rbgrn.net/content/354-glsurfaceview-adapted-3d-live-wallp..


    nem kell újra feltalálni mindent. énis ezt használom, Robert class-a elég jó.

    üdv
    Laca

    Android Programjaim
    Mutasd a teljes hozzászólást!
  • Szia!
    Köszönöm a válaszodat.

    A probléma már megoldódott, és végül nem a thread-hez kapcsolodó probléma állt fent, hanem, amit nem tudtam eddig, hogy egy telefon nem igazán szereti, ha lineáris textúra filtert használok. A GL_NEAREST-et jobban komálja.

    Ami Robert class-ját illeti, nem szeretem más kódját használni, összeollózáshoz nem kell tudás. Meg aztán nem annyira bonyolult a GLSurfaceView osztály.

    Egyébként láttam az oldalad, tetszenek a munkáid.
    "Keep up the good work!"

    Üdv,
    Sanyi
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd