디자인에 머리를 감싼 Android 스레드 문제


9

게임 디자인에 머리를 감는 데 어려움이 있습니다. 안드로이드 플랫폼에서 활동이 있고 사용자 정의 표면보기로 콘텐츠보기를 설정합니다. 사용자 정의 표면 뷰는 내 패널 역할을하며 모든 클래스의 인스턴스를 작성하고 모든 도면 및 계산을 수행합니다.

질문 : 활동에서 다른 클래스의 인스턴스를 대신 만들어야합니까?

이제 게임 루프를 처리하는 사용자 지정 스레드 클래스를 만듭니다.

질문 : 모든 활동에서이 클래스를 어떻게 사용합니까? 아니면 매번 확장 스레드 클래스의 별도 인스턴스를 만들어야합니까?

이전 게임에서는 스레드 클래스의 인스턴스를 만들어야하는 여러 수준이 있었고 스레드 클래스에서 각 개별 수준에 대해 생성자 메서드를 설정해야했고 루프에서 switch 문을 사용하여 렌더링 해야하는 수준을 확인해야했습니다. 업데이트합니다. 혼란스럽게 들리면 죄송합니다.

내가 사용하는 방법이 비효율적인지 (아마도) 올바른 방법으로 디자인하는 방법을 알고 싶습니다. 나는 많은 튜토리얼을 읽었으며 여전히이 특정 주제에 많은 문제가 있습니다. 어쩌면 이것을 설명하는 자습서에 대한 링크가 있습니까? 감사.

답변:


13

렌더링 스레드 ( Canvas/ 사용 OpenGL ES, Canvas설정하기가 조금 더 쉽습니다)와 게임 로직을 넣는 게임 스레드를 사용하는 것이 좋습니다.

실제로 게임을 "로드"하기 위해 GameEngine 클래스를 만들어 응용 프로그램의 중심점으로 만들 수 있습니다. 렌더러가 준비되면 GameEngine 인스턴스에 대한 콜백을 생성 Runnable하여 렌더링 및 Runnable게임 로직에 대한 두 개의 스레드를 사용하여 두 개의 스레드를 생성하고 시작 합니다.

샘플 코드 :

응용 프로그램 시작

private GameEngine engine;
private CanvasRenderer renderer;

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   // Create instances of your two Runnable classes and pass that into
   // the GameEngine constructor.
   // Create an instance of the game engine.
   engine = new GameEngine(canvasRunnable, gamelogicRunnable);
   renderer = new CanvasRenderer(this, engine); 
   setContentView(renderer); 
}

CanvasRenderer

private GameEngine engine;    

// Save your instance from the GameEngine reference in your constrcutor and make
// a global initializion for your GameEngine instance.  

@Override
public void surfaceCreated(SurfaceHolder holder) {  
   // One time setup here.
   // When your view is ready, make this callback to the 
   // GameEngine.
   engine.surfaceIsReady();
}

게임 엔진

private Thread canvasThread;
private CanvasRunnable canvasRunnable;
// You should be able to figure out how to create a second thread
// where you should put your game logic. :)

// Constructor stuff like creating instances of your threads
// and passing references as you wish to those.
// Don't start the threads here.
// Remember to set references from your Runnable's into your Thread's 
// instances here!

/**
 * Callback. Now your renderer is ready and you
 * can start your threads.
 */
public void surfaceIsReady() {
   thread.setName("Canvas");
   thread.start();
   // Same for game logic.
}

우와, 고마워요. 나는 당신이 그것을 설명하는 방법을 좋아했다. 그 한 가지 설명은 나에게 전체 개념을 밝힙니다.
semajhan

@semajhan : 더 많은 문제가 있는지 물어보십시오. :)

이것이 내 머릿속에있는 것입니다 : GameEngine 클래스는 패널과 함께 다른 모든 클래스에 대한 "링크"또는 "참조"역할을합니다. 활동> 패널> GameEngine> 다른 모든 클래스.
semajhan

@semajhan : 맞습니다. 지식의 경우에만 : OpenGL ES렌더러에 OpenGL ES이미 자체 스레드가 있으며이 경우 새 시스템 ThreadRunnable해당 시스템에 대해 수동으로 작성하고 시작할 필요가 없다는 것을 알아야합니다.

이 주석은 무시하십시오.
semajhan

3

일반적으로 게임 루프는 단일 활동 내에서 자체 포함됩니다.

활동을 전환하면 게임 루프가 일시 중지 / 종료됩니다. 어쨌든 별도의 활동은 게임 일시 중지와 일치해야합니다 (예 : "친구에게 이메일 보내기"또는 "메인 메뉴"활동으로 전환 한 경우)

추가 레벨의 경우 새 스레드를 작성하거나 스토리 해제하지 않아야합니다. "레벨 완료, 다음 레벨로드, 기다리십시오"활동으로 전환하지 않은 경우 "메인 게임을 다시 시작해야합니다. 어쨌든 활동. 그러나이 경우에도 실제로는 "추가"스레드를 만들지 않고 해당 활동에서 하나의 스레드를 만들고 그 활동을 순차적으로 종료 / 종료 / 종료 / 재시작 ... 등합니다. 레벨이 완료 될 때마다.


3

독일어를 이해한다면 이 튜토리얼 은 매우 좋습니다.

영어의 경우이 자습서를 추천 할 수 있습니다

스레드 클래스와 관련하여 : 응용 프로그램의 모든 클래스에서 참조 할 수 있는지 정말로 모르겠습니다. 내 게임에서는 다음과 같이 해결했습니다.

기본 GUI를 작성하는 클래스에는 재정의 된 렌더 메소드가 있습니다. 이 메소드에서는 모든 GUI 요소를 업데이트하고 사용자 입력을 처리하는 스레드 클래스가 호출됩니다.

스레드는 또한 일정한 프레임 속도를 유지해야합니다. 개발중인 게임에 따라 이것이 중요 할 수 있습니다.


그 독일어 튜토리얼은 훌륭하지만 vai google로 대략 번역되었으므로 이해하기가 어렵습니다.
semajhan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.