자바 스레드를 이용한 애니메이션 프로그래밍
글쓴이: GunSmoke / 작성시간: 일, 2009/03/01 - 11:51오후
스레드를 이용한 애니메이션 애플릿은 자바 입문서에 흔히 나오는 예제입니다.
개인적으로 궁금한 점이 있어 이렇게 질문 올립니다.
보통 이런식으로 코드가 나옵니다.
... 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) {} } } ... }
Forums:
ㅇㅅㅇ...
자바 패시브 렌더링 예제 군요.
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
여러 프로그램 소스들이 있습니다.
필요하신분은 받아가세요.
댓글 달기