Rechargement sur un Livewallpaper

J’ai rencontré un problème avec Rajawali, je ne le critique pas car je l’ai eu avec AndEngine et avec les export d’Unity2Eclipse pour la réalisation de Livewallpaper.
Cette erreur ce produit lorsque vous définissez votre Livewallpaper et que vous retournez dans la preview de ce Livewallpaper et que vous le redéfinissez. Cette manipulation crée plusieurs GLThread et si vous le faite plusieurs fois un crash du à la mémoire que vous explosez (OutOfMemory).

Pour palier ce problème j’ai modifier la méthode onDestroy de Wallpaper.java

@Override
   public void onDestroy() {
       setTouchEventsEnabled(false);
       mRenderer.onSurfaceDestroyed();
       mRenderer = null;
       mSurfaceView.onDestroy();
       super.onDestroy();
   }

Mais aussi onSurfaceChanged dans RajawaliRenderer.java

public void onSurfaceChanged(GL10 gl, int width, int height) {    
    mViewportWidth = width;
    mViewportHeight = height;
    mTextureManager = TextureManager.getInstance();
    mTextureManager.setContext(this.getContext());
    mTextureManager.registerRenderer(this);
    mMaterialManager = MaterialManager.getInstance();
    mMaterialManager.setContext(this.getContext());
    mMaterialManager.registerRenderer(this);
    if (!mSceneInitialized) {
        getCurrentScene().resetGLState();

        initScene();
    }
    ....

Maintenant que vous avez modifiez le moteur il faut que vous reveniez dans votre projet.  Dans la méthode onSurfaceDestroyed de votre Renderer vous devez supprimer vos matériaux et texture se qui donne:

    mMaterial.removeTexture(mTexture);
    mTexture.reset();
    mTextureManager.taskRemove(mTexture);
    mMaterialManager.taskRemove(mMaterial);

Et voila c’est tout bon pour moi, je ne pense pas que ce soit thread safe mais j’ai pas encore trouvé mieux. Si vous avez une meilleur solution je suis preneur, pour les autres qui ne veulent pas faire les modifications dans Rajawali vous pouvez prendre mon fork avec mes modifications.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *