초당 프레임 캡핑의 이점은 무엇입니까? (만약에 어떠한)


13

디스플레이 초기화 및 입력에 SDL을 사용하여 OpenGL에서 간단한 게임을하고 있는데 타이밍 측면에서 두 가지 옵션을 사용할 수 있습니다. 최적 시간 PerFrame-초에서 1 = 1 / theFramerateCap 일 때 최적의 TimePerFrame-theTimeTakenToRender를 위해 잠자기하는 1 번. (vsync를 사용하는 것이 더 정확할 수 있으므로 이것이 필요한지 확실하지 않습니다. 가정이 정확하다면 SDL + OpenGL에 vsync가 기본적으로 있는지 여부를 알려주십시오. 다른 하나는 마지막 프레임이 렌더링 된 이후의 시간을 측정하고 그에 따라 움직임을 조정하는 것입니다. 프레임을 렌더링하는 데 걸리는 시간이 짧을수록 해당 프레임에서 엔티티가 더 멀리 이동합니다. 성능 및 깜박임 감소 등의 측면에서이 두 가지 방법의 장단점은 무엇입니까?

답변:


15

프레임 시간을 예측할 수없는 경우 (이것이 오류인지 여부, OS가 때때로 리소스를 사용하는 등) 예측 가능한 프레임 속도보다 다소 낮은 예측 가능한 프레임 속도로 제한하면 예상 대기 시간이 길어질 수 있습니다. 게임의 기분이 훨씬 좋아집니다.

입력을 처리 할 때와 해당 입력과 관련된 변경을 렌더링 할 때까지의 시간을 변경하면 기분이 나빠질 수 있습니다. 평균적으로 둘 사이의 지연 시간 이 줄어들 더라도 "지터"는 인간에게 (의식적으로 또는 무의식적으로) 눈에.니다.

여기에 대한 자세한 내용은 Microsoft GameFest 프레젠테이션 프레임 내용 : 찢기, 지연 시간 및 프레임 속도 를 참조하십시오. Carmack에는 또한 유용한 블로그 게시물 이 있습니다.

또한 낮은 deltaT값을 사용하여 프레임을 실행할 때 또는 변수 deltaT를 전혀 사용하지 않는 경우에도 일부 수학이 작동 하지 않을 수 있습니다 ( "안정적인"예측 가능한 방식으로 수행하기가 더 어려워 지거나 다루기 어려워 질 수 있음). 재생 및 일부 형태의 네트워크 동기화 등). 여기에서 통찰력을 얻으려면 타임 스텝 수정을 참조 하십시오.


1
(그런데 "잠자기"방식으로 제한을 두지 않는 것이 좋습니다. vsync 상황이 플랫폼에서 무엇인지 파악하고 vsync를 사용하여 운전하십시오. 훨씬 예측 가능하고 일반적으로 적은 리소스를 사용합니다.)
Leander

고마워, 나는 확실히 프레임 속도를 제한하려고 노력할 것입니다. SDL을 사용하여 vsync를 활성화하는 방법을 알고 있습니까?
w4etwetewtwet

1
SDL 2.0에서는 SDL_RENDERER_PRESENTVSYNC 플래그를 SDL_CreateRenderer 호출에 전달하여 vsync를 활성화 할 수 있습니다 (예 :SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
TJS

12

당신은 훨씬 적은 CPU를 사용하게 될 것입니다 (멀티 테스크 담당자는 당신에게 감사 할 것입니다).


4
더 낮은 전력 소비 (모바일 장치 / 노트북에 중요)는 물론 열 발생도 적습니다.
zeel

메뉴의 FPS가 900fps와 같이 무제한적이고 미친 듯이 높았을 때 CPU / GPU-> 더 높은 온도-> 더 많은 노이즈를 강조한 일부 게임 문제를 상기시킵니다.
Kromster

10

프레임 속도를 제어하기 위해 절전 모드를 사용해서는 안됩니다 .

이것은 이전끝났으며 그 이유에 대한 토론을 위해 다른 질문을 참조 할 것입니다. 언급 되지 않은 한 가지는 전형적인 현대의 재생 빈도 60Hz에서, 전형적인 1 밀리 초의 슬립 호출 단위로 프레임 사이의 정확한 시간 동안 슬립을하는 것은 실제로 불가능하다는 것입니다.

하지 당신이 아무했습니다없는 경우 CPU를 산출하는 것은 나쁜 일이라고 말; 그것과는 거리가 멀다. 그러나 이것은 프레임 속도를 제어하는 ​​것과 같지 않으며 Sleep은 전자에 적합하지만 후자는 적합하지 않습니다.

대신 시간이 경과했는지 확인하고 프레임을 실행할 시간인지 확인하십시오. 그렇지 않으면 CPU를 생성하려면 최소 1 밀리 초 동안 절전 모드를 해제하십시오. 또한 수면 타이머가 플랫폼에 적합하게 설정되어 있는지 확인하십시오. 즉, "Sleep (1)"호출을 실행하면 실제로는 15, 20 또는 30과 같은 것이 아니라 실제로 1 밀리 초 동안 슬리핑 할 가능성이 있습니다 (그렇지 않은 경우). SDL이 자동으로이 작업을 수행 할 것이라고 믿습니다.

프레임을 실행하는 데 거의 시간이 걸리면 슬리핑을 중지하고 프레임이 실행될 때까지 플랫 아웃을 시작하여 원하는 프레임 간격을보다 정확하게 맞출 수 있습니다.

이것이 결국처럼 보이는 것은 가끔 프레임과 함께 산재 된 전체 수면 (1) 호출입니다. CPU가 필요 없을 때는 여전히 CPU를 포기하지만 프레임은 정시에 실행될 수 있습니다.



0

앞에서 언급했듯이 CPU 사용량이 줄어 듭니다. 단점은 점점 더 중요 해지고 배터리 수명도 소진시킵니다. 좋은 예로 FTL은 내 MBA에서 거의 100 % CPU에서 실행됩니다. 결과적으로 배터리를 2 시간 이상 소모하고 매우 뜨겁습니다. (보다 직접적인 결과로 제거하고 더 이상 재생하지 않습니다 ...). 프레임 캡이이를 방지했을 것입니다.

언급되지 않은 또 다른 이점은 멀티 플레이어 게임 인 경우 모든 사람에게 동일한 경험을 제공하여 경기장을 평평하게한다는 것입니다.


프레임 속도와 게임 업데이트 루프가 같은 속도로 실행되지 않아도되므로 사람들에게 동일한 경험을 제공한다고 프레임 속도에만 의존하는 것은 아닙니다.
토마스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.