자바 스레드를 이용한 애니메이션 프로그래밍

GunSmoke의 이미지

스레드를 이용한 애니메이션 애플릿은 자바 입문서에 흔히 나오는 예제입니다.
개인적으로 궁금한 점이 있어 이렇게 질문 올립니다.

보통 이런식으로 코드가 나옵니다.

...
 
public class Animation extends Applet implements Runnable {
 
  ...
  Therad runner;
 
  public void start() {
    if (runner == null) {
      runner = new Thread(this);
      runner.start();
    }
  }
 
  public void stop() {
    if (runner != null) {
      runner = null;
    }
  }
 
  public void run() {
    Thread thisThread = Thread.currentThread();
    while (runner == thisThread) {
      repaint();
      try {
        Thread.sleep(1000);
      } catch {InterruptedException e) {}
    }
  }
 
  ...
}

애니메이션이 재생되는 동안 프로그램이 시스템 리소스를 독점하지 않기 위해 스레드를 활용하는 것까지는 이해가 됩니다. 하지만 run()내에 또 다른 스레드 thisThread를 생성하는 이유를 납득하기가 어렵네요.

스레드에서 repaint() 메소드를 호출하는 것이 목적이니만큼 아래와 같이 바뀌어도 상관없지 않을까합니다만 제 생각이 잘못되었는지요? 어차피 이렇게 하더라도 stop()에서 runner를 null로 하면 run()의 while 문을 종료하게 만드니까 말이지요.

public void run() {
    while (runner !=  null) {
      repaint();
      try {
        Thread.sleep(1000);
      } catch {InterruptedException e) {}
    }
  }
 
  ...
}

bookgekgom의 이미지

자바 패시브 렌더링 예제 군요.

public class Animation extends Applet implements Runnable {
Therad runner; //애니 매이션 쓰레드

public void run() {
Thread thisThread = Thread.currentThread(); //쓰레드 생성이 아니라 현제 쓰레드를 받습니다.
while (runner == thisThread) { //내 쓰레드와 같다면 ...
repaint(); //다시 그림.
try {
Thread.sleep(1000); //1000 ??? ㅇㅅㅇ...
} catch {InterruptedException e) {}
}
}
}

예제가 약간 이상 하군요.

쓰레드를 이용하여 그림을 그릴때는 자신이 원하는 fps 를 얻으려고 하는게 대부분인데

Thread.sleep(1000); 을 걸어 버리면...ㅇㅅ)

님 말대로 그렇게 하셔도 상관없습니다.

만약 제대로 애니매이션을 구현하고 싶다면 정확한 fps 를 이용해야죠.

또한 게임을 만드시고 싶다면 패시브렌더링이 아닌 액티브 렌더링을 구현해야 합니다.

암튼 님이 여쭈어 보신 질문의 답은

"예 그렇게 해도 됨" 임...

---------------------------------------------------------------------------------------------------------------
루비 온 레일즈로 만들고 있는 홈페이지 입니다.

http://jihwankim.co.nr

여러 프로그램 소스들이 있습니다.

필요하신분은 받아가세요.