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


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.