Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: Caricamento da offline

  1. #1
    Utente di HTML.it L'avatar di weit
    Registrato dal
    Jul 2011
    Messaggi
    55

    Caricamento da offline

    Ciao a tutti.
    Un cliente mi ha chiesto di sviluppare un browser game medievale, logicamente da 0... (tipo Travian o Ikariam).
    Mi è venuto in mente un problema, il caricamento mentre si è offline, ad esempio nella costruzione di un edificio, che continui a caricare anche se l'utente è offline e che produca anche se offline...
    Non so se sono stato sufficientemente chiaro... Io ho pensato di fare un server che interroghi il DB e "continui" a far produrre risorse quando l' utente è offline...
    Però, circa 2 anni fa, vidi la source di devana (Browser Game Medievale Open Source) e non aveva nessun server...
    Volevo chiedere se qualcuno di voi aveva in mente qualche altra cosa, oppure se qualcuno si è già trovato d'avanti a questa tipologia di problemi...

    Bye...

  2. #2
    Utente di HTML.it L'avatar di costi31
    Registrato dal
    Nov 2007
    Messaggi
    345
    Ciao, io ho creato un browser game (non stile travian, ma tipo bitefight), che però ho interrotto l'anno scorso senza ultimarlo nè metterlo online perchè non ho tempo (colpa della liceo).
    Comunque a me vengono così in mente solo due metodi per fare quello che hai detto:
    1 - script che a qualsiasi caricamento di una pagina sul sito interroghi il db e controlli il progresso portandolo avanti.
    2 - stesso script ma che viene continuamente avviato a intervalli ogni tot tempo tramite cron.


  3. #3
    molto semplicemente, a prescindere se è online o se è offline, sul database devi tenere lo stato delle costruzioni con la loro situazione e quando è stato effettuato l'ultimo controllo in questo modo, quando la persona accede ad una qualsiasi scheda del browser game, dopo aver effettuato il login, in cascata di effettui tutti i calcoli che ti servono, prima considerando eventuali stati di costruzione di strutture e poi effettuando i calcoli delle risorse

    visto che non ti serve notificare nulla via e-mail o simili, non hai bisogno di effettuare i controlli ogni tot (e se il tizio accede mentre fai i controlli che, nel caso di molti utenti, potrebbero richiedere tempo, che fai? )

  4. #4
    Utente di HTML.it L'avatar di costi31
    Registrato dal
    Nov 2007
    Messaggi
    345
    Originariamente inviato da daniele_dll
    molto semplicemente, a prescindere se è online o se è offline, sul database devi tenere lo stato delle costruzioni con la loro situazione e quando è stato effettuato l'ultimo controllo in questo modo, quando la persona accede ad una qualsiasi scheda del browser game, dopo aver effettuato il login, in cascata di effettui tutti i calcoli che ti servono, prima considerando eventuali stati di costruzione di strutture e poi effettuando i calcoli delle risorse

    visto che non ti serve notificare nulla via e-mail o simili, non hai bisogno di effettuare i controlli ogni tot (e se il tizio accede mentre fai i controlli che, nel caso di molti utenti, potrebbero richiedere tempo, che fai? )
    Concordo sul fatto che avvenga così solitamente e sia il metodo migliore, ma c'è un caso particolare in cui non si può fare come hai detto tu, almeno penso.
    Consideriamo un gioco di guerra (come tribals o travian) e ipotizziamo che una persona avvia a una certa ora la produzione di 100 soldati, che finisce dopo 6 ore, poi va subito offline. Un altra persona dopo 3 ore decide di attaccarlo ma si ritrova a combattere contro 50 soldati (che sono stati creati durante l'attesa) non contro 0. Questo era un esempio ma avviene sempre nei browser game di guerra più famosi, quindi l'unico modo per far sì che ciò avvenga è avviare uno script a intervalli regolari in questo caso. Non pensi?

  5. #5
    ok, ma il problema è comunque relativo

    tutti i calcoli del soggetto che ti interessa li fai eseguire nel momento in cui devi dare informazioni all'utente

    ovvero se il primo utente parte a generare 100 truppe e sono necessarie 6 ore ed il secondo utente fa partire un attacco dopo 3 ore

    a te, in realtà, interessa "risolvere" questa situazione nel momento in cui uno dei due utenti carica una qualsiasi loro pagina

    l'unica situazione, spiacevole, che potrebbe presentarsi e che se uno ha 20 villaggi con code di costruzioni, attacchi, produzioni e via dicendo l'accesso potrebbe risultare lento e quindi, in aggiunta a questa normale procedura potresti mettere un cron che esegue, ogni 10/15/30 minuti, le operazioni

    ma è giusto per evitare di dover fare troppi conti tutti insieme su troppe cose, solo per un fattore di carico, ma non di fattibilità

    ovvero l'aggiunta dello script temporizzato potrebbe permettere al server di distribuire meglio il carico invece di ritrovarsi a fare, tutt'insieme, le operazioni necessarie ... però solo per questo

  6. #6
    Utente di HTML.it L'avatar di costi31
    Registrato dal
    Nov 2007
    Messaggi
    345
    Sì concordo con te. Infatti io stavo pensando a una questione di carico eccessivo, per questo si potrebbe usare cron per ridurlo. Quello dell'attacco è un esempio banale però ci possono essere altri casi (che adesso non mi vengono in mente) dove i controlli del db richiesti diventano troppo frequenti e in contemporanea.
    In conclusione secondo me è meglio fare la maggior parte dei controlli al caricamento delle pagine quando si presenta il caso specifico (come hai detto anche tu), però se ci sono tanti utenti per alcune specifiche situazioni i cron sono di aiuto.

  7. #7
    si potrebbe benissimo fare un sistema che, passandogli l'identificativo dell'utente, sbroglia tutta la situazione

    il tutto però attivando nel contempo anche un lock (memcache, apc o file) per evitare che magari il cron scatti nel contempo o per evitare che magari il cron in esecuzione "raddoppi" il risultato delle operazioni

    il lock sull'intera tabella sarebbe da evitare perché altrimenti si bloccano tutti

    un alternativa, per lavorare in modo distribuito, potrebbe essere evitare l'uso di mysql e sfruttare un meccanismo di caricamento da file, lo so, può sembrare anomalo, ma i sistemi (realmente) distribuiti non operano direttamente sul singolo file

    un modo, ad esempio, per ridurre il problema delle performance e, nel contempo evitare problemi di locking, è (quasi) semplice, ovvero si potrebbe utilizzare un filesystem come GFS2.

    In questo modo i file dei dati sono dei semplici file serializzati:
    - espandere il sistema comporta la semplice aggiunta di una macchina al cluster dati o al cluster elaborazione e via, utilizzare mysql-cluster, per ottenere lo stesso livello di flessibilità, richiede più esperienza e soprattutto un budget iniziale più corposo
    - per ridurre il carico del sistema, benché il file venga comunque messo in cache dal sistema operativo, si può disabilitare questa funzionalità ed utilizzare apc o memcache in loco così da avere uno "storico" dei dati caricati sempre in memoria
    - alla nota precedente andrebbe accoppiato un load balancer (nginx) configurato per assegnare al nodo meno carico il client per poi continuare a farlo assegnare allo stesso client (un semplice check sui cookie basterebbe)

    mysql, in un contesto del genere, è relativamente utile ... infatti i dati girano generalmente attorno ad un singolo elemento, quindi creando dei bei file serializzati in cartelle/sottocartelle (così da evitare che troppi file in una sola cartella facciano impazzire il sistema) e magari spezzi i dati in più file (uno contenente le informazioni sul player, uno per villaggio contenente le risorse, le truppe e le strutture, uno per i messaggi e via dicendo ... così eviti di caricare in memoria troppa immondizia che non serve, leggasi i messaggi del player possono anche essere letti direttamente dal disco, tanto se attende un 30° di secondo in più non succede nulla ... in compenso tutto il resto va più veloce di assai):
    - ricevi la richiesta
    - verifichi se è presente il lock
    - attivi il lock sul player
    - verifichi se il player risiede in memoria
    - se no, carichi il file/i file del player e lo inserisci in memoria
    - esegui le operazioni di calcolo costruendo una timeline e analizzando poi a blocchi le varie parti della timeline delle operazioni
    - ...

    la comodità, però, di non avere dietro mysql è quella di

    per gestire la timeline degli eventi potresti semplicemente scriverli così come sono in un elenco ordinandolo per data, in questo modo quando la procedura fa le operazioni sa benissimo che arrivati a quel dato momento deve ricomputare le risorse prodotte per ora e via dicendo

    comunque, lo so, ho divagato eccessivamente probabilmente

  8. #8
    Utente di HTML.it L'avatar di weit
    Registrato dal
    Jul 2011
    Messaggi
    55
    Grazie a tutti per le risposte.
    Il modo più logico mi sembra l' utilizzo degli intervalli di tempo tramite cron, che sinceramente, non ne conoscevo l' esistenza.

    Una domanda... Mi sembra di aver capito che se vengono eseguite troppe (cron) contemporaneamente possono creare problemi. Ho capito male?

    Bye

  9. #9
    veramente è la soluzione meno logica, per vari motivi tecnici che sono stati sviscerati durante la discussione

  10. #10
    Utente di HTML.it L'avatar di weit
    Registrato dal
    Jul 2011
    Messaggi
    55
    Si, lo so... Ma è la soluzione migliore per alcune cose...
    Comunque sai rispondere alla domanda che ho fatto prima?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.