2016-08-10 8 views
1

이것은 비디오 게임을 시뮬레이션하고 렌더링하는 방법의 예 (의사 코드)입니다. 내 질문간단한 시뮬레이션 및 렌더링 루프 이해

//simulate 20ms into the future 
const long delta = 20; 
long simulationTime = 0; 
while(true) 
{ 
    while(simulationTime < GetMilliSeconds()) //GetMilliSeconds = Wall Clock Time 
     { 
      //the frame we simulated is still in the past 
      input = GetUserlnput(); 
      UpdateSimulation(delta, input); 
      //we are trying to catch up and eventually pass the wall clock time 
      simulationTime += delta; 
     } 

    //since my current simulation is in the future and 
    //my last simulation is in the past 
    //the current looking of the world has got to be somewhere inbetween 
    RenderGraphics(InterpolateWorldState(GetMilliSeconds() - simulationTime)); 
} 

:

나는 루프 (초당 25을 의미) '는 true 동안'외부를 통해 갈은 40ms가 있습니다. RenderGraphics 메서드는 10ms가 소요됩니다. 그래서 그것은 내적 루프를 위해 30ms가 있음을 의미합니다. UpdateSimulation 메서드는 5ms가 소요됩니다. 0.1ms 미만의 값이므로 무시할 수 있습니다.

40ms (외부 루프)의 내 시간 일정을 유지하기 위해 '델타'변수를 설정할 수있는 최대 값은 무엇입니까? 그리고 왜?

답변

0

이것은 주로 아래에 언급 된 제약 사항을 고려하여 시뮬레이션 상태 및 사용자 입력을 업데이트하려는 빈도에 따라 달라집니다. 예를 들어, 게임에 신체적 행동을 기반으로 한 내부 상태가 포함되어있는 경우 움직임과 충돌이 적절하게 평가되고 게임 상태에 반영되도록하기 위해 작은 delta이 필요합니다. 또한 사용자 입력에 세분화 된 평가 및 상태 업데이트가 필요한 경우 작은 delta 값이 필요합니다. 예를 들어, 아날로그 사용자 입력 (예 : 마우스, 조이스틱)을 사용한 슈팅 게임은 30Hz보다 큰 업데이트 빈도의 이점을 얻을 수 있습니다. 게임에 입력 및 게임 상태에 대한 고주파 평가가 필요하지 않은 경우 큰 delta 값을 사용하지 않거나 플레이어의 입력이 감지되면 게임 상태를 간단히 업데이트 할 수 있습니다. 특정의 의사 코드에서

하여 시뮬레이션을 업데이트해야 길이 delta 고정 시간 슬라이스에 따라 갱신 할 시뮬레이션은 wallclock 시간을 시뮬레이션보다 작 wallclock 시간에서 처리한다. 그렇지 않으면 벽시계 시간이 시뮬레이션 시간보다 더 빨리 진행됩니다. 이것은 delta 시뮬레이션 시간의 시뮬레이션 업데이트가 실제로 얼마나 빨리 계산되는지에 따라 궁극적으로 delta을 제한합니다.이 관계는 사용 사례에 따라 다르며 선형 적이거나 상수가 아닙니다. 예를 들어, 물리 엔진은 종종 delta 시간을 내부적으로 처리 할 수있는 업데이트 속도로 나눕니다. 따라서 delta 번이 길면 숫자 불안정이 발생하고 선형 시스템을 처리하기가 어려워 처리가 비선형 적으로 진행될 수 있습니다. 다른 경우에는 시뮬레이션 업데이트가 선형 또는 일정 시간이 걸릴 수 있습니다. 그렇더라도, 많은 (가능하면 외부) 이벤트가 본질적으로 요구하는 경우 시뮬레이션 업데이트가 너무 느리게 처리 될 수 있습니다. 예를 들어, 시뮬레이션 업데이트 중에 리소스를로드하고, 운영 체제가 실행 스레드를 제쳐 놓고 결정하고, 다른 프로세스가 사용자에 의해 실행되고, 안티 바이러스 소프트웨어가 실행되고, 메모리 부족, CPU 속도 저하 등이 발생합니다. 지금까지이 문제를 피하거나 그 효과를 해결할 수있는 두 가지 전략을 보았습니다. 첫째, 시뮬레이션 갱신 노력이 적고 감속의 원인이 일시적이라고 가정 할 때 간단히 무시할 수 있습니다. 이것은 시뮬레이션의 "슬로우 모션"동작을 어느 정도 눈에 띄게 만들어 버리며, 최악의 경우 시뮬레이션 시간 지연이 영원히 누적 될 수 있습니다. 두 번째 전략은 시뮬레이션 된 측정 된 프레임 시간을 단순히 인위적인 값 (예 : 1000ms)으로 제한하는 것입니다. 이것은 느려짐의 원인이 사라지 자마자 부드러운 동작을 유도하지만, 처리되지 않은 시뮬레이션 시간이 '손실 됨'이라는 단점을 가지고 있습니다. 이는 처리되지 않거나 고려되지 않은 경우 애니메이션 딸꾹질로 이어질 수 있습니다. 전략을 선택하려면 시뮬레이션 업데이트를 처리하는 데 걸리는 시간을 deltax * delta 시간으로 계산하고 처리 시간과 시뮬레이션로드를 실제로 변경하는 것이 계산에 필요한 벽시계 시간에 어떻게 반영되는지를 고려해야합니다. delta의 최대 값이 특정 하드웨어 및 소프트웨어 환경에 적합한 지 알려줍니다.