MMG – Sim Massive Multiplayer Gaming Simulator REQUISITI : - Windows - Un buon computer - OpenGL MODULI IN C : - MMGIN : Modulo di gestione Input Parametri - MMGCL : Modulo di gestione Client-side - MMGSERV : Modulo di gestione Server-side - MMGDEFS : Definizioni delle strutture, tipi ed operazioni di base - MMGGR : gestione Grafica OpenGL - MMGRND : gestione generazione numeri casuali - MMGISC : gestione routines inter-server (InterServerCommunication) - MMGDDM : Data Distribution Management locale e inter-server - MMGGV : definizione delle variabili globali - MMGWOD : definizione di oggetti, messaggi simulati e altro - MMGSUPU : gestione SUbscribe/PUblish e operazioni su aree - MMGAI : Modulo di gestione Intelligenza Artificiale Avatars - MMGSIM : Controllo Centrale Simulazione I moduli MMG sono esclusivamente di nostra creazione riga per riga e sono stati compilati con Dev C++ (Bloodshed Software) sotto Windows XP. Righe di codice totali = 5.450 (circa). INDICE - 1.0 - Intro o 1.1 – Punti focali o 1.2 – Virtual World Partitioning o 1.3 – Il Simulatore su Livelli o 1.4 – Il gioco simulato - 2.0 – Client o 2.1 – Intro e Struttura generale o 2.2 – Interazioni e protocollo conservativo o 2.3 – Client V-Map o 2.4 – Ghost Effect o 2.5 – Protocollo Ottimistico o 2.6 – Avatar Artificial Intelligence - 3.0 – Server o 3.1 – Intro o 3.2 – FrontEnd Module o 3.3 – ServerMap Module 3.3.1 – Generale 3.3.2 – Struttura 3.3.3 – Tile SubMap Control 3.3.4 – Object Locking 3.3.5 – Tiles o 3.4 – BackEnd Module & DataDistribution Module 3.4.1 – Back End Module 3.4.2 – Data Distribution Module o 3.5 – Concorrenza Moduli BackEndMod e DDMod o 3.6 – Data Distribution Management 3.6.1 – Sottoscrizioni e Pubblicazioni 3.6.2 – DDM Locale 3.6.3 – DDM Inter-Server e Comunicazioni - 4.0 – Migrazioni o 4.1 – Migrazioni : Ownership Switch o 4.2 – Protocollo di Migrazione o 4.3 – Migrazione in dettaglio o 4.4 – Migration Table - 5.0 – EnGen : Virtual World Environment Generator - 6.0 – Simulatore o 6.1 – Event List o 6.2 – Struttura di una simulazione MMG-Sim - 7.0 – Generatore Numeri Casuali e Statistiche Output o 7.1 – Random Generator o 7.2 – Statistiche di Output o 7.3 – Struttura Report o 7.4 – Parametri Input - 8.0 – Funzionamento del Simulatore INTRO Il simulatore di nostra creazione MMG-Sim è l’implementazione di un gioco multiplayer vero e proprio, dotato di un’ architettura distribuita di supporto. L’esecuzione prevede l’osservazione dell’evoluzione dell’intera realtà simulata tramite settaggio di parametri di input e conseguente generazione di files di output. Gli scopi principali del simulatore sono la valutazione di scalabilità e workload, oltre alla valutazione del comportamento di nuovi meccanismi da noi ideati e sperimentati, come il Tile SubMap Control, Object Locking, CVMap ed altri che saranno presentati in seguito. 1.1 - PUNTI FOCALI Il Virtual World dinamico da noi implementato è costituito da diversi Servers, ognuno mantenente una propria partizione. Una volta attivi nella rete simulata, si inseriscono dinamicamente andando ad “agganciarsi” ai Servers già presenti, in maniera toroidale creando ed espandendo gradualmente un mondo virtuale illimitato. Il Simulatore prevede inoltre che i Servers entranti, prima dell’attivazione nella rete, accedano a un vero e proprio database simulato di generazione Environment (con codice parzialmente condiviso) chiamato EnGen (vedere capitolo EnGen). 1) Alcuni protocolli ed alcuni dettagli implementativi sono stati adattati alle necessità della particolare istanza di gioco simulato e soprattutto ai limiti fisici del calcolatore. 2) Le entità simulate ( Clients e Servers ) evolvono il proprio stato (variabili locali) tramite Message-Passing. Il Message-Passing non è simulato in modo astratto, ci sono veri e propri messaggi dotati di diversi tags, che vengono trasferiti in quantità massive da una coda all’altra e vengono renderizzati o interpretati nella realtà simulata in modo diverso a seconda della coda (o buffer o canale) e dell’entità in cui essi si trovano. Per semplicità, la struttura del messaggio simulato è unica in tutta la realtà simulata ed è quindi dotata di Multi-Purpose Tags. 3) Perché usare più Servers e non un’architettura pienamente centralizzata? Perché non usare il fully peer to peer? Lo scopo di questa architettura simulata è proprio quello di distribuire il carico di lavoro (workload) tra i Servers presenti nel Virtual World. La struttura ibrida tra centralizzata e peer to peer è a tutt’oggi la più scalabile e la più usata per il massive muliplayer gaming: - Cresce il numero di Clients Cresce il workload del (dei) Server(s). Cresce il numero di Servers Diminuisce il workload di ogni Server. 1.2 - VIRTUAL WORLD PARTITIONING Gli approcci di Partitioning del VW al Massive Multiplayer Gaming sono principalmente 3 : - Spatial Partitioning Temporal Partitioning Functional Partitioning L’approccio da noi seguito è lo Spatial Partitioning : ogni server gestisce una partizione ben precisa del VW e soprattutto totalmente indipendente. Dal documento “A Scalable Architecture for Supporting Interactive Games on the Internet” (Wentong CAI, Percival XAVIER, Stephen J. TURNER, Bu-Sung LEE) : “Spatial Partitioning : This is based on partitioning the virtual world into areas that can be processed in parallel and independently. Therefore, the players in the same part of the Virtual World can interact with each other through the same server.” 1.3 - IL SIMULATORE SU LIVELLI Il simulatore MMG-Sim è sviluppato concettualmente su più livelli : Realtà simulata - LIVELLO 0 : (entità simulata) Client - LIVELLO 1 : (entità simulata) Server - LIVELLO 2 : Rete di comunicazione inter-Server (ISC) Mondo Reale - LIVELLO 3 : Simulatore - LIVELLO 4 : Utente Alcuni di questi livelli comunicano tra loro, come i clients, i servers e ISC, così come il simulatore e l’utente stesso (sono disponibili diversi eventi esogeni e periodici di input, con i quali inizializzare la simulazione). E’ bene notare però che il simulatore vero e proprio si preoccupa unicamente di gestire e simulare la concorrenza degli eventi generali e la tempistica - il quando - ma ha poco contatto o comunque in maniera parziale con cosa sta accadendo nella realtà simulata. Le entità simulate inoltre – clients e servers - non hanno concezione del tempo. Dato il livello di dettaglio raggiunto della realtà simulata, il simulatore MMG-Sim dà la possibilità di un’ulteriore interfaccia extra dei livelli - non standard : Realtà simulata - LIVELLO 0 : (entità simulata) Client / UTENTE - LIVELLO 1 : (entità simulata) Server - LIVELLO 2 : Rete di comunicazione inter-Server (ISC) Mondo Reale - LIVELLO 3 : Simulatore - LIVELLO 4 : ( Utente ? ) Questo significa che si dà la possibilità all’utente di essere lui stesso un’entità simulata (client) all’interno della simulazione e interagire in modo diretto con i livelli superiori. Questa modalità permette di avere un feedback diretto su ritardi, migrazioni, ecc… ma è (stata) utilissima soprattutto a scopi di debug e testing dell’architettura simulata con presenza umana. Più in dettaglio, tramite l’ascolto da tastiera da parte della window, l’utente interagisce direttamente con un determinato Avatar selezionato (quindi non soggetto a movimenti A.I.) : Evento Key-Press nella Window Generazione Evento Sim. CLIENTSENDMSG Creazione del messaggio simulato da parte del Simulatore messaggio accodato nel buffer di uscita client e spedizione nella realtà simulata. Ovviamente a scopi statistici se ne sconsiglia l’uso, dato che l’utente “falsa” i risultati direttamente dall’interno della realtà simulata. 1.4 - IL GIOCO SIMULATO Il semplice gioco implementato rappresenta un mondo virtuale generato da più servers, che diversi Avatars (rappresentazioni virtuali dei clients) esplorano tramite movimenti, cercando di raccogliere vari items che incrementeranno il proprio scoring. CLIENT 2.1 - INTRO Il client è sicuramente l’entità principale della realtà simulata dopo il Server. Quest’ultimo non avrebbe nulla da processare senza le interazioni e i messaggi inviati dal client, rimanendo così inutilizzato (IDLE) nella rete di servers simulata. STRUTTURA GENERALE La struttura Client nel nostro simulatore è particolarmente “leggera”, contiene delle variabili locali come l’ID (indirizzo di rete), il server a cui è connesso (se lo è), il FrontEnd ID ed infine variabili di gioco (gamestatus) che verranno modificate tramite messaggi di Update da parte del Server (Es: current position, score, ecc…). Ogni Client è dotato di un buffer di ingresso per gli Updates, una coda di uscita, più 2 buffers di ingresso Environment (canali INV ed ENV). I buffers di entrata, ricevono quasi costantemente messaggi che sono inviati dal server. Ogni messaggio di tipo environment, viene singolarmente renderizzato tramite una semplice trasformazione di coordinate relativa alla posizione corrente del client, mentre vengono interpretati in altro modo i messaggi di tipo Update. 2.2 - INTERAZIONI con Server Update Protocollo Conservativo Nel nostro caso, il client interagisce con l’ambiente creato dal Server tramite movimenti. I movimenti sono spediti verso il Server in forma vettoriale (Es: (-1,0) è uno spostamento a sinistra, (1,0) è uno spostamento a destra). Una volta giunto il messaggio al Server, questo aggiornerà, in caso di movimento possibile, la propria Position Table con la nuova posizione dell’avatar in questione, rispondendo al client con le nuove coordinate assolute (non vettoriali). A questo punto il client aggiornerà le sue variabili di posizione e attiverà lo shift di visuale. La presenza di una coda di uscita client Q-Out, che simula il canale di comunicazione verso il Server, fa sì che venga preservato implicitamente l’ordinamento temporale locale delle interazioni generate. Messaggi generati da clients diversi invece, giungono al Server a seconda del ritardo corrente del client, quindi maggior ritardo significa più probabilità che il messaggio sia valutato e processato nella coda di ingresso Server dopo altri clients con meno ritardo. Il client, nel protocollo implementato, non invia updates di posizione ad una data frequenza, ma comunica con il server soltanto in caso di interazioni - che in qualche modo potrebbero modificare lo stato della mappa (e i movimenti lo fanno). E’ presente inoltre, l’unica applicazione Client-side (poco usata e sperimentata) che se attivata, in caso di coda di uscita (Q-Out) piena, “fonderà” i messaggi di movimento più vecchi: Es: (-1,0) e (-1,0) (-2,0) (-1,0) e (1,0) (0,0) cancellazione (movimento nullo) Questo per non permetterne la perdita, per quanto possibile. Per l’idea ci siamo ispirati proprio al merging dei movimenti (eventi) generati dal mouse. Future Espansioni: Decompressione del movimento Server-side in più messaggi / Algoritmi di calcolo movimenti intermedi tra i 2 punti A e B. 2.3 - (Mnemonic) CLIENT VISUAL MAP – CV-Map La visuale mnemonica del client è sicuramente la sua struttura più importante, è ciò che vede il client entro un determinato raggio ma non sempre contiene uno stato consistente (a differenza della mappa del Server). Quello che abbiamo “ideato” è una visuale cui il meccanismo ricorda molto la memoria cache (da qui mnemonic), grazie ad un sistema di shift secondo un certo vettore spostamento <dx,dy> che “conserva” i dati (gli oggetti) già scaricati di recente. Accade quindi che una nuova porzione (di cui il client non sa nulla) viene scoperta e che una viene persa. Il client richiederà solamente questa nuova porzione al Server (nel simulatore chiamata Update Region), riducendo al minimo indispensabile l’informazione richiesta e quindi il traffico locale. Statistiche alla mano, con un ambiente di complessità media, si parla in media di circa 5/6 oggetti ENV e circa 2 oggetti INV ricevuti per movimento (ERANGE = 4, IRANGE = 2). Considerando in questo caso una visuale di [(ERANGE*2)+1]2 oggetti = 9 x 9 = 81, il rapporto sembra buono. Questo nel caso in cui il TILESIZE = 1, per TILESIZE maggiori, il meccanismo è un po’ più complesso e si fa uso di ulteriore “memoria visiva”. Il raggio di Environment interattivo è stato chiamato IRANGE e quello di Environment ERANGE. Nell’immagine sopra, il client è sottoscritto ad ambedue i canali INV ed ENV (celeste) e solo ENV (blu). Oltre ai propri movimenti e le Update Regions scaricate, il client grazie alle sottoscrizioni, riceverà anche eventuali modifiche dell’ambiente generate da altri avatar o movimenti di avatar stessi. Si registrano ovvi picchi nei canali Environment ad ogni LOGIN di un client, poiché appena entrato, ha necessariamente bisogno di richiedere tutta la V-Map. La mappa del client in ogni caso, come è stato detto, non si limita al raggio di Environment, ma è più capiente. Nell’immagine, l’avatar blu è sottoscritto nell’area chiara ad entrambi i canali (per questo vede tutti i movimenti dell’avatar verde fino a che non ne uscirà), nell’area meno chiara solamente all’Environment (ENV) e nell’area scura non è sottoscritto a nulla (no longer relevant) ma contiene oggetti per via dello shift sopra citato e rappresenta la Memoria Visiva di un Client, ovvero ciò che ha visto e che appartiene al passato (non è quindi un’area consistente e aggiornata). Per l’utilità esatta di quest’ area additiva, vedere Tiles nel documento ServerMap. I risultati di questi meccanismi, combinati all’uso dei Lock (vedere ServerMap), risultano in una riduzione estrema dei messaggi necessari alla renderizzazione dell’ambiente, con guadagni enormi sul traffico dei canali locali della partizione e workload dei canali Environment. 2.4 - EFFETTO GHOST Il Ghost Effect è un classico esempio di inconsistenza sulla visuale del client: si tratta della duplicazione di un avatar nel campo visivo del client, pur essendo in un’altra posizione anche molto distante, creando un “ghost” o avatar del tutto inesistente. I motivi sono principalmente questi (nel nostro simulatore): - Congestione canali Environment : vengono molto ritardati o addirittura persi i messaggi di cancellazione della posizione precedente dell’avatar). Perdita del messaggio da parte della rete stessa. Alcuni casi durante migrazione da una partizione all’altra. In casi di altissimo workload dei canali Environment, può verificarsi che i ghosts siano più di uno con “effetto scia” da parte degli avatars nemici. Nel simulatore cambiando alcuni parametri non è difficile ottenere questo effetto. 2.5 - INTERAZIONI con DEAD SERVER RESPONSE PROTOCOL (DSRP) Protocollo Ottimistico Questo protocollo non standard del simulatore, può essere attivato tramite i file di input. Si tratta di una tecnica ideata per questo tipo di gioco (in realtà implementata solo in parte nei giochi reali e solo in determinate situazioni) e se usata nel modo giusto può dare – entro certi limiti - l’impressionante sensazione al client di NON avere ritardo. Rispolverando il protocollo classico (pessimistico) del server implementato nel simulatore, si prevede che il client debba aspettare il ritorno del messaggio di Movement Update prima di aggiornare la propria posizione e attuare lo shift della propria visuale. Con il DSRP invece, il client si muove in ogni caso localmente, aggiornando la nuova posizione e compiendo lo shift, PRIMA che il messaggio di movimento sia arrivato effettivamente al Server. Nel caso in cui la posizione richiesta era libera o comunque possibile non c’è problema, ma cosa succede se così non è? Si era pensato di implementare un’applicazione client-side che riconoscesse localmente che il movimento non è fattibile (come in moltissimi giochi in rete – Unreal Tournament) ma nel nostro caso c’è un margine di errore per quanto riguarda la visuale del client (qualche messaggio environment che non è stato renderizzato o è stato perso) che non è quindi del tutto attendibile. Potrebbe quindi succedere che non sia presente (unrenderized) un oggetto solido a diretto contatto sulla visuale client, ma che in realtà è presente sul server il client ha il “permesso locale” di muoversi, ma sulla ServerMap è rimasto fermo fuori sincronizzazione. Quindi l’idea è che il client si muova sempre e comunque, ma con la differenza che quando il movimento è arrivato al Server, se questo non era possibile, il Server spedisce un messaggio di rollback Move, ovvero un movimento al contrario rispetto alla richiesta del client che lo farà tornare nella giusta posizione e nello stato consistente. Se il gioco fosse stato più complesso, con interazioni non passibili di rollback, questo non sarebbe stato possibile, ma poiché il nostro gioco consiste principalmente in semplici movimenti, non sono pervenuti problemi di questo tipo. Visivamente parlando accade che il player sembra entrare per un attimo dentro un oggetto solido per poi uscirne, creando uno strano effetto elastico. La durata di questo effetto dipende dal ritardo del Server. Ci sono però alcuni svantaggi e problemi: - Molti più Ghost-Effects ma diversi : nel protocollo pessimistico erano “dead” (del tutto immobili e inesistenti) con il DSRP si presenta in addizione un ghost “vivo”, che rispecchia cosa sta realmente accadendo sulla mappa del Server (sarebbe possibile eliminarlo localmente). Si creano leggere inconsistenze tra clients nel caso si “vedano”. Si possono creare anomalie durante una migrazione. Funziona solo se il client si muove con una relativamente bassa-media velocità, per dare il tempo all’Update Region di giungere al client (che non vedrà quindi immediatamente). Nei casi di estrema velocità, l’avatar può “sfondare” un certo orizzonte (precisamente quando il Delta di inconsistenza “geometrica” tra visuale server e visuale client è superiore al raggio di ENV) e non avere ancora a disposizione gli oggetti solidi di immediata vicinanza, con probabile overhead di messaggi di rollback move in cascata. Questo protocollo non default, è stato affiancato come “extra” a quello pessimistico a scopi di testing di protocolli ottimistici. 2.6 - AVATAR ARTIFICIAL INTELLIGENCE Nel simulatore è presente un modulo in C (MMGAI) che tramite semplici funzioni, governa la AI degli avatars. Nei vari risultati, dalle migrazioni, ai Tile-cross, fino al workload del server, si nota come i movimenti (o interazioni) di un client, abbiano un loro peso. Ad esempio, quando un client si muove verso un oggetto solido o comunque invalicabile (walls, altri avatars), la sua interazione (protocollo classico) verrà semplicemente scartata dal server. In ogni caso però, il messaggio è giunto nella coda di processo ed è stato valutato. Ora immaginando una grande quantità di questi messaggi, il risultato è che solo poche interazioni hanno effettivamente generato un cambiamento nella mappa del Server, con un carico di lavoro abbastanza pesante ed inutile. Nella realtà, un Avatar governato da un’ intelligenza umana eviterà ovviamente di muoversi verso un muro. Per questo alcuni input del simulatore danno la possibilità di settare valori quali ad esempio la percentuale di SolidObjectsAvoidance (capacità di evitare collisioni con oggetti solidi) e collectScoreObjects (capacità di dirigersi verso score-objects), permettendo di incrementare o diminuire “l’intelligenza” dei clients simulati. SERVER 3.1 - INTRO Il Server è sicuramente l’entità simulata principale nel nostro simulatore ed anche quella più complessa in assoluto. Oltre a gestire diverse attività, ha il compito di mantenere aggiornata la partizione, alla quale tutti i clients connessi si devono attenere. Il Server simulato è diviso virtualmente in più moduli: - FrontEnd Module ServerMap Module Data Distribution Module BackEnd Module Di questi moduli che compongono la struttura globale del Server, due di essi sono “passivi” e forniscono servizio implicito e non diretto: la ServerMap e il FrontEnd, mentre gli altri due sono considerati “attivi”, cioè elaborano messaggi . 3.2 - FRONT END MODULE Il modulo FrontEnd si occupa di gestire e mantenere informazioni sulle connessioni con i clients. I messaggi entranti vengono direttamente inviati alla coda principale di processo del BackEnd, mentre quelli uscenti provenienti dal modulo di DataDistribution - ai clients. Inoltre ha l’importante compito di aggiornare il Forced Delay per sincronizzare l’invio dei messaggi in uscita. FRONT-END MODULE LOCAL SYNCHRONIZATION (Forced Delay) Considerando il fatto che i clients presenti in una partizione possono avere ritardi diversi, se il modulo DataDistribution locale ( Unicast degli updates e Multicast environment ) distribuisse senza sincronizzazione i messaggi, porterebbe i clients connessi a stati tra loro inconsistenti, nel caso in cui più avatars siano presenti nella stessa area. Per evitare questo, nel modulo FrontEnd del Server, è presente una variabile, aggiornata al momento opportuno, che mantiene il ritardo massimo tra i clients presenti nella partizione. Grazie a questa variabile, il FrontEnd sincronizza tutto il pacchetto corrente di messaggi (sia Updates che Environment) su quel ritardo, consentendone la ricezione simultanea da parte dell’intera partizione. Ovviamente questo meccanismo implica una grossa influenza da parte del client con più ritardo (come in molti giochi multiplayer esistenti). 3.3 - SERVER MAP MODULE ScreenShot di una partizione del Virtual World. 3.3.1 - GENERALE La mappa del Server, insieme al modulo BackEnd è forse la struttura più importante della nostra realtà simulata. In qualunque momento conserva uno stato consistente di tutto ciò che sta accadendo nella partizione, ed è la realtà locale alla quale tutti i clients si devono attenere. Grazie alla creazione di sotto-strutture come i TileControl, tutte le sottoscrizioni e intersezioni di ranges degli avatars sono ad accesso diretto da parte del Server, quindi 0 algoritmi di calcolo intersezioni Server-Side, 0 Channel-Tables, ecc... Il tutto al costo di una struttura abbastanza “pesante” della mappa, ma alleggerita dall’uso delle CbitList (liste di sottoscrizioni client in bits) e merge dei TileControl. Inoltre non sembrerebbe molto complessa un’ulteriore implementazione di sottoscrizioni di uno stesso Avatar a più aree diverse dislocate sulla mappa (caso del pluripremiato gioco multiplayer di strategia Age Of Empires II). 3.3.2 - STRUTTURA MapCell : Unità atomica della mappa, può contenere un singolo oggetto (campo obj). L’intera mappa del Server (partizione) è un array[X][Y] di mapcell. La struttura MapCell contiene: - Status - Obj - Tile SubMap Control (puntatore a) Status : Stato (byte) della MapCell, contenente diversi flags: - BIT Lock BIT Position Preserve (unused) BIT Published (usato solo per rappresentazione grafica) Obj : L’oggetto (signed byte) contenuto nella MapCell. Sono definiti nel modulo MMGwod e sono virtualmente divisi in “Dynamic” (avatars), “Semi-Static” e “Static” (oggetti che non subiranno modifiche nel tempo - quelli soggetti a Lock). 3.3.3 - Tile SubMap Control (TC) Il Tile SubMap Control o TC è una struttua di nostra ideazione che contiene liste di sottoscrizioni per ogni canale (nel simulatore sono ENV e INV). A livello di codice è stato ottimizzato al limite, usando tipi di dato interpretati come liste di bits. Es: CBITLIST = unsigned int = 32 bits = 32 Clients supportati, dove il bit i-esimo rappresenta lo stato di sottoscrizione al canale (ON, OFF) del player i-esimo, con <i> che corrisponde all’ ID locale assegnato dal server (il FrontEnd ID di un determinato Client). Es: Se il bit 0 del canale ENV è acceso, significa che il Player locale con FrontEnd ID = 0 è sottoscritto al canale Environment. Ovviamente se anche il bit 0 del canale INV è acceso, Il player in questione è sottoscritto ad ambedue i canali. Il TC è quindi un array[ NUMCHANNELS ] di CBITLIST (NUMCHANNELS = 2). Es: CBITLIST = unsigned short = 16 bits * NUMCHANNELS = 32 bits per tutte le sottoscrizioni locali al Tile (!!). ScreenShots con TILESIZE = 1 e TILESIZE = 2 rispettivamente. Si può notare il “merging” dei TCs nel secondo caso (punte convergenti). L’Area blu rappresenta la zona di sottoscrizione al canale ENV, mentre quella celeste la zona di sottoscrizione ad entrambi i canali (ENV e INV). 3.3.4 - Object Locking Quando un player si muove, in genere si sottoscrive ad una nuova area per un certo canale (nel nostro simulatore la sottoscrizione di un client viene fatta dal Server stesso, considerata implicita nel movimento dell’Avatar) e richiede una porzione di mappa al server (nel simulatore è chiamata Update Region – Vedere Client). Se più richieste di questo tipo sono processate in blocco, e se ci sono intersezioni di ranges tra players, quello che accade è che l’area di intersezione delle varie Update Regions viene pubblicata più volte. Sapendo che il Multicast si occuperà della duplicazione di messaggi, queste pubblicazioni multiple sono uno spreco enorme e potrebbero in qualche caso saturare i canali Environment. Per questo motivo quando il server riceve una richiesta di Update Region, tutti gli oggetti (static) appartenenti a quella regione, diventano “locked” (flag di status della MapCell), ovvero il server NON pubblicherà ulteriori richieste per l’area in questione all’interno del ciclo di message processing. I Lock verranno poi resettati dal modulo di Data Distribution. Considerando una zona con molti avatars vicini (ranges intersecati), caso frequente, gli shared lock sulla ServerMap sono molti e il carico dei canali di Environment per quel gruppo di players, tende ad approssimarsi a quello di un singolo player. Dalle simulazioni effettuate, i Lock danno un ottimo contributo alla diminuzione di messaggi in queste situazioni. ScreenShot : Il simulatore è in pausa nel momento in cui più avatars hanno effettuato una richiesta al Server. I Lock sono evidenziati in bianco. 3.3.5 – Tiles I Tiles sono raggruppamenti di MapCell (nel nostro caso quadrati, ma nulla vieta possibili modifiche con tiles esagonali o con altre forme). Quando il Server inizializza la mappa, un particolare e complesso algoritmo, a seconda del TILESIZE, compie un “merge” dei puntatori a TileControl, portando più MapCell a fare riferimento allo stesso TC. TILESIZE 1x1 e 3x3 rispettivamente. TILESIZE per default è 1, cioè corrisponde alla singola MapCell. Tile Cross : passaggio di un avatar da un tile all’altro. Dalle simulazioni compiute, al Crescere del TILESIZE : VANTAGGI: - Meno richieste di Update Region: solamente quando l’avatar si avvicina al bordo del Tile. - Molti TileControl in meno, quindi minore memoria utilizzata dal Server per il modulo di gestione mappa. - Più intersezioni quindi più Lock. Cresce molto il Lock-Gain, ovvero la percentuale di guadagno sulle pubblicazioni ottenuto con i Lock, in altre parole gli oggetti non ri-pubblicati perché “visivamente” condivisi. SVANTAGGI: - Maggior numero di messaggi inviati per ogni richiesta. L’area pubblicata è più grande, si “aggancia” per estensione ai bordi dei Tiles. Percentuale di utilizzo dei canali di Environment meno costante, imprevedibile, con picchi (dipende fortemente dal tipo di movimento di un avatar). TILESIZE basso significa invece più costanza, più “fluidità” dei canali nel tempo e meno perdite di messaggi. - Aumentare la capienza dei canali per non perdere messaggi. In caso di perdita, può verificarsi l’effetto Ghost nella visuale del client, oltre alle eventuali perdite di oggetti statici. La capienza della Visuale Mnemonica del client (Client V-Map) deve essere incrementata per contenere i Tiles oltre il raggio di ENV (ERANGE). 3.4 - Data Distribution Module & Back End Module 3.4.1 - BACK END MODULE Il modulo BackEnd è il cuore del Server. Ha il compito di processare sia i messaggi nella coda di entrata principale Qin, sia i messaggi provenienti da altri Servers mantenuti in un’altra coda di comunicazione (InterServerCommunication Queue). Si può immaginare il BackEnd a diretto contatto con il modulo ServerMap: tutti i messaggi processati nella coda di entrata locale (interazioni dei clients) modificano direttamente lo stato della partizione (Server Map). Il BackEnd, a causa dell’elevato carico della coda Q-in, valuta e processa i messaggi in blocchi (mantenendone l’ordine sequenziale) in quello che viene chiamato ciclo di message processing. Durante questo ciclo, vengono generati vari messaggi di ritorno che vengono smistati ed inviati nel modulo di DataDistribution : - Messaggi di Update nella coda di uscita server Q-Out. Messaggi di Environment ulteriormente smistati nei 2 canali ENV ed INV: le informazioni contenute in essi sono complementari e rappresentano l’Environment locale pubblicato. 3.4.2 - DATA DISTRIBUTION MODULE Nel modulo DDMod, i messaggi di Update vengono inviati ai clients (tramite FrontEnd) con metodo Unicast, mentre l’ambiente (Environment) diviso in 2 canali ENV ed INV (rispettivamente Environment e Interactive-Environment) con metodo Multicast. Il Data Distribution Management (DDM) interno al modulo, insieme al modulo ServerMap, grazie alle sottoscrizioni, si occuperà poi di decidere il destinatario (Unicast) o i destinatari (Multicast) del messaggio. (Vedere capitolo Data Distribution Management). La struttura flessibile dei canali dà la possibilità in futuro di implementare anche più di 2 canali di tipo Environment. 3.5 - CONCORRENZA DEI MODULI DDMod e BackEnd I 2 moduli DataDistribution e BackEnd lavorano per un certo lasso di tempo in concorrenza. Pur avendo compiti diversi, il Back End si troverà sempre in stato BUSY: CICLO DEL SERVER - Main Process : processo sequenziale delle 2 code di entrata ISC-Queue IN e Q-IN. Il DDMod è in stato IDLE poiché l’intensa attività di processo richiede tutte le risorse del Server Terminata l’attività di processo principale, il modulo di Data Distribution entra in stato BUSY ed inizia le attività di unicast e multicast. In concorrenza, il modulo BackEnd effettua periodicamente ad intervalli regolari, un controllo sulla coda di entrata inter-server ed eventuali invii di messaggi ad altri servers tramite ISC-Queue OUT. Durante l’attività di distribuzione, si potrebbe pensare di ricominciare direttamente il main process, ma si è preferito non farlo, in quanto si rischia di saturare i canali Environment e la Q-out, andando a caricare in maniera eccessiva il modulo di distribuzione. Ovviamente la distribuzione dei carichi di lavoro tra i 2 moduli, dipende dai molti parametri (come il carico previsto, la larghezza di banda settata, la capienza dei canali, ecc…). ScreenShot dello stato di un server. 3.6 - DDM : Data Distribution Management 3.6.1 - SOTTOSCRIZIONI e PUBBLICAZIONI Per come è stata concepita l’intera struttura, le sottoscrizioni vengono effettuate per un certo determinato canale e per una certa area (regione). La sottoscrizione di un’area da parte di un avatar viene effettuata nel nostro caso dal server stesso, che aggiornerà (sposterà) la regione in questione ad ogni movimento del Client. Esempio di sottoscrizione a canali in un gioco reale – Screenshot da Age Of Empires II. Area chiara sottoscritta ad Interactions ed Environment, area scura solo Environment. Nel nostro caso, le sottoscrizioni avvengono in modo diretto sul modulo ServerMap tramite i Tile SubMap Control (vedere ServerMap), non esistono “Extent Tables” a livello server, né tantomeno algoritmi server-side per calcolo intersezioni ed altro. Ovviamente si paga in termini di memoria del server, dato che il ServerMap Module occupa oltre il 90% dell’intera struttura Server, il tutto è stato però ottimizzato usando liste di sottoscrizione con operazioni bit a bit e tecniche di TileControl merging (vedere ServerMap). Da questa struttura “pesante” della mappa del Server, che oltre a mantenere lo stato consistente quindi, gestisce anche una sotto-griglia di Tile Control e sottoscrizioni, il modulo di Data Distribution risulta di una semplicità estrema. 3.6.2 - DDM LOCALE Il nostro DDM agisce con 2 metodi (Unicast e Multicast) : UNICAST Riguarda i messaggi di Update, Accounting, Scoring e tutto ciò che interessa il singolo client per aggiornare le proprie variabili locali. Il modulo di distribuzione, a seconda del tag ID (indirizzo di rete simulato del client) contenuto nel messaggio, deciderà il singolo destinatario effettuando la spedizione tramite FrontEnd. MULTICAST Riguarda la spedizione di messaggi Environment generati dal modulo di BackEnd del Server smistati sui 2 canali. Proprio in questa fase intervengono i Tile SubMap Controls: per ogni singolo messaggio, grazie a velocissime operazioni bit a bit, il modulo di distribuzione andrà a controllare lo stato di sottoscrizione (ON/OFF) per il determinato canale - date le coordinate relative alla mappa locale contenute nel messaggio – e di conseguenza spedirà i messaggi a tutti quelli che sono sottoscritti per quella determinata posizione <x,y> (vedere TileControl). 3.6.3 - DDM INTER-SERVER e Comunicazioni Per quanto riguarda la distribuzione dei messaggi inter-server, ogni messaggio in attesa di invio nella coda di uscita ISC-Out contiene all’interno 2 tags, corrispondenti al server di origine ed al server di destinazione. Se un server ha l’intenzione di spedire a tutti gli altri servers del Virtual World un messaggio di tipo pubblico, il campo di destinazione di tale messaggio conterrà la costante TOALL, sarà poi l’infrastruttura ISC ad occuparsi dello smistamento molteplice del messaggio. Un esempio è l’entrata (attivazione) di un nuovo Server nel Virtual World, evento che interessa tutti i restanti servers (se ce ne sono). 1) Il Server entrante spedisce nella rete ISC un messaggio pubblico che informa i server già presenti della nuova attivazione. 2) I Servers riceventi, già presenti nella rete, risponderanno al server di origine con un messaggio di Acknowledge. 3) Ricevuto il messaggio, il Server invocherà la routine di serverLink fornita dalla rete e si aggancerà in modo del tutto dinamico, espandendo il virtual world. Nota: Durante questa fase, il server è in stato di linking, ma in teoria nulla vieta che un client richieda in questo momento una migrazione. Nel caso, il server si troverà costretto a negare il protocollo, dato che non è ancora “inglobato” nel Virtual World. Si userà invece l’altro metodo proprio per una migrazione, poiché l’evento in questione interesserà solamente i 2 servers coinvolti nel protocollo di Ownership Switch di un avatar (vedere capitolo migrazioni). I Server già collegati, hanno inoltre un meccanismo interno, con il quale durante il processo di BackEnd, si “accorgono” – a seconda di una tolleranza settata - di avere un alto workload nel FrontEnd (alto numero di connessioni) ed inviano una query pubblica nella rete per tentare di attivare nuovi servers – magari in stato IDLE, inutilizzati fino ad ora – che verranno in questo modo “risvegliati” - questo perché ogni server appena attivato, è in stato di attesa (WAIT) per connessioni client o messaggi provenienti da altri servers. Varie simulazioni dimostrano infatti che grazie alla struttura toroidale del Virtual World, i clients tendono a distribuirsi tra i servers attivi. Nel nostra realtà simulata, nell’architettura distribuita da noi concepita, i server non sono sincronizzati tra loro. Secondo il nostro tipo di partitioning del VirtualWorld infatti, vengono create partizioni totalmente indipendenti che lavorano in parallelo, non essendoci aree di overlap (condivise), non è necessario spedire messaggi atti a sincronizzazione ed “aspettare” altri Servers. Nel nostro caso quindi, tutti i Servers lavorano al massimo delle loro potenzialità. Lo scopo della nostra architettura infatti è proprio quello di permettere inserimenti dinamici di nuovi Server senza ostacolare o rallentare gli altri già presenti nel mondo virtuale e ridurre al minimo indispensabile le comunicazioni inter-server. Questo sistema permette una modularità del Virtual World praticamente illimitata. MIGRAZIONI 4.1 - Migrazioni : Ownership Switch L’architettura client-server che sta alla base del mondo virtuale che siamo andati a simulare implica un problema di non trascurabile importanza: la scarsa scalabilità di questa architettura con un server centralizzato. Per quanto potente possa essere la macchina su cui risiede, esiste sempre un limite finito al numero delle connessioni che essa è in grado di gestire, rendendo complesso l’allargamento del sistema a reti su scala mondiale quali Internet. Esistono vari modi per aggirare questo problema. Quella che abbiamo scelto di utilizzare nel nostro progetto prevede che i server siano molteplici e si dividano tra loro i client in modo tale che quelli che devono interagire più frequentemente tra di loro si servano del medesimo. Il virtual world è stato quindi suddiviso in partizioni indipendenti ognuna delle quali gestita da un server. Si riducono così al minimo le comunicazioni tra un server e l’altro. Un esempio è il caso in cui i client mediante dei movimenti nella mappa accedano in una zona (partizione) gestita da un altro server in quella che si definisce MIGRAZIONE o Avatar Ownership Switch. Le conseguenze di tale evento sono molteplici e coinvolgono naturalmente la rete di comunicazione fra i server. Questa è stata chiamata ISC - Net, che sta per Inter Server Communications. A differerenza delle comunicazioni tra client e server questa volta lo scambio di messaggi e quindi di informazioni avviene in modalità peer-to-peer. In questo schema tutte le macchine condividono la connessione di rete ‘alla pari’ (da cui il nome dello schema). Questo significa che non è prevista una macchina che funga da nodo centrale per la memorizzazione dei dati che devono essere condivisi, ma le informazioni sullo stato condiviso sono ‘distribuite’ con modalità varie su tutti i server presenti in rete. La ragione per cui si adotta uno schema di questo genere è che garantisce scalabilità illimitata al sistema, non richiedendo di doversi appoggiare a nodi centrali. Inoltre, in questo modo il sistema è più resistente ai guasti di rete, poiché la caduta di un server non pregiudica il funzionamento dell’intero sistema. ISC – Inter Server Communications Net È il mezzo ideato nel nostro simulatore tramite il quale i servers comunicano tra loro. Virtualmente servirebbe per ogni tipo di comunicazione tra servers. Nel nostro caso è utilizzato per lo scambio di messaggi fra servers nel caso di migrazioni e ad ogni attivazione di un nuovo server quando tutti quelli presenti nel virtual world si scambiano messaggi per localizzare la loro posizione e “linkarsi” fra loro (stabilire per ognuno, quale sia il server di destra, quello di sinistra, sopra e sotto). Per come è implementata la rete è comunque possibile utilizzarla per l’invio di qualsiasi altro messaggio. L’ISC, infatti, non ha una sua struttura indipendente, a livello di codice, ma è implementato all’interno di ogni server con una coda in uscita ed una in entrata. Questo implica che ogni server conosca gli IDs (indirizzi) dei servers che sono direttamente adiacenti e quindi comunicanti con esso. Per permettere ciò indipendentemente dal numero di servers e dalla loro distribuzione sull’ intera mappa generale è stato utilizzato l’algoritmo raffigurato nella seguente figura che viene invocato, come già detto, ad ogni attivazione di un nuovo server: 4.2- PROTOCOLLO DI MIGRAZIONE AVATAR L’immagine mostra l’intero protocollo di trasferimento Avatar nei 2 casi: - Giunge un’interazione di movimento da parte di un client uscente dalla partizione. - Il server di origine genera il messaggio di Location Request (LocReq) e lo invia al server adiacente (a seconda del lato). - Il server di destinazione valuta la richiesta con i dovuti ritardi (il BackEnd potrebbe essere impegnato nel processo locale o altre attività). Nel caso in cui la posizione richiesta sia disponibile, il server pone un’immagine virtuale invalicabile dell’avatar nella mapcell in questione e gli garantisce uno slot libero sul FrontEnd. Una volta fatto ciò, invia il messaggio di OK (LocReqOK) al server origine e spedisce il messaggio di ITM_SWITCH al client tramite l’indirizzo di rete contenuto nel messaggio. - In caso di successo, il server origine, tramite migration table, che ha memorizzato il vecchio ID locale (FrontEnd ID), elimina l’avatar, slot sul FrontEnd e le dovute sottoscrizioni. 4.3 - PROCEDURA DI UNA MIGRAZIONE IN DETTAGLIO Nel caso in cui un avatar tenti di accedere ad una posizione che è al di fuori della partizione gestita dal server a cui è attualmente connesso… …questo se ne accorge tramite un semplice controllo sulla x e sulla y della destinazione del movimento. Quindi manda una richiesta di locazione LOCATION REQUEST al server che gestisce la partizione adiacente specificando le coordinate di ingresso e aggiorna la Migration-Table aggiungendo l’ID del client e negando a quest’ultimo qualsiasi tipo di movimento durante la migrazione A questo punto il secondo server verifica che la migrazione sia effettivamente attuabile e si comporta di conseguenza: 1_CASO: la posizione (x,y) è già occupata da un oggetto statico o da un avatar -> in questo caso viene inviata esclusivamente una Request Location Denial al primo Server, il quale toglie l’ID del client dalla Migration-Table permettendogli di continuare a “giocare” senza naturalmente dare la conferma del suo spostamento. 2_CASO: posizione (x,y) è libera o occupata da un semi static-object (gemma, oro)-> in questo caso il secondo server invia una request location ok al primo server per avvertirlo dell’avvenuta migrazione e avviando così il processo di disconnessione (relativa al precedente server). Il secondo server inoltre invia un messaggio (ITM-SWITCH) per informare il client stesso della necessità di cambiare server. Questo quindi si sottoscriverà alla nuova area e scaricherà gli oggetti di questa zona per cominciare a visualizzare sulla propria mappa “la nuova realtà”. 4.4 - Migration-Table La migration table ha un’importanza rilevante nelle nostre migrazioni. Un array collocato su ciascun server che tiene memoria dei client che sono in migrazione (migranti) da una specifica partizione. Così i client che tentino di muoversi quando il loro ID è contenuto nella migration table non potranno farlo. Inoltre è necessaria al server di origine per mantenere in memoria il vecchio FID (id locale) che userà per cancellare la vecchia posizione in caso di migrazione successful. Tutto questo avverrà nel caso in cui la LOCATION REQUEST sia ancora in viaggio fra il “vecchio” e il “nuovo” server, e non è ancora certo l’esito della migrazione. EnGen VIRTUAL WORLD ENVIRONMENT GENERATOR Poiché la complessità dell’ Environment ha un forte peso sulle statistiche, dalla quantità di messaggi necessari alla renderizzazione client-side alle migrazioni e molto altro, il Simulatore MMG ne fornisce un generatore di nostra creazione (File ENGEN.txt) che permette una completa e illimitata parametrizzazione dell’ambiente. Ogni Server quando entra nel Virtual World, dopo aver allocato la sotto-struttura dei Tile SubMap Control, prima di attivarsi e rendersi disponibile a connessioni, genera la mappa vera e propria. Il cosa genera e il come, vengono appunto definiti in EnGen. Si può pensare a questo file come un database simulato al quale accedono i servers : ogni oggetto in EnGen ha un codice di generazione e un SID (Server ID) ovvero il Server che ne farà uso. Più nel particolare, il file è una lista di Object Generation Code aventi questa struttura : <SID> <object> <clumps><iterations_per_clump> <Horizontal per.><Vertical per.> <object> : E’ l’oggetto da creare (signed byte – definiti in MMGwod). <clumps> : Il numero di gruppi creati per il suddetto oggetto. <iterations_per_clump> : A partire dal punto in cui è stato creato il gruppo, per quante volte viene iterato l’oggetto (replicato). <Horizontal Percentage> : La percentuale con cui l’iterazione viene effettuata sull’asse X. <Vertical Percentage> : La percentuale con cui l’iterazione viene effettuata sull’asse Y. <SID> : E’ il Server che userà quel codice di generazione. Se il SID = 0, la generazione dell’oggetto viene condivisa (shared) tra tutti i Servers. Quindi quando un server genererà la mappa, accederà in EnGen a tutti gli object generation codes con il proprio ID più tutti quelli condivisi. Ricordiamo in ogni caso che la creazione degli oggetti rispetta un ordine sequenziale. NOTA : Una troppo elevata complessità può portare nel caso limite in crash il Server quando riceverà il messaggio di LOGIN da parte del client, non riuscendo a trovare una posizione libera sulla mappa sulla quale posizionare l’avatar. Esempio Iterazioni : BLUEWALLS con Vertical Per. = 0 e Horizontal Per. = 70. WALLS con Vertical Per. = 70 e Horizontal Per. = 0. Esempio con iterazione per clump = 0 e = 10 rispettivamente. Ovviamente, il Server a seconda della grandezza della partizione, scalerà i clumps e le iterazioni secondo la seguente formula: S = (SX*SY) / (STDSX*STDSY) S = S – [(S-1)*p] SX,SY : Size della partizione. STDSX,STDSY : Size standard della partizione. P : Percentuale di “forza” della scala. SIMULATORE 6.1 - EVENT LIST PRINCIPALE L’Event List del simulatore (EVL) ovviamente si occupa del susseguirsi degli eventi generali e simularne la concorrenza. A livello implementativo, abbiamo preferito usare una lista dinamica ordinata piuttosto che il classico array (ogni indice rappresenta un evento diverso), perché sarebbe dovuto essere a 2 dimensioni (causa ID dell’entità che genera l’evento), quindi ricerca del minimo (prossimo) evento = Complessità n2. Con la lista dinamica l’inserimento ( newsimevent() ) di un evento è di complessità lineare e la selezione del prossimo evento è immediata (primo della lista). Come già detto, è possibile inizializzare la lista con eventi di inizializzazione, con qualunque tempo di occorrenza. AVANZAMENTO DEL TEMPO (TimeAdvMode) Sono stati implementati Event Driven e Time Step (quest’ultimo dà la possibilità durante l’esecuzione di aumentare o rallentare il tempo fino a fermarlo – Step = 0.0 ). Naturalmente si può stabilire una finestra di tempo di osservazione simtmwindow per il TimeStep e un numero limite di eventi prefissato per EventDriven, nulla vieta di scambiare i rispettivi limiti. 6.2 - STRUTTURA DI UNA SIMULAZIONE MMG-Sim A livello di codice, una simulazione centralizzata con i moduli MMG avrà la seguente semplice forma: #include "mmgsim.c" /* inizializza vari parametri */ initeventlist(); TimeAdvMode = EVENTDRIVEN; // o TIMESTEP /* Inizializza la lista con degli eventi */ while (simulationnotover){ lastsimtime = simtime; /* keep last simtime */ Timing(); /* Advance simtime */ EventsHandler(); /* Execute event(s) */ /* Aggiorna statistiche */ /* Redraw a video dello stato */ sleep(1); } endall(); // Funzione di terminazione e Report La struttura flessibile della Event List a livello implementativo, permette in un futuro di distribuire la simulazione su più processi e quindi fornendo più Event List. Statistiche di Output e Generatore Numeri Casuali 7.1 - Generatore Numeri Casuali Attraverso il modulo MMGRND.C, vengono fornite al simulatore varie primitive per la generazione di numeri casuali. La funzione principale _rndx() è stata ripresa dal codice della random() presente nella libreria stdlib.h, modificata con l’aggiunta del parametro seme. I numeri generati da _rndx() sono distribuiti uniformemente nell’intervallo degli interi (32 Bits). E’ stato implementato inoltre un generatore congruente - rnd32x() - con coefficiente moltiplicativo _A_ (75) e modulo 2147483647. Tra i due si è scelto quest’ultimo pur essendo di complessità maggiore, poiché la _rndx() dopo alcune generazioni si stabilizzava. Sulla base del generatore casuale su interi, vengono fornite routines per il calcolo di : - Interi casuali discretizzati sull’intervallo 0…n. - Reali casuali nell’ intervallo 0…n, secondo una definita precisione (fit). - Interi definiti in un un intervallo definito da un pivot e un range. - Reali definiti in un un intervallo definito da un pivot e un range. - percentuali usate in condizioni (sia intere che reali). - Condizionamento casuale (TRUE or FALSE – Usato nella A.I.). Ognuna di queste routines, oltre a dei prefissati parametri, prende in pasto anche il seme. Nel simulatore sono presenti i seguenti semi diversi : - General seed = seme generale usato per randomizzare ritardi, varianze, ecc… AI seed = seme per l’Intelligenza Artificiale degli Avatars. EnGen seed = seme usato per la randomizzazione della generazione Environment. Color seed = seme per il random dei colori avatars. 7.2 - Statistiche di Output Ogni simulazione, per essere significativa, deve restituire in output dei valori di tipo statistico. Riguardo al nostro simulatore, oltre ai files di Log, viene generato un unico file di uscita comprendente tutti i dati in uscita. I valori ottenuti, appartengono ad una delle seguenti categorie: - Valori Totali - Valori correnti di certe variabili generali o locali (shot dello stato). - Valori medi monitorati ed aggiornati durante l’intero arco di tempo di osservazione dell’architettura distribuita. Esempio di Valori Totali: TOT migrazioni, richieste di migrazione, oggetti pubblicati, ecc… Esempio di Valori Correnti: clients migranti, FrontEnd current usage, ecc… La precisione ed affidabilità dell’ultimo tipo di valori sono massime nel caso di avanzamento Event-Driven e parziali nel caso di avanzamento Time-Stepped: in questo caso, la precisione dipende molto dal size dello Step e dal grado di densità degli eventi. Immagini : Var è una certa variabile monitorata nei 2 tipi di avanzamento. Valore medio nel tempo = Area (Integrale della funzione) / SimTime. Inoltre vengono generati 3 files di Log: - Log comunicazioni inter-server (ISC.txt) - Log completo e dettagliato realtà simulata (simlog.txt) - Log Event List del simulatore (simEV.txt) 7.3 - STRUTTURA DEL REPORT (MMGstats.txt) MMG SIM STATS REPORT ====================== (#) Input Parameters. (>) Output Parameters. TOT = Total AVG = Average SIMULATION TIME ( v a l o r i d e l t e m p o s i m u l a t o ) … EVENT LIST ( v a l o r i d e l l ’ e v e n t l i s t p r i n c i p a l e ) > MAX Event List len : 66 Events > MAX Event List DT : 5.000000 > TOT Events happened : 167934 GLOBAL COMMUNICATIONS ( s t a t i s t i c h e d i c o m u n i c a z i o n e ) > Overall Messages Lost : 0 = 0.00 Kbytes lost. > TOT interServer Messages Transferred : 841 = 5.75 Kbytes > TOT Local Update Messages sent by Servers : 1011 = 6.91 Kbytes > TOT Local Env. Messages sent by Servers : 14560 = 99.53 Kbytes > TOT Local InteractEnv. Messages sent by Servers : 7770 = 53.12 Kbytes SERVER MAP STATS ( s t a t i s t i c h e g e n e r a l i d e l l e p a r t i z i o n i ) … TILES AND MOVEMENTS ( s t a t i s t i c h e g e n e r a l i Ti l e s e i n t e r a z i o n i ) … LOCAL DDM ( s t a t i s t i c h e D D M l o c a l i d e i s e r v e r s ) … CLIENT STATS ( s t a t i s t i c h e g e n e r a l i c l i e n t s ) … WORKLOAD STATS ( s t a t i s t i c h e m e d i e e c o r r e n t i d i W o r k l o a d ) … > SERVER 1 : … > SERVER 2 : … > SERVER 3 : … > SERVER 4 : … > Ecc… … SERVER MODULES WORKLOAD ( s t a t i s t i c h e m e d i e w o r k l o a d m o d u l i d e i s e r v e r s ) > SERVER 1 : > AVG Data Distribution Module Occupation (Per.): 89.1119 > AVG Back End Module Occupation (Per.) : 11.3151 > AVG Concurrent Occupation (Per.) : 0.4270 > SERVER 2 : … > SERVER 3 : … > SERVER 4 : … > SERVER 5 : … ecc… ENVIRONMENT CHANNELS WORKLOAD ( s t a t i s t i c h e m e d i e w o r k l o a d c a n a l i E n v i r o n m e n t ) > SERVER 1 : > # ENV Channel Size : 100 = 0.68 Kbytes. > # INV Channel Size : 60 = 0.41 Kbytes. > # Process QueueIN Size : 40 = 0.27 Kbytes. > # Update QueueOUT Size : 20 = 0.14 Kbytes. > ENV Channel Peak usage : 28 Messages (28.0000 Percent) > INV Channel Peak usage : 9 Messages (15.0000 Percent) > AVG Environment Channel usage : 0.46 Messages (0.4569 Percent) > AVG InteractEnv Channel usage : 0.18 Messages (0.3032 Percent) > SERVER 2 : … > SERVER 3 : … ecc… AVATAR MIGRATIONS ( s t a t i s t i c h e g e n e r a l i m i g r a z i o n i ) > Clients now Migrating : 0 > TOT Migrations Requests (LocReq) : 271 > TOT Successful Migrations : 255 > TOT Migration Denials : 16 > Successful Migrations Percentage : 94.095941 > Denied Migrations Percentage : 5.904059 DELAYS ( v a l o r i c o r r e n t i r i t a r d i c l i e n t s ) Client 1 current Delay : 0.3500 Client 2 current Delay : 0.5000 Client 3 current Delay : 0.0500 ecc… GAME STATS ( s t a t i s t i c h e d i g a m e s c o r i n g ) 7.4 – Parametri Di fondamentale importanza per una buona riuscita della simulazione e dell’analisi dell’output, è la parametrizzazione; anche per questo motivo, si è scelto durante lo sviluppo del simulatore, di dare la possibilità all’utente finale di settare questa per mezzo di semplici files a riconoscimento di stringhe. In questo modo si può verificare il comportamento dell’architettura simulata e valutare con quali valori è più performante. Per una questione di semplicità, il simulatore fornisce già impostati una serie di parametri che possono essere usati per testare il funzionamento generale. I file di input parametri sono i seguenti: - inputAI.txt → Parametro che gestisce “l’intelligenza artificiale” 1) AiavoidSolidObjsPercentage: con quale percentuale (%), l’avatar andrà ad evitare gli oggetti solidi 2) AicollectScoreObjPercentage: con quale percentuale (%), l’avatar cercherà di accumulare punteggio prediligendo il passaggio su caselle occupate da score_object - inputBW.txt → Settaggio della larghezza di banda - inputdelays.txt → imposta vari ritardi e varianze in input di client, server e rete ISC. - inputGenSim.txt → Tramite questo file è possibile settare diversi parametri generali, alcuni dei quali servono esclusivamente per la visualizazione grafica (Grandezza della finestra variabile a seconda della risulozione dello schermo, attiva o disabilita la simulazione grafica o solo di alcune parti (come Environment e pavimentazione mappe), inizializzazione dei semi. E’ possibile inoltre la scelta dell’avanzamento del tempo Event-Driven, Time-Stepped (con il relativo step se si viene scelta questa modalità o il numero di eventi massimo che devono avvenire perché la simulazione abbia termine. Possibilità di inserire eventi di inizializzazione o esogeni nell’Event List. Inoltre è presente il parametro che attiva la presenza dell’utente nella realtà simulata. - inputMap.txt → L’utilizzo di questo file ci da la possibilità di settare valori di partizione: 1) Border, attiva o disattiva il bordo della partizione ( ovviamente se viene attivato non si darà agli avatars la possibilità di effettuare delle migrazione). 2) PartitionX e PartitionY, permettono di stabilire la grandezza della mappa orizzontale e verticale. 3) Tilesize, stabilisce la grandezza del Tile (vedi specifiche nella parte ServerMap) - inputQueues.txt → tramite questo file si modificano i sizes delle code di Client,Server,Inter-Server - InputServer.txt → Settaggio on/off sull’uso da parte del server dei locks (vedi ServerMap), Carico di processo previsto per Q-in e ISC Q-in, abilita e disabilita il protocollo ottimistico (DSRP) - InputClient.txt → Settaggio dei ranges environment e interaction, abilita e disabilita il merging dei vecchi movimenti, abilita e disabilita la variazione di ritardo del client durante la migrazione. FUNZIONAMENTO DEL SIMULATORE La finestra che viene aperta in esecuzione, visualizzerà a seconda delle schermate, lo svolgersi della simulazione. Le varie schermate, molto user-friendly, rappresentano la faccia grafica che si contrappone in modo costruttivo alla faccia dei dati numerici e Log generati in uscita. Il simulatore in ogni caso ha necessariamente bisogno dei files: - Input---.txt - ENGEN.txt SCHERMATA 1 (tasto F1) – Workload di servers e clients Rappresentazione di un singolo server. ScreenShot Schermata 1 (tasto F1). SCHERMATA 2 (tasto F2) – Visualizzazione partizione corrente SCHERMATA 3 (tasto F3) – Visualizzazione partizione corrente (in dettaglio) SCHERMATA 4 (tasto F4) – Visualizzazione Client-side TASTI GENERALI SHIFT = attiva/disattiva Environment TAB = attiva/disattiva Pavimentazione BACKSPACE = cambia Server SPACE = cambia Client HOME/END = cambia il size grafico RETURN = visualizzazione ON/OFF memoria visiva client corrente in modalità F4. INSERT = visualizza client buffers. PAUSE = Pausa simulazione. MOUSE Tasto Sinistro = Ruota mappa 3D (asse Y) Tasto Destro = Ruota mappa 3D (asse X) Scroll up/down = aumenta, diminuisci step in Time-Stepped NOTE del Simulatore Il simulatore può sopportare anche carichi molto pesanti di calcoli, con un alto numero di clients e servers inizializzati, ma è bene prestare attenzione ai files di Log che raggiungono dimensioni dell’ ordine dei 50 Mbytes ed all’ingente quantità di memoria dinamica che viene allocata dal simulatore. Particolare attenzione inoltre va data in questi casi limite allo Step-Size, nella modalità di avanzamento del tempo TimeStep, che se allargato in maniera eccessiva può portare ad overhead di calcolo e mandare in crash il simulatore. Nel caso in cui la grafica OpenGL dia problemi, disattivarla dal file di ingresso “inputGenSim.txt” Il simulatore MMG-Sim è stato testato su un 1.8 Ghz con 256 Mb di SDRAM e scheda grafica nVidia GeForce4. Bruno Fanini Alessandro Leardi Michele Serra