2012-11-08 3 views
8

내 게임 서버 내의 모든 플레이어와 객체에 대해 tick()을 실행하는 함수가 있습니다. 나는 0.1 초마다 세트를 반복함으로써 이것을한다. 나는 그것이 단단 해지기를 원한다 .1. 많은 시간과 수학은이 일시 중지가 가능한 한 정확하게 0.1 초가되는 것에 달려 있습니다. 이를 위해, 나는 틱 스레드에 이것을 추가 :Python - 코드 지속 시간으로 time.sleep() 오프셋

start_time = time.time() 

# loops and code and stuff for tick thread in here... 

time_lapsed = time.time() - start_time # get the time it took to run the above code 
if 0.1 - time_lapsed > 0: 
    time.sleep(0.1 - time_lapsed) 
else: 
    print "Server is overloaded!" 
    # server lag is greater that .1, so don't sleep, and just eat it on this run. 
    # the goal is to never see this. 

내 질문은,이이 작업을 수행하는 가장 좋은 방법은? 내 루프의 지속 시간이 0.01이면 time_lapsed == 0.01 ... 그러면 수면은 0.09에 불과합니다. 그것이 작동하지 않기 때문에 나는 묻습니다. 나는 오버로드 된 서버 메시지를 다른 날에 받기 시작했고, 서버는 확실히 오버로드되지 않았습니다. 수면을 "동적으로"제어하는 좋은 방법에 대한 생각? 수면없이 10 분의 1 초마다 코드를 실행하는 다른 방법이 있습니까?

+0

나는'try : time.sleep (0.1-elapsed);을 할 것이다. if 문으로 계산 시간을 줄이기 위해'except : except'를 사용합니다. 하지만 그 밖의 모든 것들이 좋아 보인다. – inspectorG4dget

+1

어떤 이유로 든 틱 스레드를위한 루프와 코드 및 물건들이 100ms보다 오래 걸린다. 서버가 "확실히 과부하되지 않았 음"을 어떻게 확신합니까? – bdares

+0

어떤 운영 체제를 사용하고 있습니까? 가장 좋은 기능을 선택하는 것이 중요합니다. –

답변

2

다른 파이썬 스레드가 스레드를 남기지 않고 실행할 수 있습니다. 또한 time.time()은 시스템 시간 조정의 영향을받습니다. 그것은 다시 설정할 수 있습니다.

비슷한 기능이 있습니다 Clock.tick() in pygame. 그 목적은 최대 프레임 속도를 제한하는 것입니다.

외부 영향을 피하기 위해 게임 시간을 측정하기 위해 독립적 인 프레임/회전 카운터를 유지할 수 있습니다.

+0

오! 그래서, 만약 내가이 권리를 이해한다면, 나는 time.time과 time.sleep을 완전히 제거 할 수 있고, Clock.tick (10)을 추가하면, 그것은 나의 틱 스레드를 초당 10 루프로 제한 할 것이다. . 그게 맞습니까? – jtsmith1287

3

마지막 틱() 이후 실제로 경과 된 시간에 "타이밍 및 수학"을 사용하는 것이 좋습니다. "매우 정확한"타이밍에 따라 최적의 시간에 깨지기 쉽습니다.

업데이트 : 내가 말한 것은 tick() 메서드가 마지막 호출 이후 경과 시간에 "t"라고하는 인수를 취한다는 것입니다. 그런 다음 움직임을 수행하기 위해 각 객체의 위치 (픽셀 단위)와 속도 (픽셀/초 단위)를 저장하므로 tick() 호출에 대한 이동의 크기가 "속도 * t"가됩니다.

이 기능을 사용하면 물리 시뮬레이션을 프레임 속도에서 분리 할 수 ​​있습니다.

아래에 언급 된 파이 게임 참조 : "pygame.time.Clock.tick()"메서드는 마지막으로 호출 한 이후의 시간 (초)을 반환하므로이 방법으로 사용됩니다.

+0

이 아이디어를 조금 더 설명해 주시겠습니까? 유망한 것 같지만 이해할 수 있을지 모르겠습니다. – jtsmith1287