2013-04-25 152 views
0

我有一個GLSurfaceView和一個渲染器,它在onSurfaceCreated中加載紋理。我的紋理創建像這樣:加載大紋理時內存溢出

public Texture3D(final GL10 gl, final int id) { 
    _pBitmap = BitmapFactory.decodeResource(Utils.getResources(), id); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 

    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
    texture = newTextureID(gl); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, texture); 
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 

    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 


    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, _pBitmap, 0); 

    _pBitmap.recycle();  
    _pBitmap = null; 

    gl.glEnable(GL10.GL_BLEND); 
} 

我把它們存儲在一個HashMap中:

textures.put(R.drawable.tile, new Texture3D(gl, R.drawable.tile)); 

我的問題是,當我創建一個大的圖像(720x1280,561 KO)紋理後

我有時會以下錯誤:

04-24 11:05:19.870: D/dalvikvm(27953): GC_CONCURRENT freed 26K, 18% free 50397K/60743K, paused 18ms+6ms, total 57ms 
04-24 11:05:19.870: D/dalvikvm(27953): WAIT_FOR_CONCURRENT_GC blocked 2ms 
04-24 11:05:19.895: D/dalvikvm(27953): GC_FOR_ALLOC freed 7K, 18% free 50390K/60743K, paused 25ms, total 25ms 
04-24 11:05:19.900: I/dalvikvm-heap(27953): Forcing collection of SoftReferences for 14745616-byte allocation 
04-24 11:05:19.940: D/dalvikvm(27953): GC_BEFORE_OOM freed 10K, 18% free 50380K/60743K, paused 41ms, total 41ms 
04-24 11:05:19.940: E/dalvikvm-heap(27953): Out of memory on a 14745616-byte allocation. 
04-24 11:05:19.940: I/dalvikvm(27953): "GLThread 11210" prio=5 tid=35 RUNNABLE 
04-24 11:05:19.940: I/dalvikvm(27953): | group="main" sCount=0 dsCount=0 obj=0x42ec2008 self=0x6095d078 
04-24 11:05:19.940: I/dalvikvm(27953): | sysTid=29199 nice=0 sched=0/0 cgrp=apps handle=1623155456 
04-24 11:05:19.940: I/dalvikvm(27953): | schedstat=(142147207 17456123 110) utm=11 stm=2 core=2 
04-24 11:05:19.940: I/dalvikvm(27953): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
04-24 11:05:19.945: I/dalvikvm(27953): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623) 
04-24 11:05:19.945: I/dalvikvm(27953): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:476) 
04-24 11:05:19.945: I/dalvikvm(27953): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:499) 
04-24 11:05:19.945: I/dalvikvm(27953): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:529) 
04-24 11:05:19.945: I/dalvikvm(27953): at com.gbanga.opengl.Texture3D.<init>(Texture3D.java:73) 
04-24 11:05:19.945: I/dalvikvm(27953): at com.gbanga.opengl.Texture3D.setupTextures(Texture3D.java:169) 
04-24 11:05:19.945: I/dalvikvm(27953): at com.gbanga.opengl.OpenGLRenderer.onSurfaceCreated(OpenGLRenderer.java:440) 
04-24 11:05:19.950: I/dalvikvm(27953): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1494) 
04-24 11:05:19.950: I/dalvikvm(27953): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240) 

指向哪裏使用BitmapFactory.decodeResource構造函數的第一行。在我的Galaxy S3上,當我切換到另一個片段時出現錯誤,然後我回到顯示GLSurfaceView(0123'98和onResumeGLSurfaceView上被調用)的片段。

我該如何避免這個問題?我嘗試了this solution,但是我失去了太多的質量,並且在很少的情況下無論如何都會發生錯誤(可能在舊手機型號上)。

如何創建/存儲我的紋理有什麼問題嗎?你也知道爲什麼我不總是得到這個錯誤嗎? (通常我第二次加載紋理時就會得到它)。

+0

嘗試增加VM堆的大小。希望這會幫助你解決你的問題... – 2013-04-25 07:18:41

+0

我建議,嘗試用MAT分析內存。 http://www.eclipse.org/mat/ – 2013-04-25 07:55:17

回答

0

您可以嘗試從Android虛擬設備管理器中編輯AVD增加虛擬機堆的大小...

+0

我不在模擬器上工作,但感謝 – Fr4nz 2013-04-25 08:37:22

0

如果你的應用程序將處理大量的大紋理,並且如果你想支持較老的模型電話,那麼在本地進行opengl處理可能會更有利。

NDK中的hello-gl2示例顯示瞭如何完成此操作。在本機方面,您將免除由應用程序虛擬機實施的限制(但應確保您正確管理內存並且不會造成任何泄漏,因爲即使用戶關閉了您的活動,該過程也會繼續運行)

+0

好的謝謝你的提示,這可能是我最後的選擇,因爲我需要重新編碼一切 – Fr4nz 2013-04-25 08:39:00