sleep 왜? 언제? 얼마나? (2)

오호 09.08 22:15 조회 132 댓글 0



앞에서 마법을 너무 빠르게 사용하려고 하면 안되기 때문에

마법 반복 사이에 sleep을 넣어주어야 한다고 했습니다.


v1.1

CastSpell(SpellChar, Delay := 100) {
    sendinput +{z}{%SpellChar%}
    sleep %Delay%
    return
}



v2.0

CastSpell(SpellKey, Delay := 100) {
    SendInput "+z" SpellKey
    sleep Delay
}

이런 식으로 마법 혹은 채팅 관련 hotkey 끝에는 sleep을 적절히 넣어주시는 것이 좋습니다.

------------------------------------------------

이제 값을 얼마로 줘야 하는지 알아봐야겠습니다.

그런데 안타깝게도 획일적인 룰은 없습니다.

마법마다 시전 딜레이(같은 마법을 반복하는데 필요한 최소 시간)가 존재하는데
이 시간이 마법마다 다릅니다.


마법별 시전 딜레이 차이

자동 기원: 125ms ~ 140ms
혼마술,중독,파혼 등등 : 180~200ms
지진: 300ms
공력증강: 400ms

무기 휘두르기: 510 ms

이런 식이라 마법마다 다른 delay 값을 주어야 합니다.

F1::
{
    Delay := 510
    StartTime := A_TickCount
    Loop 5 {
        SendInput "{Space}" ; 여기에 마법
        sleep Delay
    }
    ElapsedTime := A_TickCount - StartTime
    sleep 50
    sendinput "'" ElapsedTime "{Enter}{esc}"
    return
}

계산하는 방법은 위와 같이 Delay 값을 조정하고
<F1> Key를 눌렀을 때 마법이 누락되지 않고 5번 나가게 하는 값을 찾으면 됩니다.
(위의 예시는 space bar 5번 누르기)

값은 네트워크 상태나 PC에 따라 미세하게 차이가 있을 수 있습니다. (밑에서 설명하겠습니다.)

위와 같은 방법을 시전 딜레이를 계산하거나 혹은 위에 적힌 값을 참고하셔서


커서 이동하면서 사용하는 마법은 시전 딜레이 최댓값 (예시 중독 : 200 )
그렇지 않은 마법은 가끔 마법이 밀리는 것을 고려해서 최댓값의 절반 정도 사용하면 적절합니다.
(사실 최댓값 쓰는 거랑 별 차이는 없습니다.)


이보다 작은 값을 사용하는 것은 CPU 낭비에 가깝고
혹시 작게 하고 싶더라도 50 이하의 값은 지양해주세요.

------------------------------------------------
마법 간의 간섭
------------------------------------------------
마법에는 시전 딜레이 말고도 after cast delay라는 것이 존재 합니다.

after cast delay 혹은 후딜?
- 마법 시전 후에 다른 마법을 사용할 수 없는 구간 ( 서로 다른 마법이 간섭 )


자동 기원은 시전 시간도 짧고 after cast delay(후딜)가 거의 없어
자동 기원이 다른 마법을 느리게 하지 않습니다.

그러나 혼마술, 공력증강 같은 마법들은 after cast delay가 있어 같이 사용하는 다른 마법을 조금 느리게 만듭니다.
혼마술 timer와 자동기원 timer가 동시에 돌아가면 자동기원이 조금 느려진다는 의미 입니다.
 
사냥에 참고하세요.


------------------------------------------------------------------------------------------------
sleep 정확도? ( 중요하지 않은 내용입니다. 참고만 하세요)
------------------------------------------------------------------------------------------------
위에서 pc마다 delay값이 조금씩 다를 수 있다고 말씀드렸습니다.



autohotkey에서 sleep을 1ms 단위로 줄 수 있긴 하지만 windows에서 sleep time을 세는 단위는
10ms 혹은 15.6ms 입니다.

sleep 1 이라고 해도 OS 버전에 따라 최소 10ms 혹은 15.6ms를  기다리게 됩니다.
그러므로 sleep 값을 조정할 때는 5단위 밑으로 조정하는 것은 큰 의미가 없습니다.



그런데 같은 pc에서도 시간을 측정해보면 계속 차이가 나는 것을 볼 수 있습니다.
sleep 100
SendInput "{Space}"
이 코드가 동작하는 방식은 "정확히 100ms 이후에 Space bar를 누른다" 가 아닙니다.
"100ms 만큼 쉬고 다시 할 일 목록에 줄 서라"의 의미 입니다.
100ms 쉬고 왔는데 앞에 할 일이 많이 쌓여 있다고 하면
앞에 쌓여 있던 일을 먼저 처리하고 그 다음에 Space bar를 누릅니다.

현재 PC에서 하고 있는 일이 많다면 이런 식으로 지연되는 일이 더 많이 생길 수 있어
그때그때 delay 값이 달라질 수 있습니다.


댓글 0