How to completly unload scene and her resources?

  ... discussions about development with the GLES1 branch of AndEngine.

How to completly unload scene and her resources?

Postby igor.mats » Sun Nov 06, 2011 2:04 pm

Hi peoples!

Please help me! I use 5 scenes:
1. Preloading scene (loading 2 3 and 4 scene, and i use background loading)
2. Menu scene (unload 1st scene)
3. Level choise scene
4. Level loading scene (unload the 2 and 3 scene, but loading 5)
5. Level scene

So it's all working, but when i going from 5th scene back to the 2nd a few times, i have a "white screen" effect!!
I think i not completly unload the scenes when loading another, yep? Can you show me how completly unload scene and her resources?



Thanks, community!
Last edited by igor.mats on Sun Nov 06, 2011 4:28 pm, edited 2 times in total.
igor.mats
 
Posts: 55
Joined: Mon Jul 11, 2011 3:17 am

Re: How to completly unload scene and her resources?

Postby igor.mats » Sun Nov 06, 2011 2:22 pm

My LogCat saying:

Image
igor.mats
 
Posts: 55
Joined: Mon Jul 11, 2011 3:17 am

Re: How to completly unload scene and her resources?

Postby skyuzo » Mon Nov 07, 2011 8:09 pm

Maybe it has to do with how when you switch between two scenes quickly, scene 1 causes scene 2 to load, but scene 2 is still unloading resources.

I wouldn't unload the menu/level select scenes unless they take up all of your memory. Just unload the level-specific resources like the PhysicsWorld (not the textures). Usually all of your game textures shouldn't take too much memory.

Can you post some of your unloading and loading code?
skyuzo
 
Posts: 76
Joined: Thu Sep 08, 2011 2:29 am

Re: How to completly unload scene and her resources?

Postby igor.mats » Mon Nov 07, 2011 9:54 pm

Thank you for your reply!

If the texture does not take up much memory, what's the deal? I do not use physics or anything else!

Yes, of course, that's the part of code:

First i load and show loading scene, and load menu, level select and switcher scenes on background like this:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. public Scene onLoadScene() {
  2.                 engine.registerUpdateHandler(new FPSLogger());
  3.  
  4.                 LoadingScene.load();
  5.                
  6.                 IAsyncCallback callback = new IAsyncCallback() {
  7.                          
  8.                         public void workToDo() {
  9.                                 System.out.println("Background loading is start.");
  10.                                 MenuScene.load();
  11.                                 LevelChoiseScene.load();
  12.                                 SwitchBetweenScenes.load();
  13.                         }
  14.  
  15.                         public void onComplete() {
  16.                                 MenuScene.set();
  17.                                 System.out.println("Background loading is complete!!!");
  18.                         }
  19.                 };
  20.        
  21.                 preloader = new AsyncTaskLoader();
  22.                 preloader.execute(callback);
  23.                
  24.                 return LoadingActivity.scene;
  25.                
  26.         }
  27.  
Parsed in 0.032 seconds, using GeSHi 1.0.8.4


This code describes the load() method from scene: (The method is almost the same in all the scenes)
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. ScreenTexture1 = new BitmapTextureAtlas(1024, 1024, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
  2.                 ScreenTexture2 = new BitmapTextureAtlas(1024, 1024, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
  3.                 ScreenTexture3 = new BitmapTextureAtlas(1024, 1024, TextureOptions.BILINEAR_PREMULTIPLYALPHA);
  4.                
  5.                 GameActivity.engine.getTextureManager().loadTextures(ScreenTexture1, ScreenTexture2, ScreenTexture3);
  6.                
  7.                 Sprite Background = new Sprite(0, 0, BitmapTextureAtlasTextureRegionFactory.createFromAsset(ScreenTexture1, GameActivity.context,
  8.                                 "gfx/image160.png", 0, 0)) {
  9.                                 protected void onInitDraw(final GL10 pGL) {
  10.                                         super.onInitDraw(pGL);
  11.                                         GLHelper.enableTextures(pGL);
  12.                                         GLHelper.enableTexCoordArray(pGL);
  13.                                         GLHelper.enableDither(pGL);
  14.                                 }
  15.                                 };
  16.                                
  17.                                 scene.setBackground(new SpriteBackground(Background));
  18.  
  19. GameActivity.instance.runOnUpdateThread(new Runnable() {
  20.                         public void run() { // Without runOnUpdateThread still worse
  21.                                
  22.                                 scene.attachChild(new Sprite(45, 340,
  23.                                                 BitmapTextureAtlasTextureRegionFactory.createFromAsset(ScreenTexture2, GameActivity.context,
  24.                                                                 "gfx/image194.png", 0, 0)));
  25.                                
  26.                                 Sprite Exit = new Sprite(410, 700,
  27.                                                 BitmapTextureAtlasTextureRegionFactory.createFromAsset(ScreenTexture2, GameActivity.context,
  28.                                                                 "gfx/image247.png", 800, 800)) {
  29.                                         @Override
  30.                                         public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
  31.                                                 if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP)
  32.                                                         GameActivity.instace.finish();
  33.                                                
  34.                                                 return true;
  35.                                         }
  36.                                 };
  37.                                                                
  38.                                 Exit.setScale(2f);
  39.                                 scene.attachChild(Exit);
  40.                                 scene.registerTouchArea(Exit);
  41.                                                                
  42.                                 AnimatedSprite Sound = new AnimatedSprite(313, 690,
  43.                                                 BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(ScreenTexture3, GameActivity.context,
  44.                                                                 "gfx/image241.png", 0, 0, 2, 1)) {
  45.                                        
  46.                                 protected void onInitDraw(final GL10 pGL) {
  47.                                         super.onInitDraw(pGL);
  48.                                         GLHelper.enableTextures(pGL);
  49.                                         GLHelper.enableTexCoordArray(pGL);
  50.                                         GLHelper.enableDither(pGL);
  51.                                 }
  52.                                
  53.                                         @Override
  54.                                         public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
  55.                                                 if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP) {
  56.                                                         GameActivity.sound.backgroundSound();
  57.                                                         this.nextTile();
  58.                                                 }
  59.                                                
  60.                                                 return true;
  61.                                         }
  62.                                 };
  63.                                        
  64.                                 Sound.setScale(2f);
  65.                                 scene.attachChild(Sound);
  66.                                 scene.registerTouchArea(Sound);
  67.                                        
  68.                                 scene.attachChild(new Sprite(23, 140,
  69.                                                 BitmapTextureAtlasTextureRegionFactory.createFromAsset(ScreenTexture2, GameActivity.context,
  70.                                                                 "gfx/image209.png", 0, 350)));
  71.                                        
  72.                                 AnimatedSprite Start = new AnimatedSprite(205, 440,
  73.                                                 BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(ScreenTexture1, GameActivity.context,
  74.                                                                 "gfx/image0001.png", 500, 0, 1, 2)) {
  75.                                        
  76.                                 protected void onInitDraw(final GL10 pGL) {
  77.                                         super.onInitDraw(pGL);
  78.                                         GLHelper.enableTextures(pGL);
  79.                                         GLHelper.enableTexCoordArray(pGL);
  80.                                         GLHelper.enableDither(pGL);
  81.                                 }
  82.                                
  83.                                         @Override
  84.                                         public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
  85.                                                 if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN) {
  86.                                                         this.nextTile();
  87.                                                 }
  88.                                                 if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP) {
  89.                                                         this.nextTile();
  90.                                                         LevelChoiseScene.set();
  91.                                                 }
  92.                                                        
  93.                                                 return false;
  94.                                         }
  95.                                 };
  96.                                                
  97.                                 scene.attachChild(Start);
  98.                                 scene.registerTouchArea(Start);
  99.                                
  100.                                 AnimatedSprite MoreGames = new AnimatedSprite(135, 490,
  101.                                                 BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(ScreenTexture1, GameActivity.context,
  102.                                                                 "gfx/image0002.png", 600, 0, 1, 2)) {
  103.                                         @Override
  104.                                         public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
  105.                                                 if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN) {
  106.                                                         this.nextTile();
  107.                                                 }
  108.                                                 if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP) {
  109.                                                         this.nextTile();
  110.                                                 }
  111.                                                        
  112.                                                 return false;
  113.                                         }
  114.                                 };
  115.                                                
  116.                                 scene.attachChild(MoreGames);
  117.                                 scene.registerTouchArea(MoreGames);
  118.                                
  119.                                 AnimatedSprite Credits = new AnimatedSprite(200, 550,
  120.                                                 BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(ScreenTexture1, GameActivity.context,
  121.                                                                 "gfx/image0003.png", 850, 0, 1, 2)) {
  122.                                         @Override
  123.                                         public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
  124.                                                 if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_DOWN) {
  125.                                                         this.nextTile();
  126.                                                 }
  127.                                                 if(pSceneTouchEvent.getAction() == TouchEvent.ACTION_UP) {
  128.                                                         this.nextTile();
  129.                                                 }
  130.                                                        
  131.                                                 return false;
  132.                                         }
  133.                                 };
  134.                                                
  135.                                 scene.attachChild(Credits);
  136.                                 scene.registerTouchArea(Credits);
  137.                                
  138.                                 isSceneLoaded = true;
  139.                         }
  140.                 });
  141.                
  142.                 while(!isSceneLoaded) {}
  143.  
Parsed in 0.050 seconds, using GeSHi 1.0.8.4


And this is unload() method:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. GameActivity.instance.runOnUiThread(new Runnable() {
  2.             @Override
  3.             public void run() {
  4.                     scene.detachChildren();
  5.             }
  6.                 });
  7.                 GameActivity.engine.getTextureManager().unloadTextures(ScreenTexture1, ScreenTexture2, ScreenTexture3);
  8.  
Parsed in 0.034 seconds, using GeSHi 1.0.8.4
igor.mats
 
Posts: 55
Joined: Mon Jul 11, 2011 3:17 am

Re: How to completly unload scene and her resources?

Postby igor.mats » Mon Nov 07, 2011 10:00 pm

I hope I made somewhere a big mistake!

By the way, i tried to not unloading scenes resources. In this case, there is not only a white screen, but also black screen and white squares instead of textures.

P.s. Naturally the emulator everything works fine .... : (
igor.mats
 
Posts: 55
Joined: Mon Jul 11, 2011 3:17 am

Re: How to completly unload scene and her resources?

Postby igor.mats » Mon Nov 07, 2011 11:25 pm

I give up!

Rewrote it all over again, following the example of "MultiScreen" one to one. The same thing! What is it? : '(
igor.mats
 
Posts: 55
Joined: Mon Jul 11, 2011 3:17 am

Re: How to completly unload scene and her resources?

Postby lukitar » Sat Nov 19, 2011 2:40 pm

Did it get better with time? I mean, did you find a solution?
lukitar
 
Posts: 2
Joined: Sat Nov 19, 2011 2:20 pm

Re: How to completly unload scene and her resources?

Postby igor.mats » Sat Jan 21, 2012 6:24 pm

lukitar wrote:Did it get better with time? I mean, did you find a solution?


nope =(

I'm still trying to solve this problem, but nothing helps :(
igor.mats
 
Posts: 55
Joined: Mon Jul 11, 2011 3:17 am

Re: How to completly unload scene and her resources?

Postby Niffy » Sat Jan 21, 2012 10:57 pm

If you really need to get rid of everything then I suppose you could keep the entities(After all most things inherit from the entity class) in some sort of arraylist, iterate the list and call dispose on all of them.

Have you added a listener to your textures to see if they really are being unloaded?

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. this.mBackgroundTextureAtlas = new BitmapTextureAtlas(1024, 1024,
  2.                                 TextureOptions.BILINEAR_PREMULTIPLYALPHA,
  3.                                 new ITextureAtlasStateListener.TextureAtlasStateAdapter<IBitmapTextureAtlasSource>() {
  4.                         @Override
  5.                         public void onTextureAtlasSourceLoadExeption(final ITextureAtlas<IBitmapTextureAtlasSource> pTextureAtlas,
  6.                                         final IBitmapTextureAtlasSource pBitmapTextureAtlasSource, final Throwable pThrowable) {
  7.                                
  8.                         }
  9.  
  10.                         @Override
  11.                         public void onUnloadedFromHardware(ITexture pTexture) {
  12.                                
  13.                         }
  14.                 });
  15.  
Parsed in 0.037 seconds, using GeSHi 1.0.8.4
Niffy
 
Posts: 284
Joined: Sat Sep 17, 2011 8:39 pm

Re: How to completly unload scene and her resources?

Postby igor.mats » Sun Jan 22, 2012 3:22 pm

Niffy wrote:Have you added a listener to your textures to see if they really are being unloaded?


Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. @Override
  2. public void onUnloadedFromHardware(ITexture pTexture) {
  3.     System.out.println("YES I UNLOADED!!!");
  4. }
Parsed in 0.036 seconds, using GeSHi 1.0.8.4


For some reason, this event is called immediately after loading the textures :(
(And after unloading too)

What am I doing wrong?

I use this code:
Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. ScreenTexture1 = new BitmapTextureAtlas(
  2.                                 1024,
  3.                                 1024,
  4.                                 TextureOptions.BILINEAR_PREMULTIPLYALPHA,
  5.                                 new ITextureAtlasStateListener.TextureAtlasStateAdapter<IBitmapTextureAtlasSource>() {
  6.                                         @Override
  7.                                         public void onTextureAtlasSourceLoadExeption(
  8.                                                         final ITextureAtlas<IBitmapTextureAtlasSource> pTextureAtlas,
  9.                                                         final IBitmapTextureAtlasSource pBitmapTextureAtlasSource,
  10.                                                         final Throwable pThrowable) {
  11.  
  12.                                         }
  13.  
  14.                                         @Override
  15.                                         public void onUnloadedFromHardware(ITexture pTexture) {
  16.                                                 System.out.println("YES I UNLOADED!!!");
  17.                                         }
  18.                                 });
  19.  
  20.                 ScreenTexture2 = new BitmapTextureAtlas(1024, 1024,
  21.                                 TextureOptions.BILINEAR_PREMULTIPLYALPHA);
  22.                 ScreenTexture3 = new BitmapTextureAtlas(1024, 1024,
  23.                                 TextureOptions.BILINEAR_PREMULTIPLYALPHA);
  24.  
  25.                 ScreenTexture1.setLoadedToHardware(true);
  26.                 ScreenTexture1.setUpdateOnHardwareNeeded(true);
  27.                 ScreenTexture2.setLoadedToHardware(true);
  28.                 ScreenTexture3.setUpdateOnHardwareNeeded(true);
  29.                 ScreenTexture3.setLoadedToHardware(true);
  30.                 ScreenTexture3.setUpdateOnHardwareNeeded(true);
  31.  
  32.                 GameActivity.engine.getTextureManager().loadTextures(ScreenTexture1,
  33.                                 ScreenTexture2, ScreenTexture3);
Parsed in 0.040 seconds, using GeSHi 1.0.8.4
igor.mats
 
Posts: 55
Joined: Mon Jul 11, 2011 3:17 am

Next

Return to GLES1

Who is online

Users browsing this forum: No registered users and 13 guests