마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Android 게임어플 만드는 중인데 도움이 필요해요

0 추천

현재 기본적인 동작이라던지 기능들은 거의 구현했는데...

어플을 종료할때 오류가 뜬다든지... 혹은 미사일을 연속해서 발사시킬경우 에러가 발생하며 종료됩니다..

미사일 객체가 너무 많이 발생하여 계산할수 없다는 식의 글들이 많더군요...

(스마트폰의 화면밖으로 객체가 이동했을 시 객체를 ArrayList에서 제거하도록 작성하였습니다.)

 

에러가 발생되는 지점은 밑에 표시된 부분이구요

 
 

로그캣 내용은 이렇습니다.

현재 책에서 제공하는 기본프레임(사용하기 편하도록 제공하는 패키지)을 사용하고 있는데 패키지 내용물중 스레드 부분에서 에러가 나네요... try catch문으로 확인해보니깐 _canvas에 오류날때쯤 null값이 가끔 잡힙니다.

스마트폰에서 계산처리 할 수 있는 한계가 있어서 오류가 난다고들 하는데... 이를 해결할 방법이 뭐 없을가요?

(for문을 foreach문으로 대체하여 속도를 향상시키는 방법으로 해결할수도 있다고들은 하지만.. 그래도 한계가 있네요;;;)

도움이 간절합니다...

mns034 (130 포인트) 님이 2014년 7월 22일 질문
이미지가 짤리네요;;;
마우스 우측누르시고 새탭에 열기로 하시면 보입니다
스레드 소스중에 밑에서 try catch로 _canvas값을 확인해본결과
null값이 갑자기 들어가면서 끝났네요... 어떻게된거지...

1개의 답변

+2 추천
게임 개발을 목표로 공부 하고 있는 사람으로서 반갑습니다!

 

게임은 최적화가 매우 중요하죠. 모바일 환경은 거기에 더해서 적은 메모리에 의한 메모리 관리도 중요합니다.

ArrayList에서 '제거한다'라는 말을 언급하신걸 보니 새로운 개체가 추가될 때 인스턴스를 새로 생성하시는 듯 하네요.

그런 방법은 많은 개체가 빠르게 생성/삭제되며 변화하는 게임에서는 적절하지 못한 방법입니다.

게임에서 가장 신경써야 되는 부분은 'new 명령어의 호출을 최대한 줄이라.'는 겁니다.

새로운 인스턴스의 생성은 상당한 부하를 가져다 주는 작업이거든요.

인스턴스를 새로 생성하지 말고 기존의 인스턴스를 재활용하는 방법을 쓰셔야합니다.

 

간단하게 설명하면 다음과 같습니다.

게임상에 수많은 미사일이 생기고 사라지는 슈팅 게임의 상황이라고 합시다.

미사일을 나타내는 Missile 클래스를 정의하고,

멤버 변수에 현재 활성화 중인지 나타내는 boolean변수 active를 선언합니다.

이 active값이 새로운 미사일 객체의 생성과 소멸을 대체하는 수단인 것이죠.

* Missile 클래스는 이렇게 정의합니다.

class Missile {

  boolean active;

  //기타 변수들

  public Missile() {} //빈 생성자입니다.

  public void create(/*필요한 인수들*/) {

    //실제 미사일 생성시의 내용을 여기에 기술합니다.

    active = true; //이 미사일이 활성화 되었음을 설정합니다.

  }

}

* 미사일이 담긴 ArrayList를 초기화합니다. 현재는 아무런 missile도 들어있지 않습니다.

* 새로운 미사일이 필요합니다. ArrayList에서 미사일을 검색해 active가 아닌 미사일을 찾아 create합니다.

public void createMissile() {

  for(Missile missile : missiles)

    if(!missile.active) {

      missile.create();

      return;

    }

  //실행이 여기까지 내려왔다는 것은 ArrayList에 미사일이 하나도 없거나,

  //모든 미사일이 현재 active 상태라는 것입니다. 즉, 새로운 missile 인스턴스가 필요합니다.

  Missile missile = new Missile();

  missile.create();

  missiles.add(missile);

}

* 미사일이 경계를 벗어나거나 역할을 다하게 되면 active를 false로 설정해줍니다.

* 이제 새로운 미사일을 생성할 때에는 ArrayList를 뒤져서 자리가 없을 때에만 새로운 인스턴스를 생성합니다.

(초기에 미리 적당량의 빈 Missile 인스턴스를 ArrayList에 넣어두셔도 좋습니다.)

* 한번 생성된 인스턴스들은 현재 숫자를 넘어서는 더 많은 미사일이 필요해지지 않는 이상 끊임없이 재활용됩니다.

(즉, 초기에 미사일 20개가 발사되어 ArrayList에 20개의 인스턴스가 들어가고 이후에 화면에 최대 20개 이하의 미사일이 활동한다면 인스턴스의 생성은 초기 20개 이후로 전혀 일어나지 않는 구조입니다. 그러다가 순간적으로 21개가 필요해지게 되면 그때에 한개를 더 생성한 후, 다시 21개의 순환구조로 들어갑니다.)

 

이외 다른 코드 부분에서도 최대한 최적화를 하세요.
Jinthree (8,980 포인트) 님이 2014년 7월 22일 답변
도움이 많이 된거 같아요
이정도까지 답변해주실지는 몰랐는데.. 감격...ㅜ
정말 감사합니다 이대로 시도해보겠습니다.
앞으로도 많은 답변 부탁드릴게요ㅎ
저도 안드로이드를 잡은지 오래되지 않았는데,
도움이 되셨다니 저야말로 영광입니다.

앞으로도 많은 고민 공유해보아요!
...