프레임 속도 제한


9

가장 성공적인 경쟁 게임 엔진 좋아 id Tech, GoldSrc, Source등은 프레임 속도 제한을 허용.

30 개, 60 개, 99 개, 72 개, 68 개 등을 사용할 수 있습니다.

프레임 속도를 어떻게 제한합니까?

코드에는 관심이 없지만 이론.


호기심에서 다른 프로세스의 사이클을 확보하는 것 이외의 다른 점은 무엇입니까?
3Dave

1
@DavidLively, 랩탑, 매우 높은 프레임 레이트에서 매우 쉽게 과열되는 반면 60fps의 캡을 사용하면 온도가 훨씬 더 잘 제어 될 수 있습니다.

경쟁적인 게임의 경우 60 ~ 100fps 사이의 급상승 대신 균일 한 프레임 속도를 유지하는 것이 가장 좋습니다. 일부 동작은 프레임 속도에 의존하고 시간에 의존하지 않기 때문에 동일한 프레임 속도를 사용하면 이러한 동작을 느낄 수 있습니다. Btw는 VSync를 활성화하면 게임이 항상 재생률과 동일한 최대 fps를 갖습니다 (드라이버가이를 처리 함).
Roy T.

답변:


7

이론은 다음과 같습니다. 프레임을 마지막으로 렌더링 한 시점을 확인하고 아직 다른 프레임을 그릴 시간이 아닌 경우 확인하지 말고 기다리십시오.


8

프레임 속도를 60fps로 제한하려는 경우, 모든 프레임의 렌더링 시간은 1/60 초 = 16,67ms (반올림)입니다.

프레임 속도를 제한하려면 게임 루프 시작시 시간을 확인한 다음 게임 루프 끝 시간과 비교할 수 있습니다. 차이가 16.67ms 미만인 경우 해당 시간 동안 정지해야합니다.

이를 수행하는 한 가지 방법은 다음을 사용하는 것입니다.

sleep(waittime)

그러나 sleep(x)최소한 1 x밀리 초 동안 스레드를 생성하므로 시간을 되돌릴 수 있는지 확실하지 않습니다.

더 좋은 방법은 다음을 사용하는 것입니다.

while(timediff < 16.67ms){ sleep(0); }

그러면 스레드가 생성되고 가능한 빨리 제어를 다시 요청합니다.

또 다른 해결책은 바쁜 대기 루프를 유지하는 것입니다.이 기능은 최상의 제어 기능을 제공하지만 CPU를 불필요하게 사용합니다.

OS 스케줄러는 항상 스레드에서 제어권을 빼앗을 수 있으므로 약간의 변동에 대비하십시오.


명확하게 "1 / 60s". :)
Richard Marskell-드라 키르

이 솔루션은 정말 나쁩니다. vsync를 사용하도록 설정했거나 OS에서 작업을 수행하기로 결정한 경우 프레임 속도가 크게 변동합니다.
Tara

@Dudeson 왜 나쁜가요? 이것은 Quake3 btw에서 사용 된 기술입니다. FPS가 60보다 낮 으면 루프가 건너 뜁니다. 따라서 FPS를 최대한 높게 유지하지만 절대 60을 초과하지는 않습니다.
Roy T.

@RoyT. 흥미 롭습니다. 그 정보는 어디서 얻었습니까? 소스 코드에서? 또한 루프에서 대기하는 것이 나쁘다는 것을 말하고 있습니다. 왜냐하면 그것이 엔진에서 정확히 한 방법이기 때문에 많은 고통을 유발하기 때문입니다. 문제는 GPU 드라이버에서 vsync를 켤 때 timinig가 모든 프레임에서 완벽하지는 않기 때문에 코드에서 프레임 속도를 추가로 제한하면 많은 프레임 드롭이 발생한다는 것입니다. vsync 문제에 대해서만 이야기하고 있습니다. vsync가 없으면 이것은 문제가되지 않습니다. 그리고 vsync가 현재와 같은 3 일 Quake에서 같은 종류의 거래인지 확실하지 않습니다.
Tara

@Dudeson 다른 사람은 바쁜 대기와 수면에 대해 걱정했기 때문에 얼마 전에 나에게 지적했습니다. v-sync가 켜져 있으면 약간 놓치면 30fps와 60fps 사이에서 변동될 수 있습니다. 그러나 나는 그것이 어떤 기술에서도 발생한다고 생각합니다 (FreeSync가 완화하려고하는 것이 아닙니다). 코드로 제한된 프레임 속도 또는 컴퓨터가 60fps로 렌더링 할 수 없기 때문에 항상이 문제가 발생합니다. :)
Roy T.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.