Java 2D 게임 프로그래밍 : 게임 루프를 만들기위한 다양한 접근법


10

Java 게임 프로그래밍에 익숙하지 않지만 게임 루프를 만드는 여러 가지 접근 방식을 보았으므로 더 많이 읽을수록 혼란스러워합니다. 1. Timer 클래스를 사용하는 표준 접근 방식은 더 적습니다. 정확한). System.nanoTime을 사용하는보다 정확한 방법. 3. scheduleAtFixedRate를 사용하는 간단한 접근법.

어느 것이 일반적으로 선호되어야하며 각 접근법의 장점 / 단점은 어디에 있습니까? 모든 정보에 미리 감사드립니다.

답변:


7

기본 게임 루프의 경우 while 루프를 실행하여 nanoTime ()을 사용하여 시간을 확보하고 마지막 프레임 이후 경과 한 시간을 확인한 다음 게임 상태를 업데이트하고 렌더링합니다.

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/System.html#nanoTime%28%29를 사용 하면 경과 시간 동안 폴링 할 수 있습니다. 원래...

public static void main(String [ ] args)
{
    long current_frame_time = system.nanoTime();
    long last_frame_time = current_frame_time;

    while(gameIsRunning)
    {
        last_frame_time = current_frame_time;
        current_frame_time = system.nanoTime();

        long timeTaken = current_frame_time - last_frame_time;

        //update and render game here
    }
}

이 기본 방법은 http://www.koonsolo.com/news/dewitters-gameloop/http://gafferongames.com/game-physics/fix-your-timestep/ 과 같이 향상 될 수 있습니다 .

또는 타이머를 만들고이 타이머를 설정하여 업데이트를 실행하고 X 밀리 초마다 렌더링 할 수 있습니다. 그러나 이와 같은 게임 루프를 구성하는 데는 몇 가지 단점이 있습니다.

에 따르면 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html : " 각 Timer 객체와 대응하는 것은 타이머의 모두를 실행하는 데 사용되는 단일 배경 스레드 타이머 작업을 빠르게 완료해야합니다. 타이머 작업을 완료하는 데 시간이 너무 오래 걸리면 타이머의 작업 실행 스레드를 "호그"처리하여 후속 작업의 실행을 지연시킬 수 있습니다. 문제가되는 작업이 마지막으로 완료되면 연속적으로 빠르게 실행됩니다. "

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html#scheduleAtFixedRate%28java.util.TimerTask,%20java.util.Date,%20long%29 에 따르면 : " 고정 속도 실행에서 각 실행은 초기 실행의 예약 된 실행 시간을 기준으로 예약됩니다. 가비지 수집 또는 기타 백그라운드 활동과 같은 이유로 실행이 지연되면 두 번 이상의 실행이 연속적으로 빠르게 발생합니다. "들어 보자."에, 실행의 빈도는 (되는 Object.wait를 (긴) 정확한 시스템 시계 기본 가정) 지정된 기간이 정확하게 상호 될 것입니다. "

일반적으로 게임 루프에 걸리는 시간을 미리 알지 못하므로, 대상 프레임 속도에 따라 X 밀리 초마다 게임 루프를 실행하도록 타이머를 설정하면 프레임이있을 때마다 실행되는 몇 개의 프레임이 발생할 수 있습니다. 프레임이 예약 될 때 대신 완료됩니다. 그럴 때 ... 왜 처음에 타이머를 사용합니까?

이제는 틀리지 말고 타이머는 나쁜 수업이 아니지만 정기적으로 또는 특정 시간에 수행 해야하는 소규모 작업에 더 적합합니다. 예를 들어 메일 클라이언트는 5마다 새로운 메일을 확인하려고 할 수 있습니다 레이스가 시작되기 전에 카운트 다운을 표시하기 위해 1 분마다 카운터가 감소 할 수 있습니다.


문제는 게임 루프에 관한 것이기 때문에 awt / swing 정보는 주제가 맞지 않습니다. 그러나 질문에 관련이없고 혼란스러운 줄 때문에 정보가 관련이있는 것처럼 보였으므로 제거했습니다.
jhocking

질문에 대한 변경 사항을 반영하도록 답변을 수정했습니다.
Exilyth

7

메인 루프를 타이머에 넣지 않을 것입니다. 오히려 모든 프레임을 처리하는 'while'루프를 만들고 일종의 타임 키핑 기능 (Java에서와 같이 System.nanoTime으로 들림)을 사용하여 마지막 프레임 / 마지막 반복 이후 경과 한 시간을 계산합니다. 고리.

여기에서 특정 언어 (예 : JavaScript, ActionScript)는 예외입니다. 이러한 언어는 암시 적 기본 루프가있는 환경 (예 : 브라우저, Flash Player)에서 작동하지만 해당 예외는 Java에는 적용되지 않기 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.