게임 루프 (Windows)에서 Sleep ()을 사용하는 것이 안전합니까?


27

게임 루프 (C ++)에서 Windows의 Sleep () 함수를 사용하는 것이 안전합니까? 고정 프레임 속도를 원합니다.


"안전하다"는 것이 무엇을 의미하는지 명확히해야합니다. 물론 그것은 안전하고 메모리를 손상 시키거나 플레이어 PC를 폭파시키지 않을 것입니다.
Kromster는 Monica

답변:


32

아뇨. 수면은 최소 수면 시간 만 보장 하지만 실제로는 임의의 시간 동안 수면을 취할 수 있습니다. 타이머 해상도 (timeBeginPeriod를 통해 설정)도 중요하며, 타이머에 QueryPerformanceCounter와 같은 다른 것을 사용하더라도 Sleep을 제어하려면 여전히 timeBeginPeriod가 필요합니다.

요약하면 다음과 같습니다.

  • 수면 시간은 보장 된 최소값 일 뿐이며 실제 수면 시간이 더 길어질 수 있습니다.
  • timeBeginPeriod를 통해 설정된 값 (또는 설정되지 않음)에 민감합니다.

Sleep을 사용하는 유일한 경우는 모바일 장치와 같은 CPU 사용을 줄이려는 경우입니다. 그럼에도 불구하고 수면 (1)을 사용하게됩니다. 이를 사용하여 프레임 속도를 제어하는 ​​것은 좋은 방법이 아닙니다.

vsync를 강제로 설정하는 것은 고정 된 프레임 속도를 얻는 일반적인 방법 중 하나이지만 다른 하드웨어는 서로 다른 새로 고침 빈도로 실행되며 다른 컴퓨터에서 일관된 고정 프레임 속도를 유지할 수 없습니다 (하드웨어 종류에 따라 다름) 물론 타겟팅하고 있습니다).

이 시점 에서이 기사를 언급해야합니다 : Gaffer On Games-Fix Your Timestep! . 시뮬레이션에서 일관된 타임 스텝을 얻는 데 필요한 단계를 설명합니다.


링크 주셔서 대단히 감사합니다. 지금까지는 일반적으로 기사에 설명 된 "가변 시간 단계"접근 방식을 사용했습니다.
Ivan Vučica

인텔 속도 단계가 활성화 된 시스템에서도 절전 모드가 위험합니다.
waterwizard11

"하지만 실제로는 임의의 시간 동안 잠을 잘 수 있습니다." 글쎄요, 그것은 내가 추측 한 것으로 입증되어야합니다 ... 그것의 증거를 본 적이 없어서 그것이 그 '정의'중 하나라고 생각합니다. 그래도 좋은 대답입니다. 정확한 프레임 속도를 설정하기 위해 모든 종류의 절전 모드를 사용할 수는 없습니다 (그렇지만 할 수는 있지만 고정밀 타이머가 필요합니다).
Valmond

2
MSDN에 따라- "준비된 스레드가 즉시 실행되지는 않습니다. 따라서 휴면 간격이 경과 한 후 일정 시간이 지나야 스레드가 실행되지 않을 수 있습니다." 사실, 나는 그것이 일어난 것을 본 적이 없지만, 그것이 가능한 것으로 문서화되어 있다면 결코 일어나지 않는 것에 절대 의존하지 않을 것입니다.
Maximus Minimus

1
언급 할 가치가있는 것은 이것이 "... CPU 사용량을 줄이려면 ..."과 관련이 있다고 생각합니다 : nanobit.net/doxy/quake3/win__main_8c-source.html <-관련 코드는 01224에서 시작합니다
user_123abc

16

짧은 대답 : 아니오, 그렇지 않습니다.

고정 된 프레임 속도를 유지하려면 특정 프레임 속도를 강제하는 특정 콜백 함수를 호출해야합니다. 분명히, 루프에서 단일 반복이 얼마나 오래 걸리는지는 수정 휴면 시간을 설정할 수 없습니다.

GLUT는 glutTimerFunc ()를 제공 합니다. OpenGL에서 프로그래밍하는 경우 필요한 기능입니다. 이 예제 또는 예제를 살펴보십시오 .


1
" 최소 msec 밀리 초 후에 OpenGLUT은 콜백을 콜백합니다"-어떻게 다른 Sleep가요?
Kromster는 Monica
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.