2014-11-01 3 views
1

힙이 서서히 채워지면서 8 번 이상 게임을 계속 한 후 OutOfMemory 오류가 발생합니다. 내 게임의 힙을 분석하기 위해 MAT를 사용할 때Android 메모리 누수 비트 맵

1) "android.graphics.Bitmap"이 (가)로드 한 인스턴스는 6,554,944 (35.34 %) 바이트를 차지합니다. 메모리는 ""에 의해로드 된 "byte []"의 한 인스턴스에 누적됩니다. enter image description here

키워드 android.graphics.Bitmap 바이트 [] ''에 의해로드 된 클래스 "android.content.res.Resources"는, 6446248 (34.76 %) 바이트를 차지

2). 메모리는 ""에 의해로드 된 "java.lang.Object []"의 한 인스턴스에 누적됩니다. enter image description here

키워드 java.lang.Object 상위 [] android.content.res.Resources

이미지, 예를 재활용하기 위해 해상도를

+0

이 이미지를 수행 이미 적절한의 세계를 저장? mdpi처럼, hdpi? 아니면 모든 화면에 단일 한 거대한 이미지를 사용하고 있습니까? –

+0

@BlazeTama 빠른 하나 .. 감사. 난 720p의 이미지를 hdpi 폴더에 3 액티비티 화면으로 가지고 있는데, 나는 을 사용하여 디스플레이한다. 나는 onDestroy()를 언 바인딩한다. 게임에서 사용되는 이미지의 경우 렌더러에서 R.drawable. *로 직접 호출합니다. – David

답변

0

시도를 제안하십시오 :

if(image!= null) { 
    ((BitmapDrawable)image.getDrawable()).getBitmap().recycle(); //here 
    image= (ImageView) view.findViewById(R.id.image); 
    image.setImageResource(yourresource); 
} 
else { 
    image= (ImageView) view.findViewById(R.id.image); 
    imageView.setImageResource(yourresource); 
} 
+0

나는 이것을 시도하고 다시 연락 할 것입니다. 아래처럼 공간을 유지하기 위해 byte [] 버퍼 직접 할당을 할 수 있습니까? ByteBuffer bb = ByteBuffer.allocateDirect (4 * this.s.size()); bb.order (ByteOrder.NativeOrder()); this.vertexBuffer = bb.asFloatBuffer(); '그렇다면 어떻게 해제 할 수 있습니까? – David

+0

@David 죄송합니다. 버퍼에 대해 잘 모르겠습니다. –

+0

해결책을 찾으 셨습니다. 나는 일을 한 것처럼 보였지만 여전히 게임을 계속할 때마다 같은 오류가 발생합니다 (해결책이 지연되었습니다). 나는 다른 원인 (원인 2)도이 문제를 영구적으로 해결해야한다고 생각한다. 어떤 생각? – David

0

의 경우를 게임에서 비트 맵을 많이 사용하는 경우 (예 : imageButtons 등)에는 활동을 유지하지 않는 것이 좋습니다.

  1. 당신은 모든 큰 항목에 대한 setImageDrawable (NULL)와 onPause/onResume에서로드/언로드 게임을 재생할 수 있습니다. 그런 다음 각 이력서가있는보기에서 드로어 블을 다시 설정해야합니다. # 3을하지 않으면이 방법이 좋습니다.

  2. 조각을 사용할 수 있습니다. 조각을 사용할 때보기가 언로드된다는 문제가 해결되었습니다.

  3. 작업이 필요한 경우 startActivity (myIntent) 바로 다음에 finish()를 사용할 수 있습니다. 왼쪽 활동이 더 이상 뒤쪽 스택에 없기 때문에이 경우에는 뒤로 버튼을 무시하고 탐색을 제어해야합니다.

능숙 자신에 관해서는, 당신은 그릴 수-nodpi에 대한 물건을 많이 읽을 것입니다,하지만 당신은 프로그램 레이아웃 및 XML 레이아웃 adjustements의 혼합이있는 경우, 당신은 당신이 자산을 가지고 있는지 확인하는 것이 좋습니다 모든 drawable-dpi 폴더에서 imageButtons에 큰 차이가 있습니다.

또한 코드에서 setmaxheight를 사용하지 말고 layoutparams 높이를 사용하십시오. 그게 날 imageButton에 대한 메모리를 두 번 이상 죽였어.

그리고 당신은 당신의 코드에서보기로 PNG 파일을로드하는 경우, 글라이드 또는 피카소 사용하고 자신에게 상처 : 각 화면 크기에 대한