Come posso implementare il gameplay in tempo reale quando un utente non è online?

5

Ho due domande su come tenere in funzione i timer (come la coltivazione di Farmville) quando gli utenti non sono online:

  • Ho ragione nel pensare che dovrei solo calcolare cosa sarebbe successo quando è stato richiesto lo stato, piuttosto che eseguire qualcosa ogni minuto ad esempio?

  • Come dovrei mantenere il client sincronizzato con il server? Il client dovrebbe fare le cose da solo e poi controllare ogni pochi minuti, o dovrebbe essere tutto server side su Socket.IO?

Grazie! (scusa se questo è nella sezione sbagliata, sentiti libero di spostarlo)

    
posta Oliver Dunk 26.03.2016 - 23:05
fonte

3 risposte

0

Sebbene non si riferissero alle coltivazioni, stavo effettivamente affrontando un problema simile in cui disponevamo di dati che potevano essere elaborati dopo un certo periodo di tempo e anche questo sistema aveva un'applicazione mobile.

Ciò che avevamo fatto è stato aggiungere un timestamp ai dati, che indica quando i dati sono pronti per il passaggio successivo (che si tratti di raccolta o di qualsiasi altra cosa).

Quando un utente ha effettuato il login all'applicazione, il client recuperava i dati del server e in base al valore, visualizzava un pulsante per la raccolta o prendeva tempo corrente e il timestamp dal database, differiva i due valori e avviava il conto alla rovescia. Quando il contatore ha raggiunto lo zero, viene visualizzato il pulsante per la raccolta.

Inoltre abbiamo aggiunto un cron in esecuzione ogni minuto, inviando notifiche ai client se si erano iscritti a loro quando un raccolto che non è stato disponibile per la raccolta è diventato così.

Abbiamo scelto un'attività cron 60 secondi. Naturalmente questo andava bene se un crop diventasse disponibile a x.59, quindi non ci sarebbe praticamente nessun ritardo, ma se diventasse disponibile a x.60, l'utente non lo saprebbe fino a un minuto dopo. Ma è stato abbastanza buono per il nostro progetto ed è stato fatto per facilitare il carico sui nostri server.

    
risposta data 27.03.2016 - 16:36
fonte
4

Per usare una metafora - il mondo (il mondo reale - cioè il pianeta Terra) smetterebbe di girare se improvvisamente tutti i suoi "utenti" (gli esseri umani e gli altri abitanti) morissero all'improvviso o si imbarcassero su un'astronave per migrare su un altro pianeta? No certo che no! Il mondo continuerà a girare fino alla fine dell'universo.

Se stai pensando di implementare una simulazione in tempo reale persistente (a.k.a. "world"), allora il tuo mondo dovrebbe anche continuare a girare / barrare indipendentemente dal numero di abitanti (clienti / utenti) attualmente in quel mondo.

Il modo in cui si mantengono i clienti in sincronia con il proprio mondo dipende più dalla quantità di dati di cui ogni cliente ha realmente bisogno e a cui importa; compresa la frequenza con cui ti aspetti che i dati diventino obsoleti e se sia importante per il cliente che i dati potrebbero essere obsoleti. (Considerate: se un albero cade in una foresta e non c'è nessuno che lo senta cadere, emette ancora un suono? C'è qualcuno che si preoccupa che l'albero sia caduto? Schrodinger non si preoccupa del suo gatto).

Se si sceglie un modello di notifica, un modello di streaming / trasmissione o un modello di richiesta-risposta dipende dal tipo di dati che vengono scambiati. Probabilmente troverai un utilizzo per tutti questi pattern di messaggistica e altro ancora.

Per usare nuovamente la metafora del mondo reale, valuta quante informazioni riceve ogni abitante della Terra, tra tutti i miliardi di cose che accadono in ogni momento.

Un "abitante" seduto in una casa potrebbe ricevere un notiziario (un quotidiano) una volta al giorno, perché i giornali cambiano solo una volta al giorno. Tuttavia, quando il giornale viene consegnato, è una "istantanea" abbastanza completa di tutte le notizie che sono accadute intorno a loro.

Quindi considera lo stesso abitante ricevere notizie su un televisore; tuttavia, l'abitante riceve tali rapporti solo quando il televisore è acceso (e l'abitante decide quando accendere il televisore e quando spegnerlo di nuovo). La stazione TV trasmette sempre, senza sapere chi sta guardando. L'abitante guarda solo quando sceglie; la trasmissione non va via solo perché spengono comunque la TV.

Questo è analogo ad avere un flusso costante di messaggi di micro-aggiornamento trasmessi in tempo reale da un server, ma le applicazioni client scelgono di abilitare / disabilitare la loro sottoscrizione a quei flussi di messaggi, a seconda che il cliente desideri / abbia bisogno di sapere al momento.

Infine, considera il caso in cui l'abitante ha richiesto specifici tipi di aggiornamenti di notizie da inviare via e-mail (magari quelli su Politica e Sport, ma non su Salute o Tecnologia); ci possono essere notizie occasionali poco frequenti e imprevedibili inviate in momenti del tutto arbitrari durante il giorno; a volte ci possono essere 5 storie all'ora, altre volte non ci possono essere storie per diverse ore. Ogni notifica è un aggiornamento a cui l'abitante ha chiesto di essere informato perché pertinente. Le relazioni su Salute e Tecnologia non saranno inviate a loro anche quando tali rapporti sono pubblicati.

In generale, non esiste una risposta giusta o sbagliata per quanto riguarda i modelli di messaggistica per sincronizzare i dati client / server; i diversi tipi di dati avranno requisiti diversi e sarà necessario scegliere quello più appropriato.

    
risposta data 27.03.2016 - 00:27
fonte
0

Il vecchio approccio credo sarebbe quello di modellare "cosa sarebbe successo" alla prossima richiesta.

Questo è meno costoso da calcolare perché almeno alcuni di questi utenti non effettueranno di nuovo l'accesso.

Tuttavia, i giochi e le app di moden provano a tenere impegnati gli utenti inviando notifiche push "hai più cuori / oro" ecc.

Dovrai fare un compromesso tra la spesa di eseguire simulazioni mondiali mutiple per i non utenti rispetto al guadagno ottenuto allettando gli utenti a giocare / spendere nel tuo gioco.

    
risposta data 27.03.2016 - 16:13
fonte

Leggi altre domande sui tag