2011-08-05 6 views
1

내 게임에서 표면 뷰를 사용합니다 (GL을 사용해야 함). 많은 게임 캐릭터 세계에 비트 맵을 그립니다. LogDog를 열었을 때이 문제가 발생합니다.안드로이드 개발 : 비트 맵 표면에 누수 메모리 또는 너무 큽니다?

08-05 10:17:29.151: ERROR/dalvikvm(24048): Out of memory: Heap Size=5379KB, Allocated=2735KB, Bitmap Size=20576KB, Limit=32768KB 

누출인지 알 수 없습니다.

내 할당 추적기 보여줍니다

(30)와 같은 그런 다음

138 96 char[] 9 android.content.res.AssetManager getCookieName 

톤의 :

32 80 android.graphics.BitmapFactory$Options 9 android.graphics.BitmapFactory decodeResource 

그리고 마지막 : 30처럼 :

141 56 android.graphics.Bitmap 9 android.graphics.BitmapFactory nativeDecodeAsset 

그리고 simular 것들도 더 있습니다. 여기

내가 하수구 내 기억을 생각하는 몇 가지 코드 :

player = BitmapFactory.decodeResource(getResources(), R.raw.ghostright); 
     world = BitmapFactory.decodeResource(getResources(), R.raw.lvl2); 
     thumb = BitmapFactory.decodeResource(getResources(), R.raw.thumb); 

resized = Bitmap.createScaledBitmap(player, width/10, width/6, false); 
     player = resized; 


     resized = Bitmap.createScaledBitmap(world, height*10, height, false); 
     world = resized; 


     resized = Bitmap.createScaledBitmap(thumb, height/6, height/6, false); 
     thumb = resized; 
내가 resycle를 사용해야하지만 난 항상 비트 맵을 사용하기 때문에 위치를 잘 모릅니다 들었

// 사이먼 PS : 난 정말 도움이 필요해 .-

답변

1

나는 SurfaceView에서 많은 비트 맵을 사용하는데이 문제가 없다. 애니메이션 스프라이트의 경우 프레임별로 프레임을 개별적으로로드하는 대신 스프라이트 시트를 사용할 수 있습니다.

당신은 당신이 말하는 단지 수 있습니다 "크기 조정"참조를 사용할 필요가 없습니다

:

플레이어 = Bitmap.createScaledBitmap (플레이어,/10,/6, 사실 폭 폭);

이전 비트 맵은 참조를 잃어 GC에 의해 수집됩니다. 더 나은 품질을 만들기 위해 다시 스케일을 조정할 때 비트 맵 필터링을 위해 TRUE를 놓았습니다.

일부 장치에서는 onSizeChanged가 두 번 발생할 수 있습니다. 크기 조정을 수행하는 곳에서 비트 맵의 ​​크기를 두 번 조정할 수 있습니다.

로드 된 비트 맵의 ​​형식이 ARGB_4444 또는 ARGB_8888 등일 수 있습니다. 따라서이 옵션을 탐색해야 할 수도 있습니다. 메모리를 적게 차지하는 형식을 사용할 수 있다면 게임에 충분한 품질을 제공 할 수 있습니다. 물론 이미지를 필요할 때보 다 더 크게 그리고 필요할 때마다 메모리에로드하는 것이 규칙입니다.

1

메모리 누수가 없어야합니다. 많은 메모리에 할당하려는 너무 큰 비트 맵을 가지고있을 수 있습니다. 다음은 비트 맵이 차지하는 메모리 양을 결정하는 좋은 방법입니다. W * H * 8. 300 * 300px의 비트 맵을 가지고 있다면 300 * 300 * 8 = 720kb입니다.

주어진 시간에 얼마나 많은 힙을 할당했는지 파악하고 새 비트 맵을 할당하지 않는다고해도 시간이 지남에 따라 증가하는지 확인하십시오. 그렇다면 네, 메모리 누수가 있습니다. 그러나 시작과 동시에 앱이 충돌하는 경우 힙 한도를 초과했을 가능성이 큽니다.

관련 문제