|
제가 좀 잘못 쓴 것이 있군요..
윈도우 기본 타이머는 열씸님글이 맞습니다.
그 타이머는 1/18.2 이 이하의 시간은 정확도를 보증하지 못합니다.
때문에 1ms 시간을 제어하려면..
멀티미디어 타이머(고해상도 타이머) 를 사용해야 합니다.
멀티미디어 타이머를 이용하는 방법은 검색을 해보시면 많이 나옵니다.
4~5년전 쯤 테스트를 했을때는 상당한 정확도를 보였습니다.
그럼이만.
열씸! 님이 쓰신 글 :
: 윈도우 기본 타이머가 1/1000 초 주기인건 아닙니다.
:
: Win95 ~ XP 까지 대개 최소타이밍이 다른데, 정확히 기억나진 않지만, XP의 경우 10ms 정도 (1/100초)
: 였던 것 같습니다.
:
: DOS 는 1/18.2초 였고, 95 98정도도 비슷했던걸로 기억합니다.
: 2000 이, 1/50 이었나.
:
: 기억이 정확하지 않아 타이머 두개로 테스트를 해 봤습니다.
: 하나는 1ms 주기 하나는 1000ms 주기(1sec) 로 놓고, 1ms 타이머에선 int 형 카운터 변수를 1씩증가
: 1000ms 타이머에선 카운트 횟수를 출력하고 0으로 reset하게 말이죠.
:
: 평균 64회 카운트 됩니다. (1/64초) Windows XP(SP2)입니다.
: 즉, 15ms 정도 주파수 단위로 밖에 카운트가 안된다는거죠.
:
: RDTSC 는 CPU 내부의 클럭 카운터입니다. (ReaD Time Stamp Counter 던가요)
: 즉, 3Ghz CPU 에선 1초에 3,000,000,000 회 카운트가 되죠.
: 대신에, 단지 세어주는 기능을 하는 녀석이라, 루프를 돌면서 Sleep 이라든지
: 적절한 흐름 제어가 필요한 것이죠.
:
: 답변을 올리신 분도 제대로 조사를 해 보셔야 할 것 같은데,
: 섣부른 답변이셨던듯 합니다.
:
: 다시 말씀드리지만, 단위가 1msec 라고 1msec 주기로 타이머 주파수가 발생하는건 아닙니다.
: RDTSC 를 사용하는 방법은, 어셈블리나 인라인 어셈블리로 RDTSC 명령어를 날리거나
: 그 명령어를 지원하지 않는 경우는 emit 나 db 같은 instruction을 직접 보내주는 명령어로
: 명령어의 hex 값을 써 줘야 합니다. 구글에서 rdtsc 검색해 보시면 곳곳에 나올 것이구요.
: 인라인 어셈블리까지 동원할 만큼 최소의 클럭소모가 필요하지 않은 경우엔,
: QueryPerformanceCounter API를 사용해서(내부적으로 RDTSC를 조사하는 함수로 알고 있습니다)
: 전원이 들어온 뒤, 현재까지의 클럭 카운트를 읽어(RDTSC)올 수 있습니다.
:
: 즉, 쓰레드를 하나 만드셔서, 적절히 RDTSC 하시면서 요구된 주파수에 이벤트 핸들러 함수를
: 콜백해 줄 수 있는 형태로 만드시면 되는 것이지요.
|