2010-04-02 3 views
43

대부분의 게임 개발에는 메인 게임 루프가 필요하지만, 왜 필요한지는 알 수 없습니다. 이벤트 리스너를 구현하고 모든 사용자 작업에 응답 할 수 없습니까? 그런 다음 이벤트가 발생하면 애니메이션 (등)을 재생할 수 있습니다.게임을 개발할 때 "기본"게임 루프가 필요한 이유는 무엇입니까?

기본 게임 루프의 목적은 무엇입니까?

+12

메인 루프를 작성하든 작성하지 않든간에 거기에있게됩니다. 이벤트를 가지려면 어딘가에 어떤 종류의 루프가 필요합니다. 플랫폼에 의해 추상화 될 수 있습니다. –

+1

엄밀히 말하자면, "어딘가에 어떤 종류의 루프가 필요하지 않습니다". 사실 대부분의 최신 OS로는 루프가있을 것입니다. 그러나 인터럽트를 사용하여 모든 것이 진정으로 이벤트 구동되는 게임 플랫폼을 구축하는 것은 '금속에 가까운'접근 방식을 사용하여 완전히 가능합니다. 그러나 심지어 (극단적 인) 상황에서도 루프를 사용하는 이유는 여전히 있습니다. 즉, 시스템에서 결정적 동작을 얻는 가장 쉬운 방법입니다. 즉, 입력, 렌더링 및 불량의 상대적 실행 속도 친구들, 모두 일관성있게 지내야합니다. – JustJeff

답변

76

"이벤트 리스너를 호출하기 때문에 루프가 필요합니다."라는 인수는 물을 보유하지 않습니다. 틀림없이 주류 OS에서 그렇듯이 실제로 루프가 발생하고 이벤트 리스너가 그러한 방식으로 작동하지만 어떤 종류의 루프도없이 작동하는 인터럽트 기반 시스템을 만드는 것은 전적으로 가능합니다.

하지만 여전히 게임을 그렇게 구성하고 싶지는 않습니다.

루프를 가장 매력적인 솔루션으로 만드는 것은 루프가 실시간 프로그래밍에서 '순환 실행'으로 불리는 것입니다. 아이디어는 여러 시스템 활동의 상대적 실행 속도를 서로에 대해 결정적으로 할 수 있다는 것입니다. 루프의 전체 속도는 타이머에 의해 제어 될 수 있으며 타이머는 궁극적으로 인터럽트 일 수 있지만 최신 OS에서는 세마포어 (또는 다른 동기화 메커니즘)를 기다리는 코드로 인터럽트의 증거를 볼 수 있습니다. "메인 루프"의 일부.

왜 결정 론적 동작을 원하십니까? 사용자의 입력과 baddies AI의 처리 속도를 고려하십시오. 모든 것을 순전히 이벤트 기반 시스템에 집어 넣으면 스레드 우선 순위를 일부 제어하지 않는 한 AI가 사용자보다 CPU 시간을 늘리지 않을 것이라는 보장이 없습니다. 타이밍을 일관되게 유지하는 데 어려움이있다.

그러나 모든 것을 루프에 넣으면 AI 타임 라인이 사용자의 시간과 관련하여 고정 된 관계로 진행된다는 것을 보장합니다. 이것은 루프에서 호출하여 AI에게 타임 라인을 제공하여 사용자가 수행 할 작업을 결정하고, 사용자 입력 루틴을 호출하고, 입력 장치를 폴링하여 사용자의 동작 방식을 확인하고, 당신의 연출을 호소하십시오.

이러한 루프를 사용하면 각 패스를 실제로 실시간으로 처리하는 것보다 시간이 많이 걸리지 않는다는 것을주의해야합니다. 루프를 100Hz로 순환 시키려한다면, 모든 루프 처리가 10msec 이내에 완료되는 것이 좋습니다. 그렇지 않으면 시스템이 갑자기 움직입니다. 실시간 프로그래밍에서이를 시간 초과라고합니다. 좋은 시스템은 당신이 얼마나 가까이에 있는지 감시 할 수있게 해줄 것이고, 그런 다음 당신이 적합하다고 생각하는대로 처리 부하를 줄일 수 있습니다.

+0

+1 –

+0

나는 이것에 대해 궁금해하고 있었고, 운 좋게도 우리 모두에게 훌륭한 답을 전했습니다. Thanks @JustJeff – demius

+1

하나의 설명 : 게임 루프에서 100fps로가는 것은 과잉이라고 생각할 것입니다. 10 밀리 초는 많은 시간이 아닙니다. PC 디스플레이가 실제로는 그렇게 빨리 상쾌해질 수있는 경우는 거의 없습니다. 대부분의 게임 논리에서 초당 약 30 번 업데이트하는 것이 많습니다. – BenW

16

이벤트 리스너는 표시 여부에 관계없이 일부 호출 루프에 종속됩니다. 누가 청취자에게 전화 할 것입니까?

명시 적 게임 루프를 작성하면 진행 상황을 절대적으로 제어 할 수 있으므로 이벤트 루프에서 일부 툴킷/이벤트 처리 라이브러리가 어떤 작업을 하든지 의존하지 않게됩니다.

+2

이벤트 중심 프로그래밍의 가장 순수한 의미에서 인터럽트를 사용하여 모든 것을 구동 할 수 있으므로 루프가 있어야한다는 것은 엄밀히 사실이 아닙니다. 이벤트의 근본적인 문제는 이벤트 중심 프로그래밍의 비동기 특성을 다루는 것입니다. 이벤트가 모두 타이머에서 파생 된 경우에도 비동기 이벤트를 저글링하고 타이밍이 일정한 시스템 동작을 얻는 것이 훨씬 더 어렵습니다. – JustJeff

+0

@JustJeff, 예, 대부분의 애플리케이션에서 타이밍은 무시할 만하지만 게임의 경우 일관된 타이밍이 전부입니다. – Earlz

4

현재 운영 체제가 완전히 이벤트 기반이 아니기 때문입니다. 상황이 이벤트로 자주 표시 되더라도 다음 이벤트가 나타날 때까지 기다린 후 루프를 만들어야합니다 (예 : Windows 이벤트 루프). 유닉스 신호는 아마도 OS 레벨에서 가장 가까운 이벤트 일 수 있지만 이러한 상황에서는 충분히 효율적이지 않습니다.

6

모든 종류의 게임에 전용 게임 루프가 필요하다는 것은 사실이 아닙니다.

액션 게임은 빈번한 개체 업데이트 및 게임 입력 정밀도 때문에 이러한 루프가 필요합니다.

다른 한편으로는 지뢰 찾기 게임을 구현했으며 알림 용 메시지는
입니다.

+7

하지만 확실히 게임 루프는 당신이 제어 할 수없는 윈도우의 자체 루프입니다. – Amos

+1

@Amos, 미안하지만 나는 당신의 요점을 얻지 못한다. –

+2

요점은 어떻게 든 사용자가 버튼을 누르거나 마우스로 움직이거나 클릭하거나 다른 주변 장치를 통해 입력 할 때마다 프로그램에 알림을 보내야한다는 것입니다.즉, 누군가는 새로운 사용자 입력이 언제 도착했는지 발견하기 위해 어딘가에서 입력 장치를 직접 폴링하거나 입력 버퍼 (하드웨어로 채워짐)를 폴링해야합니다. 운영 체제가 다른 스레드에서이 작업을 수행하고 게임 프로그램이 구독하는 이벤트를 발생 시키거나 게임이 자체 폴링 루프를 관리합니다. 그렇지 않으면 루프가 여전히 OS에 있습니다. – stakx

1

두 가지 이유 -

에도 이벤트 기반의 시스템은 일반적으로 어떤 종류의 큐에서 이벤트를 읽고 어쨌든 예를 들어 창에서 이벤트 루프를 끝낼 수 있도록 핸들러에게 전달 어떤 종류의 루프를 필요 그리고 그것을 잘 확장 할 수도있었습니다.

애니메이션의 목적을 위해 애니메이션의 모든 프레임에 대해 일종의 처리해야합니다. 확실히 타이머 나 유휴 이벤트와 같은 작업을 수행 할 수는 있지만 어쨌든 어떤 종류의 루프에서 이들을 생성하게 될 것이므로 루프 을 직접 사용하는 것이 더 쉽습니다.

이벤트를 사용하여 모든 시스템을 처리하는 시스템을 보았을 때 각 프레임의 시작 부분에서 전달되는 이벤트를 수신하는 프레임 수신기가 있습니다. 그들은 여전히 ​​내부적으로 작은 게임 루프를 가지고 있지만 윈도우 시스템 이벤트를 처리하고 프레임 이벤트를 생성하는 것 이상의 역할을합니다.

2

무한정 앉아서 사용자 입력에 응답 할 수있는 프로그램은 어떤 종류의 루프가 필요합니다. 그렇지 않으면 프로그램 끝까지 도달하여 종료됩니다.

2

메인 루프는 이벤트 리스너를 호출합니다. 이벤트 중심 운영 체제 또는 창 관리자를 보유 할만큼 운이 좋다면 이벤트 루프가 그곳에 상주합니다. 그렇지 않으면 I/O, poll 또는 select을 기반으로하는 시스템 호출 인터페이스와 일반적인 이벤트 기반 응용 프로그램 간의 "임피던스 불일치"를 중개하는 기본 루프를 작성합니다.

P. 함수 프로그래밍으로 질문에 태그를 추가 했으므로 Functional Reactive Programming을 확인해보십시오. 높은 수준의 추상화를 낮은 수준의 이벤트 기반 구현에 연결하는 훌륭한 작업입니다.

6

게임 루프

 
initialise 
do 
    input 
    update 
    render 
loop 
clean up 

이 게임 그리는 프레임마다 일어날 것이다 (이하 매우 단순화이다). 따라서 60fps에서 실행되는 게임의 경우 매초 60 회 이상 수행됩니다.

이것은 게임이 원활하게 실행되고 게임이 동기화 상태를 유지하며 사이클 당 업데이트/그리기가 자주 발생한다는 것을 의미합니다. 애니메이션은 단순히 눈의 속임수이며 물체는 여러 위치 사이를 이동하지만 충분히 빨리 재생하면이 위치 사이를 오가는 것처럼 보입니다.

사용자 입력에 대해서만 업데이트하는 경우 사용자가 입력을 제공 할 때만 게임이 반응합니다. A.I 게임 객체와 같은 다른 게임 구성 요소는 자체적으로 반응하지 않습니다. 따라서 루프는 게임을 업데이트하는 가장 쉽고 최상의 방법입니다.

+0

그러나 왜 다른 애니메이션을하기 위해 별도의 루프를 사용하지 않습니까? – Tattat

+1

필요가 없습니다. 하나의 게임 루프로 충분합니다. – Finglas

+0

@Tattat - Finglas의 말은 맞습니다. 가장 간단하게 작동하는 것이 일반적으로 가장 좋습니다. – JustJeff

2

게임은 real-time에서 실행해야하므로 한 CPU/코어에서 계속 실행되는 경우 가장 잘 작동합니다. 이벤트 중심 응용 프로그램은 일반적으로 대기열에 이벤트가 없을 때 다른 스레드에 CPU를 양보합니다. CPU가 프로세스로 다시 전환되기까지 상당한 시간이 걸릴 수 있습니다. 게임에서 이것은 짧은 매점과 지저분한 애니메이션을 의미합니다.

3

실제적으로 다른 사람들이 지적했듯이 루프가 필요합니다.

그러나 아이디어는 이론적으로 건전합니다. 루프가 필요하지 않습니다. 에는 이벤트 기반 조작이 필요합니다.

간단한 수준에서 CPU를 개념화하여 여러 타이머를 사용할 수 있습니다.

  • 60Hz의 상승 에지에서 하나가 발사되고 블리 팅 코드가 호출됩니다.
  • 또 하나는 60kHz에서 똑딱 거리며 게임 세계의 개체에 대한 최신 업데이트를 블리터 버퍼로 렌더링 할 수 있습니다.
  • 또 하나는 10kHz에서 똑딱 거리고 사용자로부터 입력을받는 것일 수 있습니다. (꽤 높은 해상도, 롤)
  • 또 하나의 게임 '하트 비트'와 60MHz에서 틱; 인공 지능과 물리학은 하트 비트 시간에 작동 할 수 있습니다.

물론이 타이머를 조정할 수 있습니다. 실질적으로

, 무엇과 같이 당신이 (다소 생략) 될 수있다 일이 될 것이다 :

void int_handler1(); 
//... 
int main() 
{ 
    //install interrupt handlers 
    //configure settings 
    while(1); 
} 
+1

+1 그래, 그렇게 할 수있다. 문제는 다른 타이머가 꺼지면이 중 하나가 실행 중일 때 어떻게됩니까? 그것은 지저분해진다! 아무것도 놓치지 않도록 논리가 필요합니다. 어떻게 든 타이머를 동기화하지 않으면 발생하지 않으므로 까다로울 수 있습니다. 하나의 루프로 손쉽게 수행 할 수 있습니다. 하나의 타이머로 구동되므로 각 구성 요소에 타이머 틱 당 적절한주의를줍니다. 어느 쪽이 OP를 요구하고있는 것처럼 보이는 루프를 사용하기위한 동기입니다. – JustJeff

+0

오, 나는 이것이 가장 멋진 접근법이라고 말하는 것이 아닙니다. 나는 그것이 이벤트 기반 방식으로 행해질 수 있다는 것을 지적하고있다. 물론 진정한 이벤트를 구현하는 것은 매우 까다 롭고 비 실시간과 비교하여 실시간 운영체제와 관련된 모든 문제를 발생시킵니다. :) –

1

게임의 본질은 그들이 일반적 대한 모의있어, 그냥 외부 이벤트를 기반으로 반응하지 않는 것을 있지만, 내부 프로세스에 대해서도 마찬가지입니다. 대신 폴링의 이벤트를 반복하여 이러한 내부 프로세스를 나타낼 수 있지만, 실질적으로 동등한 위치 :

schedule(updateEvent, 33ms) 

function updateEvent: 
    for monster in game: 
     monster.update() 
    render() 

대 : 흥미롭게도

while 1: 
    for monster in game: 
     monster.update() 
    wait(33ms) 
    render() 

, pyglet 대신 전통적인의 이벤트 기반 메소드를 구현 고리. 시간이 오래 걸리더라도 성능 문제 나 시계 해상도, vsync 등으로 인해 예기치 않은 동작이 발생하는 경우가 있습니다. 루프는 더 예측 가능하고 이해하기 쉽습니다 (웹 프로그래밍의 독점적 인 배경이 아니면).

관련 문제