TimeStepRegulator

분류:번역 분류:설계패턴


이번엔 가마수트라의 Game Programming Patterns & Idioms Discussions에서 훔쳐온 것입니다. 링크는 못걸겠네요.... 로그인을 거쳐야 Discussions에 들어갈 수 있거든요.


시간간격 조절기

다른 이름: 프레임율 조절기, 실시간 시간간격, 고정 시간간격, 게임 루프

문제

많은 게임들은 게임이 컴퓨터의 속도와 계산량에 상관없이 동일하게 움직이는 것으로 보이도록 노력한다. 객체들의 게임 내부 속도가 프레임율에 의존해서는 안 된다. 개체가 초 당 5단위만큼 움직여어 한다면, 어떤 환경에서도 초 당 5 단위씩 움직여야만 모든 사용자들이 동일한 게임플레이를 체험할 수 있다. 이러한 규칙을 위반하는 오래된 게임들은 요즘 컴퓨터에서 너무 빨리 돌아간다. 마찬가지로, 요즘 게임들은 약간만 오래된 컴퓨터에서도 원래 의도보다 너무 느리게 실행되기도 한다. 게임내 연산량의 변동에 의해 게임플레이의 속도가 변하는 것 역시 이러한 문제의 좀 더 미묘한 표현이라고 할 수 있다.

해결책

고정 시간간격 :만약 적당한 타겟 머신 속도와 연산부하가 미리 결정될 수 있고 프레임률이 상대적으로 일정하게 유지될 수 있다면, 시간간격 조절기(TimeStepRegulator)는 단순한 상수적 고정 시간간격이 될 수 있다. 다른 방법으로, 고정 시간 간격들의 집합이 미리 계산된 영역이나 상황에 사용될 수도 있다.

가변 시간간격. :만약 프레임 시간이 변하는 것을 예측할 수 없다면, 가변 시간간격이 시간간격 조절기로 사용되어 '게임 시간' 을 '실제 시간' 에 대략적으로 동기화시킬 수 있다. 가변 시간간격은 대개 이전 프레임의 시간 또는 프레임 시간의 평균 히스토리에 기반하여 프레임률의 튀는 부분을 필터링시키게 된다. 더욱 진보된 구현들은 다른 서브시스템 시간들을 따라 더욱 정확하게 다음 프레임 시간들을 예측하고 아래에 언급된 '되먹임 악순환(EvilFeedbackLoop)'를 피할 수 있도록 할 것이다.

문제점들

고정 시간간격 문제. :만약 게임이 실행되는 실제머신와 목적머신의 속도가 일치하지 않으면, 게임은 실시간 행동을 하지 못할 것이다. 그러한 이유로 많은 PC 게임들은 고성능 머신을 선호하는 경향이 있다. 극한 경우에는, 느린 머신을 위해 개발된 게임이 빠른 머신 위에서 실행될 때처럼, 게임이 너무 빨리 실행되는 것을 막기 위해 프레임률 제한기가 사용될 수도 있다.

잡다한 가변 시간간격 문제. :히스토리를 초기화하는 것은 문제의 소지가 있다. 프레임률의 갑작스런 변화때문에 현재의 실제시간을 지나쳐버릴 수도 있다. 게임이 프레임의 시작하는 부분부터 시뮬레이트해야 하는지, 아니면 사용자가 렌더링 후에 갱신된 이미지를 보는 바로 그 순간부터 시뮬레이트해야 하는 지에 대해서는 의견이 분분하다.

되먹임 악순환(EvilFeedbackLoop, 공포의 피드백 루프) :이것은 가변 시간 간격 알고리즘의 가장 큰 위험이다. 대부분의 고급 렌더링, 시뮬레이션, AI 알고리즘들은 응집성(프레임들 사이의 유사성)을 이용해서 성능을 향상시킨다. 응집성이 낮을 수록 알고리즘의 실행 시간은 길어진다. 예를 들어서 테셀레이션(모자이크화)를 캐싱하는 지형 시스템의 경우 시점이 멀어질 수록 지형 알고리즘이 새 지형 다각형들을 생성하는데 필요한 시간도 길어진다. 가변 시간 간격의 경우 이는 파괴적인 양의 되먹임 순환을 일으킬 수 있다. 주어진 하나의 프레임이 시간이 오래 걸리면, 그 다음 프레임에서는 놓친 시간을 따라 잡기 위해서 더 많은 시간 간격으로 나아가게 된다. 그러면 개체는 평소보다 더 멀리 움직이고, 따라서 응집성이 낮아지며, 결국 알고리즘은 이전 프레임보다 더 많은 시간을 잡아먹게 된다. 결국 프레임이 진행될 수록 프레임 시간은 계속 커지는 악순환이 일어나며, 그러한 악순환은 시간 간격과 그에 해당하는 실행시간의 평형점에 도달해야 멈추게 된다. 평형점에 도달한 시점에서는 이미 상호작용적인 게임에서는 받아들여질 수 없는 너무 느린 프레임 시간이 되어버린다. 한 가지 해결책은 악순환이 시작될 징조를 감지하고, 그런 징조가 있으면 절대적인 실시간을 포기하고 시뮬레이션 시간이 허용하는 한도 한에서 다음 간격으로 나아가도록 하는 것이다.

시간간격 선형성. :알고리즘의 실행 시간과 그것의 간격 크기는 일정할 수 도 있고(선형) 그렇지 않을 수도 있다(비선형). 예를 들어서 간단한 AI 알고리즘은 시간 간격의 크기와는 상관없이 항상 동일한 양의 일을 한다. 그러나 한 객체가 다른 객체를 뚫고 지나가지 못하게 하기 위한 충돌 감지 시스템이라면 객체들이 멀어짐에 따라 더 많은 일을 해야 한다. 프레임 시간을 정확하계 예측하고 되먹임 악순환을 피하는 가변 시간간격을 구현하려면 이러한 관계를 이해하는 것이 중요하다.

멀티플레이어 동기화. : 네트웍 게임의 동기화는 두가지 해결책들 모두에 관련된 문제이다. 이는 방대한 문제이며 이후 다른 패턴들의 주제가 되어야 할 것이다. 이에 대한 의견을 바란다.

용례,제공자,그리고 참조

Bolt Action Software의 Jon Blow는 되먹임 악순환(EvilFeedbackLoop)라는 용어를 만들어 냈고 시그라프 2000(Siggraph 2000) 회의에서 그 단어를 사용했다. 그러나 많은 개발자들은 이미 다른 많은 게임들에서 이 문제를 접해 왔었다. http://www.d6.com/users/checker/dynamics.htm 에서 Chris Hecker의 글은 몇가지 간단한 가변 시간 간격 수행들에 대해서 보여주고 있다.