2017-09-21 1 views
1

SDL_Delay은 완벽하게 정확하지 않습니다. 프로그램이 대기하는 시간은 함수에 인수로 전달 된 값보다 1 ~ 2 ms 더 길 수 있습니다. 나는 이것이 사용 된 OS에 따라 일어날 수 있다고 읽었다. 어쩌면 다른 사람들에게는 그 차이가 더 작거나 클 것입니다.SDL_Delay보다 프로그램을 더 정확하게 지연시키는 방법이 있습니까?

초당 ~ 60 프레임을 표시하는 프로그램을 만들려면 프로그램이 각 프레임 사이에 SDL_Delay을 호출하여 프로그램이 17ms (1000/60 = 16.6666 ...) 이하로 대기해야합니다. SDL_Delay의 마지막 호출 이후의 다른 조작에 의해 소비 된 시간. 그러나이 함수를 사용하면 각 프레임 사이의 시간이 약간 달라지며 때로는 17ms, 때로는 18ms, 때로는 19ms ... SDL_Delay의 동작을 재현 할 수있는 방법이 있는지 알고 싶지만보다 정확한 방법으로 그 격차의 불편 함을 느끼지 않고.

+1

POSIX ['nanosleep()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html#) 기능은 무엇입니까? –

+1

@DavidBowling 작동, ty – nounoursnoir

+2

XY 문제처럼 보입니다. 왜 페이지 플립을 기다리지 않습니까? 접근 방식이 시간 낭비이고 신뢰할 수 없습니다. – Olaf

답변

2

예, 방법은 있지만 운영체제 전용이됩니다.

리눅스에서 time(7), nanosleep(2), poll(2) (혹은 이전 select(2)), clock_gettime(2), timer_create(2) (혹은 timerfd_create(2))

읽기는 Advanced Linux Programming (그러나 최근의 리눅스 기능이이 언급되지 않은 읽기 , intro(2)syscalls (2)도 참조하십시오.

은 어쩌면 당신은 (특히 SIGALRMsetitimer(2)와) signal(7)에 의해 관심이 있지만, 그때는 다른 다른 운영 체제에서 signal-safety(7)

를 읽으십시오, 당신은 알아 내야 할 수있다.

물론 정보의

는 하드웨어 관련

SDL free software이며, 일부 event loop (SDL_WaitEventTimeout 참조) (모든 그래픽 툴킷 등)가 아마 주위 poll(2) 또는 Linux에서 select(2), 그래서 (약을 HPET, APIC timer, PIT 읽기)된다 당신은 구현에 뛰어들 수 있습니다.

1

지연 사이에서 실행중인 코드에 실행 시간도 있다는 사실을 고려하고 있습니까? 지연을 호출하기 직전 프레임의 코드 실행 시작부터 코드 실행 끝까지의 시간 델타를 가져와야하며 델타를 잠자기 시간에서 뺍니다.

+0

나는 이것을 고려했다 – nounoursnoir

+0

그것은 대답이 아닌 답이다. . – Olaf

관련 문제