Come aggiornare il conteggio dei soldi di un giocatore ogni secondo

2

Sono in fase di analisi per un gioco basato su browser che sto facendo e ho una domanda sulla programmazione del sistema economico. Userò un sistema semplificato per porre la mia domanda.

Ogni utente come oggetto GameState , contenente tutto ciò che c'è da sapere sul suo gioco. Le strutture, ogni livello, l'esercito e quant'altro. Ancora più importante:

  • La sua attuale quantità di denaro
  • Il suo attuale reddito in denaro per ogni ciclo (un ciclo deve ancora essere definito, diciamo 1 secondo per l'esempio)
  • Il suo attuale cap in denaro, l'importo massimo che può raggiungere.

Il mio problema si trova qui:

Come faccio ad aggiornare in modo pulito e carino i soldi di tutti al secondo con il minor numero di risorse possibile?

La mia conoscenza dei database e delle query è piuttosto limitata, in quanto non so davvero quanto tempo / risorse occorra perché una query di tale dimensione si verifichi. Ma temo che molto veloce, con una piccola quantità di giocatori, il database inizierà a rallentare a causa della quantità di richieste che farò ogni secondo aggiunte a tutte le richieste che effettivamente faranno quei giocatori.

In questo momento, ho alcune idee possibili che non funzionano:

Every second, loop on every single player and update his money by his current income.

Questo sembra abbastanza folle, poiché il ciclo potrebbe non essere completato dopo un secondo, il che farà sì che i giocatori inizino a rimanere indietro in termini di cicli di denaro.

Load the complete database in memory, update all the players money, rewrite complete database.

Questo sembra ancora più folle, con gli stessi svantaggi della prima soluzione + più problemi possibili dovuti al caricamento del database completo in memoria e molte cose potrebbero accadere mentre si verifica l'aggiornamento. Questo è un no-no.

Not updating the money. Only calculate it when someone needs it (an enemy player or the player itself). I would save the timestamp of latest update, compare with server-time now, and multiply by income and I should be good. Right?

Ogni volta che l'utente vuole vedere il suo conteggio del denaro, dovrebbe aggiornare la pagina per assicurarsi che sia un po 'aggiornato. Va bene per me, davvero.

Questa soluzione mi sembra il mio miglior scatto, ma ho davvero una brutta sensazione al riguardo. Non riesco a puntare il dito su di esso, ma sembra così incline agli errori.

Comunque, sono qui per vedere se qualcuno di voi ha già fatto qualcosa del genere, o ha un'idea da condividere. Non sono sicuro di come affrontarlo, anche se sembra piuttosto semplice su piccola scala.

Nota: userò C # per tutta la mia logica, il sito web sarà un sito Web basato su .NET (ancora lavorando su questo), ma probabilmente sai cosa intendo. La persistenza dei dati sarà probabilmente un database MySQL o qualcosa di simile, forse Entity Framework.

    
posta Gil Sand 22.09.2016 - 16:17
fonte

2 risposte

1

La mia esperienza è alquanto limitata, ma penso che chiamerei una funzione. Come ha detto Caleth, è meglio se si aggiorna il valore effettivo solo quando è effettivamente necessario. Qualcosa del genere potrebbe funzionare bene:

checkMoney(){
   return money + (timeSinceLastCheck * income);
}

Compresi ID giocatore e verificatori secondo necessità.

A questo punto non è nemmeno necessario aggiornare il database. Puoi aumentare le prestazioni saltando la scrittura del database fino a quando non provano effettivamente a cambiare / interagire con i loro soldi. Se lo visualizzano solo, non è necessario modificare il contenuto del database.

    
risposta data 22.09.2016 - 17:00
fonte
1

La terza soluzione è semplice nel caso in cui tutti i cambiamenti di reddito siano il risultato dell'azione del giocatore. Ogni volta che il giocatore richiede lo stato del gioco e ogni volta che presenta un'azione, effettua un aggiornamento.

Puoi ancora fare lo stesso se ci sono modi per incrementare passivamente il reddito (ad esempio "costruisci 100 miniere d'oro"), poiché l'aggiornamento monetario è Interval * (StartIncome + EndIncome) / 2 . Puoi essere abbastanza complesso qui, purché tu possa integrare la funzione reddito, puoi avere una soluzione esatta alla funzione denaro.

    
risposta data 22.09.2016 - 16:38
fonte

Leggi altre domande sui tag