2014-01-21 4 views
0

나는 안드로이드 게임에서 총 24 비트의 비트 맵을 가지고 있으며, 총 644kb가있다.android out of memory and fatal signal 11 error

내 게임에는 3 가지 활동, 기본 메뉴 활동, 레벨 메뉴 활동 및 게임 활동이 있습니다.

나는 첫 번째 것을 입력하고, 두 번째는 내가 선택한 다음, 내 레벨을 선택하고 게임을 시작합니다. 레벨을 끝내면 창이 펑하고 올라가서 (다시 시도, 메뉴, 다음 레벨로 돌아 가기) 원하는 것을 선택하고 다음 레벨을 선택하고, 다음 레벨을 플레이하고, 끝내고, 계속 진행합니다. 다음 레벨이지만 게임은 멈 춥니 다.

01-19 17:03:54.100: E/dalvikvm-heap(8604): Out of memory on a 16000016-byte allocation. 
    01-19 17:03:54.110: I/dalvikvm(8604): "main" prio=5 tid=1 RUNNABLE 
    01-19 17:03:54.110: I/dalvikvm(8604): | group="main" sCount=0 dsCount=0 obj=0x40ece568 self=0x40e2bb00 
    01-19 17:03:54.110: I/dalvikvm(8604): | sysTid=8604 nice=0 sched=0/0 cgrp=apps handle=1075340848 
    01-19 17:03:54.110: I/dalvikvm(8604): | schedstat=(4853149437 2903961165 6778) utm=426 stm=59 core=0 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 


    01-19 17:03:54.110: I/dalvikvm(8604): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:500) 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:353) 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:376) 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:406) 
    01-19 17:03:54.110: I/dalvikvm(8604): at com.example.happylines.GameActivity$Screen.LoadBitmaps(GameActivity.java:357) 
    01-19 17:03:54.110: I/dalvikvm(8604): at com.example.happylines.GameActivity$Screen.<init>(GameActivity.java:474) 
    01-19 17:03:54.110: I/dalvikvm(8604): at com.example.happylines.GameActivity.onCreate(GameActivity.java:300) 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.app.Activity.performCreate(Activity.java:5008) 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2043) 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104) 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.app.ActivityThread.access$600(ActivityThread.java:134) 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199) 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.os.Handler.dispatchMessage(Handler.java:99) 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.os.Looper.loop(Looper.java:137) 
    01-19 17:03:54.110: I/dalvikvm(8604): at android.app.ActivityThread.main(ActivityThread.java:4782) 
    01-19 17:03:54.110: I/dalvikvm(8604): at java.lang.reflect.Method.invokeNative(Native Method) 
    01-19 17:03:54.110: I/dalvikvm(8604): at java.lang.reflect.Method.invoke(Method.java:511) 
    01-19 17:03:54.110: I/dalvikvm(8604): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
    01-19 17:03:54.110: I/dalvikvm(8604): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
    01-19 17:03:54.110: I/dalvikvm(8604): at dalvik.system.NativeStart.main(Native Method) 
    01-19 17:03:54.120: A/libc(8604): Fatal signal 11 (SIGSEGV) at 0x0004d190 (code=1), thread 8604 (mple.happylines) 

내가 활동을 전환 할 때마다 나는 (마무리를 사용, 또한 내가 모든 비트 맵 크기를 추가하면 난 단지 6백44킬로바이트을 가지고 있기 때문에, 왜 내 전화의 메모리가 부족 갈 수 이해 ... 그리고하지 않음); 활동 시작 후.

여기 게임 활동에 비트 맵을로드합니다.

face_happy = BitmapFactory.decodeResource(getResources(), 
        R.drawable.happy_face); 
      face_happy = Game.ScaleWidth(face_happy, Game.faceRadio); 
      face_sad = BitmapFactory.decodeResource(getResources(), 
        R.drawable.sad_face); 
      face_sad = Game.ScaleWidth2(face_sad, Game.faceRadio); 
      particlez[0] = BitmapFactory.decodeResource(getResources(), 
        R.drawable.red_particle); 
      particlez[1] = BitmapFactory.decodeResource(getResources(), 
        R.drawable.blue_particle); 
      particlez[2] = BitmapFactory.decodeResource(getResources(), 
        R.drawable.green_particle); 
      particlez[3] = BitmapFactory.decodeResource(getResources(), 
        R.drawable.yellow_particle); 
      particlez[0] = Game.ScaleWidth(particlez[0], 14); 
      particlez[1] = Game.ScaleWidth(particlez[1], 14); 
      particlez[2] = Game.ScaleWidth(particlez[2], 14); 
      particlez[3] = Game.ScaleWidth(particlez[3], 14); 
      particlez[4] = Game.ScaleWidth(particlez[0], 10); 
      particlez[5] = Game.ScaleWidth(particlez[1], 10); 
      particlez[6] = Game.ScaleWidth(particlez[2], 10); 
      particlez[7] = Game.ScaleWidth(particlez[3], 10); 

      finish_bg = BitmapFactory.decodeResource(getResources(), 
        R.drawable.finishscreen); 
      play = BitmapFactory.decodeResource(getResources(), 
        R.drawable.play_button); 
      menu = BitmapFactory.decodeResource(getResources(), 
        R.drawable.menu_button); 
      retry = BitmapFactory.decodeResource(getResources(), 
        R.drawable.retry_button); 

      play = Game.ScaleWidth(play, 5.4f); 
      retry = Game.ScaleWidth(retry, 5.4f); 
      menu = Game.ScaleWidth(menu, 5.4f); 

      playY = Game.height - 2 * play.getHeight(); 
      menuY = playY; 
      retryY = playY; 
      menuX = Game.width/2 - menu.getWidth()/2; 
      playX = menuX + 1.5f * play.getWidth(); 
      retryX = menuX - 1.5f * play.getWidth(); 

다음 레벨 버튼을 누르면 게임 활동으로 다시 이동합니다.

Game.level++; 
        Intent intent = new Intent(GameActivity.this, 
          GameActivity.class); 
        startActivity(intent); 

        finish(); 

답변

0

안드로이드는 비트 맵 메모리를 해제 몇 가지 문제를 가지고, 그래서 더로드 된 비트 맵 추가 캐시를 추가하고 다음 단계에서 다시로드되지 않습니다 생각합니다. Singletone으로 캐시를 사용하여로드 된 비트 맵의 ​​인스턴스를 저장할 수 있습니다. 충돌로 인해 시작 단계의 시간이 단축됩니다.

1

이미지는 디스크에서 644KB이지만 메모리에서 압축되어 표시되기 때문에 안드로이드가 단일 이미지에 16MB를 할당하려고 시도하는 중입니다. 메모리가 부족합니다.

Images for mdpi devices: /res/drawable-mdpi 
Images for hdpi devices: /res/drawable-hdpi 
Images for xhdpi devices: /res/drawable-xhdpi 
Images for xxhdpi devices: /res/drawable-xxhdpi 

을 :

이 문제를 방지하려면, 당신은 당신이 당신의 당김 폴더에 대한 자원 예선을 활용하여 할 수있는 실행중인 장치에 대해 올바르게 크기있는 이미지를 사용하는 것이 좋습니다 이미지 (예 : R.drawable.myImage)를 요청하면 장치와 가장 일치하는 밀도 한정자가있는 폴더에서 myImage 파일을 찾습니다. 이렇게하면 소형 밀도 장치가 메모리 공간이 작은 이미지를 사용하는지 자동으로 확인할 수 있습니다. 여기

더 많은 정보 : 당신의 문제를 해결하는 가장 빠른 방법의 http://developer.android.com/guide/practices/screens_support.html

0

하나는 제이크 와튼에서 피카소 라이브러리를 사용하는 것입니다. http://square.github.io/picasso/

당신이 필요로하는 모든 코드는 다음과 같습니다 :

Picasso.with(context).load(image_ressource).into(yourImageView); 
은 여기

라이브러리를 다운로드 할 수있는 링크입니다 등등 다운로드, 이미지를로드 및 캐싱, 변환을 관리하는 코드 한 줄 수 있습니다

:)

+0

저는 imageviews를 사용하지 않습니다. –

+0

좋습니다. 따라서이 방법으로 드로어 블을 디코딩하는 것이 좋습니다. http://developer.android.com/training/displaying-bitmaps/load-bitmap.html – koni