2012-11-27 192 views
1

對於我的應用程序,我有高分辨率的紋理。爲了減少小屏幕大小我做這樣的:減少紋理的大小

@Override 
public void onLoadResources(){ 
    Options options = new BitmapFactory.Options(); 
    options.inScaled = false; 

    // calculation inSampleSize 
    int sm = 1; 
    if (cameraWidth+cameraHeight < 1280) sm = 2;// < 800x480 
    if (cameraWidth+cameraHeight < 800) sm = 4;// < 480x320 
    options.inSampleSize = sm; 

    mTexture = new BitmapTextureAtlas(2048/sm, 2048/sm, TextureOptions.BILINEAR_PREMULTIPLYALPHA); 
    // Loading bitmap 
    sky_bm = BitmapFactory.decodeResource(getResources(), R.drawable.sky, options); 
    sky_src = new BitmapTextureAtlasSource(sky_bm); 

    skyRegion = TextureRegionFactory.createFromSource(mTexture, sky_src, 0, 0, false); 

    mEngine.getTextureManager().loadTexture(mTexture); 

BitmapTextureAtlasSource代碼:

public class BitmapTextureAtlasSource extends BaseTextureAtlasSource implements IBitmapTextureAtlasSource { 

     private Bitmap mBitmap; 

     public BitmapTextureAtlasSource(Bitmap pBitmap) { 
      super(0,0); 
      //this.mBitmap = pBitmap; 
      this.mBitmap = pBitmap.copy(Bitmap.Config.ARGB_8888, false); 
     } 

     public int getWidth() { 
      return mBitmap.getWidth(); 
     } 

     public int getHeight() { 
      return mBitmap.getHeight(); 
     } 

     @Override 
     public BitmapTextureAtlasSource clone() { 
      return new BitmapTextureAtlasSource(Bitmap.createBitmap(mBitmap)); 
     } 

     public Bitmap onLoadBitmap(Config pBitmapConfig) { 
       return mBitmap; 
     } 

     @Override 
     public IBitmapTextureAtlasSource deepCopy() { 
      return null; 
     } 
    } 

但旋轉屏幕的時候,我得到的錯誤:

FATAL EXCEPTION: GLThread 4895 
java.lang.IllegalArgumentException: bitmap is recycled 
    at android.opengl.GLUtils.texSubImage2D(GLUtils.java:220) 
    at org.anddev.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas.writeTextureToHardware(BitmapTextureAtlas.java:162) 
    at org.anddev.andengine.opengl.texture.Texture.loadToHardware(Texture.java:116) 
    at org.anddev.andengine.opengl.texture.TextureManager.updateTextures(TextureManager.java:146) 
    at org.anddev.andengine.engine.Engine.onDrawFrame(Engine.java:507) 
    at org.anddev.andengine.opengl.view.RenderSurfaceView$Renderer.onDrawFrame(RenderSurfaceView.java:154) 
    at net.rbgrn.opengl.GLThread.guardedRun(GLThread.java:235) 
    at net.rbgrn.opengl.GLThread.run(GLThread.java:94) 

請告訴我我做錯了什麼。我會很感激的任何信息

+0

我想問題可能是在BitmapTextureAtlasSource。你能發佈它的代碼嗎? –

+0

另一件我會質疑的是2048x2048的BitmapTextureAtlas的使用 - 甚至一些高端設備可能會抱怨。 – jmroyalty

回答

0

我想這個問題可能是在onLoadBitmap,你應該返回副本。我建議你試試這個實現擴展EmptyBitmapTextureAtlasSource:

public class BitmapTextureSource extends EmptyBitmapTextureAtlasSource { 

private Bitmap mBitmap; 

public BitmapTextureSource(Bitmap bitmap) { 
    super(bitmap.getWidth(), bitmap.getHeight()); 
    mBitmap = bitmap;  
} 

@Override 
public Bitmap onLoadBitmap(Config pBitmapConfig) { 
    return mBitmap.copy(pBitmapConfig, true);  
} 

}

+0

是的,它的工作原理!如果mBitmap.copy(Bitmap.Config.ARGB_8888,true)也插入到構造函數中。非常感謝羅德里戈迪亞斯。 – TimaCh

0

我建議你設置你的決議政策RatioResolutionPolicy並讓引擎做你的縮放。

http://andengine.wikidot.com/detect-screen-resolution

+0

是的,我在我的應用程序中執行它。但我不想爲弱設備加載較大的紋理。 – TimaCh

+0

爲什麼不能有2(或更多)不同的圖像並加載相應的圖像? – jmroyalty

+0

因爲如果您支持多種設備(從240x320到720x1280),您將獲得非常大的APK大小。如果您正在使用動畫,爲不同分辨率生成數百個文件是非常痛苦的。 –