게임에 쓰려고 인물들의 얼굴과 대사를 화면에 표시하는 부분을 제작하고 있는데,
중간에 프로그램이 죽어버립니다.
로그캣 에러 내용입니다.
08-06 21:36:34.593: ERROR/dalvikvm-heap(13210): 11289952-byte external allocation too large for this process.
08-06 21:36:34.621: INFO/dalvikvm-heap(13210): Clamp target GC heap from 33.516MB to 32.000MB
08-06 21:36:34.621: ERROR/GraphicsJNI(13210): VM won't let us allocate 11289952 bytes
08-06 21:36:34.621: DEBUG/dalvikvm(13210): GC_FOR_MALLOC freed 0K, 48% free 2886K/5511K, external 26945K/28993K, paused 16ms
08-06 21:36:34.621: DEBUG/AndroidRuntime(13210): Shutting down VM
08-06 21:36:34.621: WARN/dalvikvm(13210): threadid=1: thread exiting with uncaught exception (group=0x40015560)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): FATAL EXCEPTION: main
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.graphics.Bitmap.nativeCreate(Native Method)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.content.res.Resources.loadDrawable(Resources.java:1709)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.content.res.Resources.getDrawable(Resources.java:581)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at com.uni.y.SActivity.onCreate(SActivity.java:59)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.os.Handler.dispatchMessage(Handler.java:99)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.os.Looper.loop(Looper.java:130)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at android.app.ActivityThread.main(ActivityThread.java:3683)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at java.lang.reflect.Method.invokeNative(Native Method)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at java.lang.reflect.Method.invoke(Method.java:507)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-06 21:36:34.624: ERROR/AndroidRuntime(13210): at dalvik.system.NativeStart.main(Native Method)
08-06 21:36:34.632: WARN/ActivityManager(110): Force finishing activity com.uni.y/.SActivity
08-06 21:36:34.632: WARN/ActivityManager(110): Force finishing activity com.uni.y/.YActivity
wrap.setOnClickListener(new LinearLayout.OnClickListener(){
public void onClick(View v){
if(count<numOfLines){
if(script[count].equals("char")){
if(isFirstFaceView){
face1.setBackgroundDrawable(SActivity.this.getResources().getDrawable(getDrawableId(SActivity.this,script[count+1])));
fFlipper.showNext();
isFirstFaceView=false;
count+=2;
}else{
face.setBackgroundDrawable(SActivity.this.getResources().getDrawable(getDrawableId(SActivity.this,script[count+1])));
fFlipper.showPrevious();
isFirstFaceView=true;
count+=2;
}
}
if(isFirstTextView){
text1.setText(script[count++]);
mFlipper.showNext();
isFirstTextView=false;
}else{
text.setText(script[count++]);
mFlipper.showPrevious();
isFirstTextView=true;
}
}
}
});
public static int getDrawableId(Context context, String name)
{
Assert.assertNotNull(context);
Assert.assertNotNull(name);
return context.getResources().getIdentifier(name,"drawable", context.getPackageName());
}
ViewFlipper 두 개를 사용해서
하나는 사람 얼굴이 들어갈 ImageView 두 개가 들어있고,
다른 하나는 대사가 들어갈 TextView 두 개가 들어있습니다.
setBackgroundDrawable로 ImageView에 들어가는 얼굴을 바꿔주는데,
두 ImageView를 각각 다른 이미지로 바꾸면 프로그램이 죽어버립니다.
뭐가 잘못됐을까요...




일단 화면에 Display되는 Image를 설정하기위해 리소스 image를 bitmap으로 생성하는 루틴에서 메모리 부족으로 종료되었네요,
로그를 보니 생성하고자하는 비트맵의 힙 크기가 11MB 정도 되네요, image 리소스 및 관련 코드(scale)를 먼저 확인 하시는게 좋을 듯 싶네요. Android Phone의 한 Process에서 사용 할 수 있는 Memory에 제한이 있으니, 너무 용량이 큰 이미지는 사용하지 말아야합니다.