2012-11-08 27 views
8

Ho una funzione che esegue una spunta() per tutti i giocatori e gli oggetti all'interno del mio server di gioco. Lo faccio collegando un set ogni .1 secondi. Ho bisogno che sia solido .1. Un sacco di tempismo e matematica dipende da questa pausa, che è il più esatta possibile fino a 0,1 secondi. Per raggiungere questo obiettivo, ho aggiunto questo al thread tick:Python - time.sleep() offset per la durata del codice

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. 

La mia domanda è, è questo il modo migliore per farlo? Se la durata del mio ciclo è 0,01, allora time_lapsed == 0,01 ... e quindi il sonno dovrebbe essere solo per 0,09. Chiedo, perché non sembra funzionare. Ho iniziato a ricevere il messaggio del server sovraccarico l'altro giorno e il server non è stato sicuramente sovraccaricato. Qualche idea su un buon modo per controllare "dinamicamente" il sonno? Forse c'è un modo diverso di eseguire il codice ogni decimo di secondo senza dormire?

+0

Vorrei fare un 'try: time.sleep (0,1 - trascorso); tranne: pass' solo per ridurre il tempo di calcolo con l'istruzione if. Ma tutto il resto sembra buono – inspectorG4dget

+1

Sembra abbastanza chiaro che per qualche motivo i tuoi "cicli e codice e roba per tick thread" impiegano più di 100ms. Come sei sicuro che il server sia "decisamente non sovraccaricato"? – bdares

+0

Quale sistema operativo stai usando? È importante scegliere la migliore funzione –

risposta

2

È possibile che vengano eseguiti altri thread Python tra meno thread di tempo. Anche time.time() è soggetto ad aggiustamenti orari del sistema; può essere arretrato.

Esiste una funzione simile Clock.tick() in pygame. Il suo scopo è limitare il frame rate massimo.

Per evitare influenze esterne è possibile mantenere un contatore indipendente di frame/giri per misurare il tempo di gioco.

+0

Oh! Quindi, se sto capendo questo, posso rimuovere time.time e time.sleep completamente, e aggiungere solo Clock.tick (10), e questo limiterà il mio thread tick a 10 loop al secondo, che è quello di cui ho bisogno . È giusto? – jtsmith1287

3

Sarebbe meglio basare i "tempi e la matematica" sulla quantità di tempo effettivamente trascorso dall'ultimo tick(). A seconda dei tempi "molto precisi", i tempi saranno fragili.

Aggiornamento: ciò che intendo è che il metodo tick() accetta un argomento, ad esempio "t", del tempo trascorso dall'ultima chiamata. Quindi, per fare movimento, memorizzerai la posizione di ciascuna cosa (ad esempio in pixel) e la velocità (in "pixels/second") in modo che la grandezza del suo movimento per quella chiamata a tick() diventi "velocity * t".

Questo ha l'ulteriore vantaggio di disaccoppiare la simulazione fisica dal frame-rate.

Vedo pygame menzionato di seguito: il loro metodo "pygame.time.Clock.tick()" deve essere utilizzato in questo modo, poiché restituisce il numero di secondi dall'ultima volta che lo hai chiamato.

+0

Saresti disposto a spiegare questa idea un po 'di più? Sembra promettente, ma non sono sicuro di aver capito. – jtsmith1287

Problemi correlati