고정 대게임의 가변 프레임 속도:무엇이 가장 좋고 언제?

StackOverflow https://stackoverflow.com/questions/53164

  •  09-06-2019
  •  | 
  •  

문제

한동안 게임 개발에 참여한 후 저는 가변 프레임 속도(마지막 틱 이후 경과한 시간을 계산하고 그에 따라 액터 움직임을 업데이트하는 방식)와 고정 프레임 속도(얼마나 많은 시간이 소요되는지 계산하는 방식)에 노출되었습니다. 시간이 지나면 고정된 시간을 선택하거나 다음 창이 올 때까지 절전 모드를 선택합니다.

특정 상황에 가장 적합한 방법은 무엇입니까?다음을 고려하십시오:

  • 다양한 시스템 사양에 맞춰 서비스 제공
  • 개발/유지보수 용이성
  • 이식 용이성;
  • 최종 공연.
도움이 되었습니까?

해결책

대부분의 3D 개발자는 가변 FPS를 선호하는 것 같습니다.Quake, Doom 및 Unreal 엔진은 모두 시스템 성능에 따라 확장 및 축소됩니다.

  • 최소한 너무 빠른 프레임 속도를 보상해야 합니다(90년대에 실행되는 80년대 게임과 달리 너무 빠릅니다).
  • 메인 루프는 어쨌든 시간 단계에 따라 매개변수화되어야 하며 너무 길지 않은 한 RK4와 같은 괜찮은 통합자는 물리학을 원활하게 처리해야 합니다. 일부 유형의 애니메이션(키프레임 스프라이트)은 매개변수화하기 어려울 수 있습니다.예를 들어 더 빠른 기계를 사용하는 플레이어가 너무 많은 총알을 쏘는 것을 방지하려면 네트워크 코드도 스마트해야 하지만 어쨌든 지연 시간 보상을 위해 이러한 종류의 조절이 수행되어야 합니다(애니메이션 매개변수화는 네트워크 지연도 숨기는 데 도움이 됩니다).
  • 타이밍 코드는 각 플랫폼에 대해 수정해야 하지만 약간의 국부적인 변경입니다(일부 시스템에서는 타이밍을 매우 정확하게 맞추는 것이 어렵지만 Windows, Mac, Linux는 괜찮은 것 같습니다).
  • 가변 프레임 속도는 최대 성능을 허용합니다.고정 프레임 속도는 일관된 성능을 허용하지만 모든 시스템에서 최대치에 도달하지는 않습니다(이는 심각한 게임의 쇼 스토퍼인 것 같습니다).

성능이 중요한 네트워크 3D 게임을 작성한다면, 과감히 가변 프레임 속도를 구현하십시오.

2D 퍼즐 게임이라면 아마도 고정된 프레임 속도를 사용하여 문제를 해결할 수 있으며, 매우 느린 컴퓨터와 향후 모델에 대해서는 약간 매개변수화할 수도 있습니다.

다른 팁

저는 가변 프레임 속도 모델을 선호하지만 내부적으로 일부 시스템은 고정된 시간 간격으로 선택됩니다.시간 누산기를 사용하면 이 작업을 매우 쉽게 수행할 수 있습니다.물리는 고정된 시간 단계에서 가장 잘 실행되는 하나의 시스템이며, 안정성 손실을 방지하고 시뮬레이션을 원활하게 유지하기 위해 필요한 경우 프레임당 여러 번 선택됩니다.

누산기 사용을 보여주는 약간의 코드:

const float STEP = 60.f / 1000.f;
float accumulator = 0.f;

void Update(float delta)
{
    accumulator += delta;

    while(accumulator > STEP)
    {
        Simulate(STEP);
        accumulator -= STEP;
    }
}

이것은 결코 완벽하지는 않지만 기본 아이디어를 제시합니다. 이 모델을 개선할 수 있는 방법은 많습니다.분명히 입력 프레임 속도가 터무니없이 느릴 때 해결해야 할 문제가 있습니다.그러나 가장 큰 장점은 델타가 아무리 빠르거나 느리더라도 시뮬레이션이 "플레이어 시간"에서 부드러운 속도로 움직인다는 것입니다. 여기서 사용자는 문제를 인식하게 됩니다.

일반적으로 저는 그래픽과 오디오 측면을 다루지는 않지만 물리, 입력 및 네트워크 코드만큼 영향을 받지는 않는다고 생각합니다.

사용자로서 내가 더 자주 보고 싶은 옵션 중 하나는 프레임 속도가 특정 범위를 벗어나는 경우 세부 수준을 동적으로 변경하는 것입니다(기술적 의미뿐만 아니라 넓은 의미에서).5FPS로 렌더링하는 경우 범프 매핑을 끄십시오.90FPS로 렌더링하는 경우 종소리와 휘파람 소리를 약간 늘리고 사용자에게 CPU와 GPU를 낭비할 수 있는 더 예쁜 이미지를 제공하십시오.

올바르게 수행했다면 사용자는 설정 화면으로 이동하여 스스로 조정할 필요 없이 게임에서 최상의 경험을 얻을 수 있으며 레벨 디자이너로서 다양한 장면에서 다각형 수를 동일하게 유지하는 것에 대해 걱정할 필요가 줄어듭니다. .

물론 저는 게임 사용자로서 이것을 말하는 것이지 진지한 입장은 아닙니다. 저는 결코 사소하지 않은 게임을 작성하려고 시도한 적이 없습니다.

가변 길이 프레임 시간에서 제가 직면한 주요 문제는 부동 소수점 정밀도이며, 가변 프레임 시간은 여러분을 놀라게 할 수 있습니다.

예를 들어 프레임 시간 * 속도를 위치에 추가하고 프레임 시간이 매우 작아지고 위치가 커지면 정밀도로 인해 모든 델타가 손실되므로 개체가 느려지거나 이동을 멈출 수 있습니다.별도의 오류 누산기를 사용하여 이를 보상할 수 있지만 이는 번거로운 작업입니다.

프레임 시간을 고정(또는 최소한 프레임 길이의 하한)하면 고려해야 할 FP 오류의 양을 제어할 수 있습니다.

내 경험은 다소 간단한 게임(SDL 및 C++로 개발)으로 제한되어 있지만 정적 프레임 속도를 구현하는 것이 매우 쉽다는 것을 알았습니다.2D 또는 3D 게임 작업을 하고 계십니까?나는 더 복잡한 3D 환경이 가변 프레임 속도에서 더 많은 이점을 얻을 것이며 어려움은 더 클 것이라고 가정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top