In questi giorni sto cercando di progettare l'architettura di un nuovo gioco MMORPG per dispositivi mobili per la mia azienda. Questo gioco è simile a Mafia Wars, iMobsters o RISK. L'idea di base è preparare un esercito a combattere i tuoi avversari (utenti online).
Anche se in precedenza ho lavorato su più app mobili, ma questa è una novità per me. Dopo molte lotte, ho escogitato un'architettura che è illustrata con l'aiuto di un diagramma di flusso di alto livello:
Abbiamo deciso di scegliere il modello client-server. Ci sarà un database centralizzato sul server. Ogni client avrà il proprio database locale che rimarrà sincronizzato con il server. Questo database funge da cache per l'archiviazione di oggetti che non cambiano frequentemente, ad esempio mappe, prodotti, inventario, ecc.
Con questo modello in atto, non sono sicuro di come affrontare i seguenti problemi:
- Quale sarebbe il modo migliore per sincronizzare database di server e client?
- Un evento deve essere salvato nel DB locale prima di aggiornarlo sul server? Cosa succede se l'app termina per qualche motivo prima di salvare le modifiche nel DB centralizzato?
- Le richieste HTTP semplici serviranno allo scopo della sincronizzazione?
- Come sapere quali utenti sono attualmente connessi? (Un modo potrebbe essere quello di fare in modo che il client continui a inviare una richiesta al server dopo ogni x minuti per notificare che è attivo. In caso contrario, considerare un client inattivo).
- Sono sufficienti le convalide lato client? In caso contrario, come ripristinare un'azione se il server non convalida qualcosa?
Non sono sicuro che si tratti di una soluzione efficiente e di come si ridimensionerà. Gradirei davvero se le persone che hanno già lavorato su tali app possano condividere le loro esperienze che potrebbero aiutarmi a trovare qualcosa di meglio. Grazie in anticipo.
Informazioni addizionali:
Il lato client è implementato nel motore di gioco C ++ chiamato marmalade. Questo è un motore di gioco multipiattaforma, il che significa che puoi eseguire la tua app su tutti i principali sistemi operativi mobili. Possiamo certamente ottenere il threading e che è anche illustrato nel mio diagramma di flusso. Sto pensando di utilizzare MySQL per server e SQLite per client.
Questo non è un gioco a turni, quindi non c'è molta interazione con altri giocatori. Il server fornirà un elenco di giocatori online e potrai combatterli facendo clic sul pulsante di battaglia e dopo alcune animazioni, il risultato verrà annunciato.
Per la sincronizzazione del database ho in mente due soluzioni:
- Memorizza data / ora per ogni record. Tieni inoltre traccia dell'ultimo aggiornamento del DB locale. Durante la sincronizzazione, selezionare solo quelle righe che hanno un timestamp maggiore e inviare al DB locale. Mantieni un flag isDeleted per le righe eliminate in modo che ogni eliminazione si comporti semplicemente come un aggiornamento. Ma ho seri dubbi sulle prestazioni in quanto per ogni richiesta di sincronizzazione dovremmo scansionare il DB completo e cercare le righe aggiornate.
- Un'altra tecnica potrebbe essere quella di tenere un registro di ogni inserimento o aggiornamento che ha luogo contro un utente. Quando l'app client richiede la sincronizzazione, vai a questa tabella e scopri quali righe di quale tabella sono state aggiornate o inserite. Dopo che queste righe sono state trasferite correttamente sul client, rimuovere questo registro. Ma poi penso a cosa succede se un utente utilizza un altro dispositivo. Secondo la tabella dei registri, tutti gli aggiornamenti sono stati trasferiti per quell'utente, ma in realtà ciò è stato fatto su un altro dispositivo. Quindi potremmo dover tenere traccia anche del dispositivo. L'implementazione di questa tecnica richiede più tempo ma non è sicura che esegua la prima.