Timer per classe / approccio saggio?

1

Lavoro su un server di giochi online. Per la rigenerazione degli hitpoint del giocatore, considero l'utilizzo dei timer. Cioè, se il giocatore è online e il suo HP o mana è inferiore al massimo, ogni minuto queste statistiche vengono incrementate. Normalmente, non ci sono più di 50-80 giocatori online allo stesso tempo. Un approccio saggio per creare un timer per classe (un'istanza di Player) che potrebbe attivare eventi HP ++ e Mana ++?

Un'altra idea che ho avuto è stata quella di avere un timer sul thread del server principale, sparare ogni minuto e fare in modo che i giocatori si iscrivessero agli eventi.

C'è qualcosa di sbagliato in questo approccio ed è ragionevole, in termini di prestazioni?

    
posta John V 13.10.2017 - 14:12
fonte

3 risposte

2

È una cattiva idea.

Di 'che hai 50 giocatori che sparano tutti gli incantesimi e che riempiono il loro mana tutto il tempo. Quasi ogni secondo di questi timer genera un evento e questo è solo per il mana. Aggiungi Hitpoint, mostri, abilità di rallentamento, ecc. E presto avrai milioni di timer che consumano memoria, larghezza di banda e thread.

Un approccio molto migliore è quello di avere un singolo timer e un "ciclo di gioco" che viene eseguito ogni secondo e controlla se è necessario inviare qualcosa.

Non è necessario tenere traccia dell'ora di ciascun evento, in quanto spesso possono essere calcolati.

Quando un giocatore viene spawnato puoi tenere traccia di quel tempo e ogni ciclo di gioco togli l'ora corrente e vedere se il resto è un multiplo dell'intervallo di rigenerazione del mana.

    
risposta data 13.10.2017 - 17:35
fonte
3

Dipende dal timer che stai usando. Alcuni timer creeranno una discussione per segnalare quando è ora di andare, il che non sarebbe fattibile se ne facessi uno per classe.

Un altro approccio comune che potresti prendere in considerazione è quello di avere un concetto di "tempo trascorso" per ogni zecca del tuo ciclo di gioco. Invece di sparare un evento quando passa un minuto, si invia lungo il tempo trascorso e il codice per la rigenerazione HP accumula il tempo trascorso e aggiunge X HP al minuto accumulati (con qualche resto).

Questo tende ad essere più performante se il tuo server raggiunge un picco di ritardo o per eventi che si attivano più frequentemente di una volta al minuto.

    
risposta data 13.10.2017 - 15:03
fonte
0

Cerca sempre di ridurre al minimo gli aggiornamenti:

La quantità di mana / hp ha implicazioni diverse da quelle che potresti avere troppo poco per sopravvivere (dead on hit) usa rispettivamente un'abilità (incapacità di eseguirla)?

In tal caso, prendi in considerazione la possibilità di salvare due elementi: Stato all'ultimo aggiornamento e ora dell'ultimo aggiornamento e rinviare l'aggiornamento alla prossima volta che hai per crearne uno.

Se altri attributi importanti sono influenzati da una soglia, puoi approfondire ciò, se sulla quantità esatta / percentuale, in realtà non puoi eludere la necessità di aggiornamenti continui.
Anche in questo caso, considera se riesci a farla franca aggiornando tutto ciò che deve essere aggiornato utilizzando un solo timer, anche se forse è scaglionato per evitare di congelare troppo a lungo il mondo intero.

    
risposta data 13.10.2017 - 15:06
fonte

Leggi altre domande sui tag