Loosing textures on low end devices

  ... the Live-Wallpaper Extension for AndEngine.

Loosing textures on low end devices

Postby REDD LABS » Sun Jun 23, 2013 10:54 am

Hi all,
I am developing a live wallpaper using Andengine GLES2 Anchor centre branch ,based on the Development Cookbook.Wallpaper works fine on mid range to high end devices but shows problem on low end devices.I have tested it on Samsung galaxy ace , Micromax Funbook tablet and the issue generator Samsung galaxy Y. Issue found only on Samsung galaxy Y the only low end device I have.

Issue

I got loosing textures of all sprites when unlocking screens sometimes,or when returning to homepage some times,Error is not generated in a predictable manner, some times it doesn't cause any issue at all, But when it occurs to make get my textures even in my preview mode I have to force close the application and start the app again.

These are the details of my live wallpaper,
Wallpaper have A background sprite,A main image sprite ,two BatchedSpriteParticleSystem with some initializers and modifiers
I have a sepretae folder in asset for lower end device (320*480) where I keep small images and load all images to a single texture atlas in that case other wise I am using two texture atlas one for background image,and one for my main image and the two particle images.I am using a resource manager calss as per the andengine cokknbook to load textures

Please help me to sort out the issue,I dont know where iam going wrong on this
here is my code ...

LiveWallpaperExtensionService,ResourseManger and Utils are given below

LiveWallpaperExtensionService

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2. @TargetApi(13)
  3. public class LiveWallpaperExtensionService extends BaseLiveWallpaperService {
  4.  
  5.         public Sprite bg_Sprite;
  6.         public Sprite main_image_sprite;
  7.         public SpriteBackground background;
  8.  
  9.         public BatchedSpriteParticleSystem beamParticleSystem;
  10.         public BatchedSpriteParticleSystem starParticleSystem;
  11.  
  12.         private Camera mCamera;
  13.         private Scene mScene;
  14.  
  15.        
  16.         @Override
  17.         public org.andengine.engine.Engine onCreateEngine(
  18.                         final EngineOptions pEngineOptions) {
  19.                 return new FixedStepEngine(pEngineOptions, 50);
  20.         }
  21.  
  22.         public EngineOptions onCreateEngineOptions() {
  23.  
  24.                 Display display = ((WindowManager) getSystemService(WINDOW_SERVICE))
  25.                                 .getDefaultDisplay();
  26.                 Utils.setGlobalWidthandHeight(Utils.getDisplaySize(display));
  27.  
  28.                 mCamera = new Camera(0, 0, Global.Width, Global.Height);
  29.  
  30.                 EngineOptions engineOptions = new EngineOptions(true,
  31.                                 ScreenOrientation.PORTRAIT_SENSOR, new FillResolutionPolicy(),
  32.                                 mCamera);
  33.  
  34.                 engineOptions.getRenderOptions().setDithering(true);
  35.                 return engineOptions;
  36.         }
  37.  
  38.  
  39.         public void onCreateResources(
  40.                         OnCreateResourcesCallback pOnCreateResourcesCallback) {
  41.  
  42.                 System.out.println("On create resourses");
  43.                 ResourceManager.getInstance().loadBlueTextures(mEngine, this);
  44.                 pOnCreateResourcesCallback.onCreateResourcesFinished();
  45.  
  46.         }
  47.  
  48.         public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback) {
  49.                 System.out.println("On create scene");
  50.                 mScene = new Scene();
  51.                 pOnCreateSceneCallback.onCreateSceneFinished(mScene);
  52.         }
  53.  
  54.         public void onPopulateScene(Scene arg0,
  55.                         OnPopulateSceneCallback pOnPopulateSceneCallback) {
  56.  
  57.                 System.out.println("on populate ");
  58.  
  59.                 final float positionX = Global.Width * 0.5f;
  60.                 final float positionY = Global.Height * 0.5f;
  61.  
  62.        
  63.                 bg_Sprite = new Sprite(positionX, positionY,
  64.                                 ResourceManager.getInstance().mBackgroundTextureRegion,
  65.                                 this.getVertexBufferObjectManager());
  66.  
  67.                 main_image_sprite = new Sprite(positionX, positionY,
  68.                                 ResourceManager.getInstance().mJesusTextureRegion,
  69.                                 this.getVertexBufferObjectManager());
  70.  
  71.                 /*
  72.                  * Define the center point of the particle system spawn location
  73.                  */
  74.                 final int bparticleSpawnCenterX = (int) (Global.Width * 0.5f);
  75.                 final int bparticleSpawnCenterY = (int) ((Global.Height * 0.5f) + ((Global.Height * 0.5f)) * 0.5f) - 25;
  76.                 /* Define the radius of the circle for the particle emitter */
  77.                 final float particleEmitterRadius = 50;
  78.                 /* Create the particle emitter */
  79.                 CircleOutlineParticleEmitter bparticleEmitter = new CircleOutlineParticleEmitter(
  80.                                 bparticleSpawnCenterX, bparticleSpawnCenterY,
  81.                                 particleEmitterRadius);
  82.  
  83.                 beamParticleSystem = new BatchedSpriteParticleSystem(bparticleEmitter,
  84.                                 10, 15, 50, ResourceManager.getInstance().mBeamTextureRegion,
  85.                                 mEngine.getVertexBufferObjectManager());
  86.  
  87.                 beamParticleSystem
  88.                                 .addParticleInitializer(new ExpireParticleInitializer<UncoloredSprite>(
  89.                                                 3));
  90.  
  91.                 beamParticleSystem
  92.                                 .addParticleInitializer(new AccelerationParticleInitializer<UncoloredSprite>(
  93.                                                 -150, 150, -150, 150));
  94.  
  95.                 RectangleParticleEmitter particleEmitter = new RectangleParticleEmitter(
  96.                                 ((int) (Global.Width * 0.5f)), ((int) (Global.Height * 0.5f)),
  97.                                 Global.Width, Global.Height);
  98.  
  99.                 // Create a batched particle system for efficiency
  100.                 starParticleSystem = new BatchedSpriteParticleSystem(particleEmitter,
  101.                                 1, 2, 20, ResourceManager.getInstance().mStarTextureRegion,
  102.                                 mEngine.getVertexBufferObjectManager());
  103.  
  104.                 /* Add an acceleration initializer to the particle system */
  105.  
  106.                 starParticleSystem
  107.                                 .addParticleInitializer(new ExpireParticleInitializer<UncoloredSprite>(
  108.                                                 10));
  109.  
  110.                 starParticleSystem
  111.                                 .addParticleInitializer(new RotationParticleInitializer<UncoloredSprite>(
  112.                                                 0, 160));
  113.  
  114.                 /* Define min/max values for the particle's scale */
  115.  
  116.                 starParticleSystem
  117.                                 .addParticleInitializer(new ScaleParticleInitializer<UncoloredSprite>(
  118.                                                 0.3f, 1.5f));
  119.  
  120.                 /* Define the alpha modifier's properties */
  121.  
  122.                 starParticleSystem
  123.                                 .addParticleModifier(new AlphaParticleModifier<UncoloredSprite>(
  124.                                                 0, 2, 0, 1));
  125.  
  126.                 /* Define the rotation modifier's properties */
  127.  
  128.                 starParticleSystem
  129.                                 .addParticleModifier(new RotationParticleModifier<UncoloredSprite>(
  130.                                                 1, 9, 0, 180));
  131.  
  132.                 // Add alpha ('fade out') modifier
  133.                 starParticleSystem
  134.                                 .addParticleModifier(new AlphaParticleModifier<UncoloredSprite>(
  135.                                                 8, 10, 1, 0));
  136.  
  137.        
  138.                
  139.        
  140.                 /*
  141.                  * Create the SpriteBackground object, specifying the color values &
  142.                  * Sprite object to display
  143.                  */
  144.                
  145.                 final float red = 0.7f;
  146.                 final float green = 0.78f;
  147.                 final float blue = 0.85f;
  148.                 final float alpha = 1;
  149.  
  150.                 background = new SpriteBackground(red, green, blue, bg_Sprite);
  151.                 mScene.setBackground(background);
  152.                 mScene.setBackgroundEnabled(true);
  153.  
  154.                 // Attach our particle system to the scene
  155.                 mScene.attachChild(starParticleSystem);
  156.                 mScene.attachChild(beamParticleSystem);
  157.  
  158.                 mScene.attachChild(main_image_sprite);
  159.  
  160.                 bg_Sprite.setIgnoreUpdate(true);
  161.                 main_image_sprite.setIgnoreUpdate(true);
  162.  
  163.                 pOnPopulateSceneCallback.onPopulateSceneFinished();
  164.         }
  165.  
  166.         @Override
  167.         protected synchronized void onPause() {
  168.                 System.out.println("On paused");
  169.                 super.onPause();
  170.  
  171.                 if (starParticleSystem != null) {
  172.                         starParticleSystem.setParticlesSpawnEnabled(false);
  173.                 }
  174.                 if (beamParticleSystem != null) {
  175.                         beamParticleSystem.setParticlesSpawnEnabled(false);
  176.                 }
  177.  
  178.         }
  179.  
  180.         @Override
  181.         protected synchronized void onResume() {
  182.  
  183.                 System.out.println("On resume");
  184.                 super.onResume();
  185.        
  186.                 if (starParticleSystem != null) {
  187.                         starParticleSystem.setParticlesSpawnEnabled(true);
  188.                 }
  189.                 if (beamParticleSystem != null) {
  190.                         beamParticleSystem.setParticlesSpawnEnabled(true);
  191.                 }
  192.                
  193.         }
  194.  
  195.         @Override
  196.         public synchronized void onDestroy() {
  197.  
  198.                 System.out.println("onDestroy");
  199.                 mScene.detachChild(beamParticleSystem);
  200.                 mScene.detachChild(starParticleSystem);        
  201.                 ResourceManager.getInstance().unloadGameTextures();
  202.                 System.out.println("On destroy");
  203.                 super.onDestroy();
  204.                
  205.  
  206.         }
  207.  
  208.         @Override
  209.         public void onSurfaceChanged(GLState pGLState, int pWidth, int pHeight) {
  210.  
  211.                 float mRatioX;
  212.                 float mRatioY;
  213.                 // If the height is greater than the width (portrait mode)
  214.                
  215.                 if (pHeight > pWidth) {
  216.                         // The scaling should be equal to 1:1 since our camera's width and
  217.                         // height are based on portrait mode
  218.                         mRatioX = 1;
  219.                         mRatioY = 1;
  220.                 }
  221.                 // If the width is greater than the height (landscape mode)
  222.                 else {
  223.                         // We must calculate a new scaling ratio for the particle's entities
  224.                         // in order to make up for the 'swapping' of camera width and height
  225.                         // mutliply with  0.8f to make the size a litille bit smaller
  226.                         mRatioX = (((float) pHeight) / pWidth)* 0.8f;
  227.                         mRatioY = (((float) pWidth) / pHeight)* 0.8f;
  228.  
  229.                         //mRatioX = ((float) mRatioX) * 0.8f;
  230.                         //mRatioY = ((float) mRatioY) * 0.8f;
  231.  
  232.                 }
  233.  
  234.                 main_image_sprite.setScale(mRatioX, mRatioY);
  235.                 super.onSurfaceChanged(pGLState, pWidth, pHeight);
  236.         }
  237.  
  238. }
  239.  
  240.  
Parsed in 0.019 seconds, using GeSHi 1.0.8.4


Utils

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1. public class Utils {
  2.        
  3.         public static Point getDisplaySize(final Display display) {
  4.                
  5.        
  6.             final Point point = new Point();
  7.             try {
  8.                 display.getSize(point);
  9.             } catch (java.lang.NoSuchMethodError ignore) { // Older device
  10.                 point.x = display.getWidth();
  11.                 point.y = display.getHeight();
  12.             }
  13.             return point;
  14.         }
  15.        
  16.        
  17.         public static void setGlobalWidthandHeight(Point size){
  18.                
  19.                 int screenWidth =  size.x;
  20.                 int screenHeight =  size.y;
  21.                
  22.                 if(screenWidth<screenHeight){
  23.                        
  24.                         if(screenWidth<=320){
  25.                                 Global.Height =480;
  26.                                 Global.Width  =320;
  27.                                 Global.selected_path = "gfx/blue/320/";
  28.                                 Global.singleAtlas=true;
  29.                                 Global.atlas1Width=750;
  30.                                 Global.atlas1Height=550;
  31.                                
  32.                         }else{
  33.                                 Global.Height =1024;
  34.                                 Global.Width  =600;
  35.                                 Global.selected_path = "gfx/blue/";
  36.                                 Global.singleAtlas=false;
  37.                                 Global.atlas1Width=610;
  38.                                 Global.atlas1Height=1024;
  39.                                 Global.atlas2Width=640;
  40.                                 Global.atlas2Height=690;
  41.                         }
  42.                 }else{
  43.                         Global.Height =1024;
  44.                         Global.Width  =600;
  45.                         Global.selected_path = "gfx/blue/";
  46.                         Global.singleAtlas=false;
  47.                         Global.atlas1Width=610;
  48.                         Global.atlas1Height=1024;
  49.                         Global.atlas2Width=640;
  50.                         Global.atlas2Height=690;
  51.                 }
  52.                
  53.         }
  54.        
  55.        
  56. }
  57.  
  58.  
Parsed in 0.012 seconds, using GeSHi 1.0.8.4


ResourseManger

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  1.  
  2.  
  3.  
  4.  
  5. public class ResourceManager {
  6.  
  7.         // ResourceManager Singleton instance
  8.         private static ResourceManager INSTANCE;
  9.  
  10.         /*
  11.          * The variables listed should be kept public, allowing us easy access to
  12.          * them when creating new Sprites, Text objects and to play sound files
  13.          */
  14.         public ITextureRegion mBackgroundTextureRegion=null;
  15.         public ITextureRegion mMainImageTextureRegion=null;
  16.         public ITextureRegion mStarTextureRegion=null;
  17.         public ITextureRegion mBeamTextureRegion=null;
  18.  
  19.         // public BuildableBitmapTextureAtlas mBGTextureAtlas ;
  20.  
  21.         ResourceManager() {
  22.                 // The constructor is of no use to us
  23.         }
  24.  
  25.         public synchronized static ResourceManager getInstance() {
  26.                 if (INSTANCE == null) {
  27.                         INSTANCE = new ResourceManager();
  28.                 }
  29.                 return INSTANCE;
  30.         }
  31.  
  32.         public synchronized void loadBlueTextures(Engine pEngine, Context pContext) {
  33.                 // Set our game assets folder in "assets/gfx/game/"
  34.  
  35.                 unloadGameTextures();
  36.                 BitmapTextureAtlasTextureRegionFactory
  37.                                 .setAssetBasePath(Global.selected_path);
  38.  
  39.                 BuildableBitmapTextureAtlas mFirstTextureAtlas = new BuildableBitmapTextureAtlas(
  40.                                 pEngine.getTextureManager(), Global.atlas1Width,
  41.                                 Global.atlas1Height, TextureOptions.BILINEAR);
  42.  
  43.                 mBackgroundTextureRegion = BitmapTextureAtlasTextureRegionFactory
  44.                                 .createFromAsset(mFirstTextureAtlas, pContext, "bg.png");
  45.  
  46.                 if (Global.singleAtlas) {
  47.  
  48.                         mMainImageTextureRegion = BitmapTextureAtlasTextureRegionFactory
  49.                                         .createFromAsset(mFirstTextureAtlas, pContext, "jesus.png");
  50.  
  51.                         mStarTextureRegion = BitmapTextureAtlasTextureRegionFactory
  52.                                         .createFromAsset(mFirstTextureAtlas, pContext,
  53.                                                         "small_star.png");
  54.                         mBeamTextureRegion = BitmapTextureAtlasTextureRegionFactory
  55.                                         .createFromAsset(mFirstTextureAtlas, pContext, "beam.png");
  56.  
  57.                         try {
  58.                                 mFirstTextureAtlas
  59.                                                 .build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(
  60.                                                                 0, 0, 1));
  61.                                 mFirstTextureAtlas.load();
  62.  
  63.                         } catch (TextureAtlasBuilderException e) {
  64.  
  65.                                 Debug.e(e);
  66.                         }
  67.  
  68.                 } else {
  69.  
  70.                         BuildableBitmapTextureAtlas mSecondTextureAtlas = new BuildableBitmapTextureAtlas(
  71.                                         pEngine.getTextureManager(), 640, 690);
  72.                         mMainImageTextureRegion = BitmapTextureAtlasTextureRegionFactory
  73.                                         .createFromAsset(mSecondTextureAtlas, pContext, "jesus.png");
  74.                         mStarTextureRegion = BitmapTextureAtlasTextureRegionFactory
  75.                                         .createFromAsset(mSecondTextureAtlas, pContext,
  76.                                                         "small_star.png");
  77.                         mBeamTextureRegion = BitmapTextureAtlasTextureRegionFactory
  78.                                         .createFromAsset(mSecondTextureAtlas, pContext, "beam.png");
  79.                         try {
  80.                                 mFirstTextureAtlas
  81.                                                 .build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(
  82.                                                                 0, 0, 0));
  83.                                 mFirstTextureAtlas.load();
  84.  
  85.                                 mSecondTextureAtlas
  86.                                                 .build(new BlackPawnTextureAtlasBuilder<IBitmapTextureAtlasSource, BitmapTextureAtlas>(
  87.                                                                 0, 0, 0));
  88.                                 mSecondTextureAtlas.load();
  89.  
  90.                         } catch (TextureAtlasBuilderException e) {
  91.                                 Debug.e(e);
  92.                         }
  93.                 }
  94.  
  95.         }
  96.  
  97.         public synchronized void unloadGameTextures() {
  98.                 // call unload to remove the corresponding texture atlas from memory
  99.  
  100.                 try {
  101.  
  102.                         if (Global.singleAtlas) {
  103.                                 if (((BuildableBitmapTextureAtlas) mBackgroundTextureRegion
  104.                                                 .getTexture()) != null) {
  105.                                         ((BuildableBitmapTextureAtlas) mBackgroundTextureRegion
  106.                                                         .getTexture()).unload();
  107.                                 }
  108.                         } else {
  109.  
  110.                                 if (((BuildableBitmapTextureAtlas) mBackgroundTextureRegion
  111.                                                 .getTexture()) != null
  112.                                                 && ((BuildableBitmapTextureAtlas) mMainImageTextureRegion
  113.                                                                 .getTexture()) != null) {
  114.                                         ((BuildableBitmapTextureAtlas) mBackgroundTextureRegion
  115.                                                         .getTexture()).unload();
  116.                                         ((BuildableBitmapTextureAtlas) mMainImageTextureRegion
  117.                                                         .getTexture()).unload();
  118.                                 }
  119.  
  120.                         }
  121.  
  122.                 } catch (Exception er) {
  123.                         System.out.println("uload error : " + er);
  124.                 }
  125.        
  126.                 System.gc();
  127.         }
  128.  
  129. }
  130.  
  131.  
  132.  
Parsed in 0.015 seconds, using GeSHi 1.0.8.4



Please help me,
REDD LABS
 
Posts: 11
Joined: Tue Jan 29, 2013 6:02 pm

Return to Live-Wallpaper

Who is online

Users browsing this forum: No registered users and 3 guests