2010-04-08 4 views
4

많은 양의 PNG 그림으로 게임을 쓰고 있습니다. 모두 괜찮 았어. WebView으로 새로운 활동을 추가하고 메모리 부족을 경험했습니다. 그 후 나는 약간의 실험을했습니다 - 게임 PNG 이미지를 색으로 채워진 이미지로 대체하십시오. 결과로 메모리 부족이 사라졌습니다..png 파일의 크기가 줄이면 결과가 약간의 영향을받습니다.

하지만 Bitmap은 내부적으로 각 픽셀을 개별적으로 유지하므로 이러한 변경은 효과가 없어야합니다. 알파 채널이있는 초기 이미지와 테스트 이미지가 맞지 않을 수 있습니다.

그러나 실제로는 질문 : PNG 이미지 파일 크기가 줄어들면 VM 응용 프로그램 힙 사용량이 감소하는지 여부가 영향을 받습니까?

답변

3

안드로이드이든 아니든간에 메모리의 비트 맵은 압축되지 않으므로 (픽셀 당 비트) * 너비 * 높이를 가지므로 픽셀 형식에 따라 약간의 차이가 있습니다.

PNG가 그려지는 방법에 대해 자세히 알지 못하지만 더 단순한 PNG가 디코딩 할 메모리가 적다는 사실이 발생할 수 있습니다.

1

안드로이드에서 비트 맵 객체의 메모리 사용은 원래 형식 (jpg, png, etc ...) 또는 파일 크기가 아닌 이미지 해상도와 관련이 있습니다. 약 3 바이트 pr 픽셀 (1 바이트 pr 색상 채널)이 필요합니다.

어쨌든 BitmapFactory를 사용하여 이미지를 디코딩하는 경우 입력 스트림을 디코딩 할 때 작은 소스 파일의 메모리가 더 적게 필요합니다.

Dalvik 디버거 (ddms)를 사용하여 직접 테스트 할 수 있습니다. Sysinfo 탭의 드롭 다운에서 메모리 사용을 선택하십시오. 당신은 얼마나 많은 메모리를 사용하여 응용 프로그램을 볼 수 있습니다.

4

이미지를 디코딩하는 비트 맵 구성을 조사해야합니다. 구체적으로 구성 파일의 의미는 모르지만 예를 들어 ARGB_8888 또는 단순히 RGB_565로 디코딩 할 수 있습니다. RGB_565는 알파 (투명도) 채널이없고 각 색상별로 비트를 덜 사용하기 때문에 메모리 사용량이 적습니다. 귀하의 경우에 일어날 일은 단순한 이미지가 RGB_565로 디코딩되는 반면 더 복잡한 것들은 ARGB_8888로 디코딩된다는 것입니다. 그와

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inPreferredConfig = Bitmap.Config.RGB_565; 
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon, options); 

실험을하고 도움이 있는지 다음과 같이

사용되는 구성을 변경하는 방법은 이미지 파일의 디코딩 중입니다. 그게 분명 내 게임에 도움이되었습니다.

+0

예, 테스트를 할 때 옵션없이 BitmapFactory.decodeResource()를 사용 했으므로 하나의 컬러 이미지를 RGB_565로 디코딩하고 게임 이미지를 ARGB_8888로 디코딩 할 수 있습니다. 전이 문제에 대해 생각하고 있지 않습니다.하지만 오늘 일하게 될 때 저는 한 가지 옵션 인 ARGB_8888을 사용하여 두 번째 테스트를 실시하고 어떻게되는지 봅니다. 불행히도 거의 모든 게임 이미지에는 투명도가 필요하므로 RGB_565를 사용할 수 없습니다. 이제 ARGB_4444를 사용합니다. – nahab

+0

.png 파일의 크기가 어떻게 든 비트 맵 메모리에 영향을 미칩니다. 다음 주에 더 깊은 조사를 할거야. – nahab

관련 문제