2012-01-26 3 views
1

안드로이드 게임 (2d 플랫폼)에서 작업 중이며 메모리 부족 문제가 발생합니다. 나는 주어진 시간에 메모리에 저장되는 비트 맵의 ​​수를 줄이기 위해 할 수있는 모든 것을했지만 여전히 문제가있다. 몇 가지 간단한 질문.안드로이드에서 비트 맵 재사용

1) 다음 코드는 적의 모든 인스턴스에 대해 하나의 비트 맵을 올바르게 사용합니까?

Bitmap pusher2 = BitmapFactory.decodeResource(res, R.drawable.pusher_white); 
Bitmap stinger2 = BitmapFactory.decodeResource(res,R.drawable.stinger_glow_v2_135x135) 
Bitmap lightTrap2 = BitmapFactory.decodeResource(res, R.drawable.light_trap_v3_64x33); 

Enemy e21 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 17*32, 61*32-32, -50, 0); 
Enemy e22 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 27*32, 57*32-32, -50, 0); 
Enemy e23 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 47*32, 34*32-32, -50, 0); 
Enemy e24 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 10*32, 29*32-32, -50, 0); 
Enemy e25 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 19*32, 29*32-32, 50, 0); 
Enemy e26 = new Enemy(assets, pusher2, Enemy.SLIME, 32, 42, 12, 12, 35*32, 20*32-32, -50, 0); 
Enemy e27 = new Enemy(assets, stinger2, Enemy.STINGER, 135, 135, 22, 22, 32*32, 57*32-135, 144, 0, 23*32, 42*32); 
Enemy e28 = new Enemy(assets, stinger2, Enemy.STINGER, 135, 135, 22, 22, 30*32, 40*32-135, 144, 0, 26*32, 41*32); 
Enemy e29 = new Enemy(assets, stinger2, Enemy.STINGER, 135, 135, 22, 22, 35*32, 6*32-135, 144, 0); 
Enemy e2a = new Enemy(assets, lightTrap2, Enemy.LIGHT_TRAP, 33, 64, 5, 24, 30*32, 21*32-33, 0, 0); 
Enemy e2b = new Enemy(assets, lightTrap2, Enemy.LIGHT_TRAP, 33, 64, 5, 24, 40*32, 21*32-33, 0, 0); 
Enemy e2c = new Enemy(assets, lightTrap2, Enemy.LIGHT_TRAP, 33, 64, 5, 24, 34*32, 13*32-33, 0, 0); 

2) 길 찾기를 변경하는 일반적인 방법은 스프라이트 시트를 원본의 미러 사본으로 바꾸는 것입니다. 이 방법은 플레이어에게 좋지만 동일한 시트를 모두 참조하는 경우 적에게는 불가능한 것처럼 보입니다. 모든 적의 스프라이트 시트의 미러 사본과 미러되지 않은 사본을 모두 메모리에 저장해야합니까, 아니면 더 좋은 방법이 있습니까?

3) 비트 맵이 아닌 다른 응용 프로그램에서 원시 힙에 저장된 내용이 있습니까? 거기를보고 어떤 것이 있는지 볼 방법이 있습니까? 새로운 레벨로로드하기 위해 모든 비트 맵을 재활용 한 후 약 6k에 있습니다. 조금 높은 느낌입니다.

미리 감사드립니다!

답변

1

먼저 질문을 보내주십시오. 언제 OutOfMemory이 발생합니까? 비트 맵을로드 할 때 또는 게임 중간에?

여기에 지금은 오랜 시간 동안 사용하고 접근 그리고 그것은 나에게 가장 편리한 것 같습니다 :

  1. 로드 및 응용 프로그램의 모든 Bitmaps을 언로드하는 클래스를 만듭니다.
  2. BitmapManager (그 방법이라고 부름) 클래스의 Bitmap 개체에 대한 참조가 공개되도록하십시오.
  3. 클래스 내부의 Bitmap 개체에 대한 참조를 보유하지 말고 onDraw 개체의 BitmapManager 개체에 대한 참조를 사용하면됩니다.

미러링 할 때 Bitmaps을 만들 때 런타임에 생성하지 마십시오. 비트 맵을로드 할 때 모두 미러링하십시오. 그렇지 않으면 앱이 종료됩니다. 희망이 도움이됩니다.

+0

레벨 시작 부분에 비트 맵을로드하면 발생합니다. 나는 백그라운드에서로드해야하는데, 비트 맵은 레벨을 그리기위한 스크린의 크기이고, 플레이어와 적을위한 스프라이트 시트이다. 제쳐두고 각 애니메이션마다 별도의 시트가 아닌 모든 스프라이트를 하나의 시트에 저장하면 어떤 이점이 있습니까? –

+0

@CodyAlbert, 네이티브 Android 게임 개발에서 스프라이트 시트를 사용한 적이 없으므로 질문에 대답 할 수 없습니다 .. – Egor

+0

'bm.recycle()'비트 맵을 재활용한다고 가정하면 같은 비트 맵을 다시로드하려고하면 IllegalStateException '. 비트 맵을 재활용 한 후 다시로드하는 방법에 대한 의견이 있으십니까? –

관련 문제