SlideShare a Scribd company logo
1 of 34
Download to read offline
#TecHeroes loves GameDev Tour
Game Matching with SignalR
Nicolò Carandini [MVP]
n.carandini@outlook.com
@TPCWare
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Agenda
• SignalR
• Comunicare in Real Time
• HTTP & HTLM5 / WebSockets
• ASP.NET SignalR
• Casi d’uso
• Demo
• Game Matching
• Un po’ di teoria
• Demo
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Comunicazione full duplex con HTTP ?
Il protocollo HTTP prevede che il Client faccia una richiesta e il Server dia una
risposta. Il Server non ha modo di mandare un messaggio al Client di sua
iniziativa.
INTERNET
REQUEST
INTERNET
RESPONSE
<HTML> Page
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Comunicazione real time tra clienti
Se voglio comunicare tra vari client, quando il server riceve dati da
un client, deve poter inviare dati agli altri client:
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Possibili soluzioni
Polling
Long Polling
SERVER
CLIENT
tempo
Request
Response
Request
Response
Request
Response
Request
Response
Request
Response
Intervallo di polling Intervallo di polling Intervallo di polling Intervallo di polling
SERVER
CLIENT
tempo
Request
Response
Request
Response
Request
Response
Response
Request
Request
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Controindicazioni?
• Polling:
Se l’intervallo è breve, troppe richieste inutili
Se l’intervallo è lungo, le informazioni arrivano in ritardo
• Long polling:
Il Server deve gestire le richieste in modo asincrono
altrimenti va in saturazione e non accetta altre richieste
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
HTLM5/WebSockets
• Fanno parte delle specifiche di HTML5
• Estendono il protocollo HTTP fornendo il supporto alle raw sockets
• Consentono la comunicazione full-duplex
• Traversano gli HTTP proxies (solo se i proxies sono "moderni"…)
Client Proxy Server / Firewall Origin Server
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Tutto risolto?
Non proprio, perché HTML5/WebSocket è un protocollo di basso livello che
richiede la scrittura di molto codice per implementare le funzionalità richieste da
una applicazione real-time.
Inoltre le condizioni d’uso delle WebSockets sono molto restrittive.
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Condizioni d’uso delle WebSockets
Funzionano quando:
• Il Web Server le supporta
• Il Web browser le supporta
• Il load balancer/reverse proxy le supporta
• Il client proxy server/NAT le supporta
• Tutto ciò che sta tra il client e il server le supporta
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
ASP.NET SignalR
SignalR è la libreria ASP.NET che rende incredibilmente semplice aggiungere
funzionalità Real-Time alle applicazioni web
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Punti di forza
• Implementa, ove possibile, WebSockets.
• Fa il downgrade in modo trasparente alle altre tecniche di polling
• Fornisce una API di alto livello, molto semplice da usare, per fare
RPC tra server e client
• Offre funzionalità di gestione degli eventi di connessione e
sconnessione e la gestione delle autorizzazioni
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Diagramma architetturale di SignalR
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
SignalR API
PersistentConnection
• Implementa le funzionalità minime necessarie
• Consente l’invio e la ricezione di stringhe
• Broadcast a tutti, a gruppi o a singoli utenti
• Connessione, riconnessione e disconnessione
Hub
• Utilizza la PersistentConnection
• Consente l’uso delle RPC da client a server e viceversa
• Genera automaticamente i proxy RPC per i web client (in JavaScript)
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
PersistentConnection Vs. Hub
Nella maggior parte dei casi si usa l’Hub.
La PersistentConnection viene utilizzata nei seguenti casi:
• Si usa un messaggio con formato custom
• Si preferisce lavorare tramite invio di messaggi invece di utilizzare
RPC (remote Procedure Call)
• Occorre fare il porting a SignalR di un’applicazione preesistente che
è basta sull’invio di messaggi e non usa le RPC
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
RPC (Remote Procedure Call)
Si possono chiamare funzioni JavaScript lato client da codice .NET
lato server, e viceversa
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Per fare cosa?
Oltre ai classici scenari di chat, SignalR è perfetto per tutti
quei casi in cui si abbia necessità di update ad alta
frequenza, come nei giochi in real-time o implementare
funzionalità di comunicazione full duplex all’interno di un
applicativo.
Interessante notare che Visual Studio (sin dalla versione
2013) usa SignalR per implementare la funzionalità di
Browser Link.
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Visual Studio Browser Link
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Real Time Game: ShootR
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Demo
ShootR
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Performances
Throughtput
• Un singolo server riesce a gestire da 100.000 a 500.000 messaggi al
secondo.
• Con un’occupazione di memoria estremamente ridotta.
Scalabilità
• Fully async
• Circa 1.000 connessioni per server
• Supporta la scalabilità orizzontale utilizzando un message bus
(Service Bus, Redis, SQL)
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Scalabilità
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Client disponibili
• JavaScript(jQuery)
• .NET 4.x
• Xamarin
• UWP
• iOS
• Android
• Java
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Next version: ASP.NET Core SignalR
• Ancora in fase di sviluppo
• Beta prevista per metà anno, RTM per fine anno
• Tra le tante novità:
• L’indipendenza da jQuery per il client Javascript
• Invio/ricezione anche di binary data
• Supporto di protocolli/formati multipli
• Supporto di clienti WebSocket "puri"
…e tanto altro ancora!
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Next version: ASP.NET Core SignalR
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Riferimenti
ASP.NET SignalR 2.0
http://www.asp.net/signalr
https://github.com/SignalR/SignalR
ASP.NET Core SignalR
https://blog.3d-logic.com/2017/01/15/signalr-core-part-13-design-considerations
https://speakerdeck.com/davidfowl/introducing-asp-dot-net-core-sockets
https://github.com/aspnet/SignalR
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Game Player Use Case diagram
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Match Making Activity diagram
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Match Making Sequence diagram
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Play Turn Activity diagram
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Play Turn Sequence diagram
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Demo
Game Matching
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Game Matching per Unity
• Poiché il game matching è piuttosto oneroso da sviluppare, per chi
sviluppa giochi con Unity può essere (molto) conveniente utilizzare
un servizio a pagamento come Unity Multiplayer:
• Gratuito fino a 20 giocatori contemporaneamente in gioco
• Con pagamento mensile in base al traffico prodotto
• Per una stima dei costi mensili, basta andare sul sito di Unity:
• https://unity3d.com/services/multiplayer
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Demo
Estimate Your Monthly Bill
Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour
Question Time…

More Related Content

What's hot (6)

Gam05 costruisci il tuo antifurto perfetto con kinect e gli azure mobile se...
Gam05   costruisci il tuo antifurto perfetto con kinect e gli azure mobile se...Gam05   costruisci il tuo antifurto perfetto con kinect e gli azure mobile se...
Gam05 costruisci il tuo antifurto perfetto con kinect e gli azure mobile se...
 
ASP.NET performance optimization
ASP.NET performance optimizationASP.NET performance optimization
ASP.NET performance optimization
 
Wasm and Blazor CDays keynote
Wasm and Blazor CDays keynoteWasm and Blazor CDays keynote
Wasm and Blazor CDays keynote
 
Christmas greetings cards with blazor
Christmas greetings cards with blazorChristmas greetings cards with blazor
Christmas greetings cards with blazor
 
Sviluppare Azure Web Apps
Sviluppare Azure Web AppsSviluppare Azure Web Apps
Sviluppare Azure Web Apps
 
Spa with Blazor
Spa with BlazorSpa with Blazor
Spa with Blazor
 

Similar to Game matching with SignalR

Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini
Whymca
 
Il futuro di Windows Phone
Il futuro di Windows PhoneIl futuro di Windows Phone
Il futuro di Windows Phone
Matteo Pagani
 

Similar to Game matching with SignalR (20)

Web in real time con signalR
Web in real time con signalRWeb in real time con signalR
Web in real time con signalR
 
Swagger per tutti
Swagger per tuttiSwagger per tutti
Swagger per tutti
 
Real world Visual Studio Code
Real world Visual Studio CodeReal world Visual Studio Code
Real world Visual Studio Code
 
Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini Sviluppo di servizi REST per Android - Luca Masini
Sviluppo di servizi REST per Android - Luca Masini
 
SVILUPPO DI SERVIZI REST PER ANDROID
SVILUPPO DI SERVIZI REST PER ANDROIDSVILUPPO DI SERVIZI REST PER ANDROID
SVILUPPO DI SERVIZI REST PER ANDROID
 
Da JavaScript a TypeScript
Da JavaScript a TypeScriptDa JavaScript a TypeScript
Da JavaScript a TypeScript
 
Meetup DotNetCode Settembre 2018 - ASP.NET Core 2.1
Meetup DotNetCode Settembre 2018 - ASP.NET Core 2.1Meetup DotNetCode Settembre 2018 - ASP.NET Core 2.1
Meetup DotNetCode Settembre 2018 - ASP.NET Core 2.1
 
Works with ASP.NET Core on Linux and Mac
Works with ASP.NET Core on Linux and MacWorks with ASP.NET Core on Linux and Mac
Works with ASP.NET Core on Linux and Mac
 
Swagger pertutti
Swagger pertuttiSwagger pertutti
Swagger pertutti
 
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
 
Continous Delivery & HQ Code
Continous Delivery & HQ CodeContinous Delivery & HQ Code
Continous Delivery & HQ Code
 
Xamarin Robotics
Xamarin RoboticsXamarin Robotics
Xamarin Robotics
 
SignalR 2.0
SignalR 2.0SignalR 2.0
SignalR 2.0
 
Designing with microservices - Daniele Mondello
Designing with microservices - Daniele MondelloDesigning with microservices - Daniele Mondello
Designing with microservices - Daniele Mondello
 
Alla scoperta di gRPC
Alla scoperta di gRPCAlla scoperta di gRPC
Alla scoperta di gRPC
 
Meetup Fluent Design e Progressive Web App
Meetup Fluent Design e Progressive Web AppMeetup Fluent Design e Progressive Web App
Meetup Fluent Design e Progressive Web App
 
Il futuro di Windows Phone
Il futuro di Windows PhoneIl futuro di Windows Phone
Il futuro di Windows Phone
 
SignalR, il WebSocket che tanto ci mancava
SignalR, il WebSocket che tanto ci mancavaSignalR, il WebSocket che tanto ci mancava
SignalR, il WebSocket che tanto ci mancava
 
Meetup Progressive Web App
Meetup Progressive Web AppMeetup Progressive Web App
Meetup Progressive Web App
 
Continuous Integration e High Quality Code
Continuous Integration e High Quality CodeContinuous Integration e High Quality Code
Continuous Integration e High Quality Code
 

More from Nicolò Carandini

More from Nicolò Carandini (20)

The absolute need of Secure Http
The absolute need of Secure HttpThe absolute need of Secure Http
The absolute need of Secure Http
 
Xamarin DevOps
Xamarin DevOpsXamarin DevOps
Xamarin DevOps
 
Code review e pair programming con Visual Studio Live Share
Code review e pair programming con Visual Studio Live ShareCode review e pair programming con Visual Studio Live Share
Code review e pair programming con Visual Studio Live Share
 
Azure dev ops meetup one
Azure dev ops meetup oneAzure dev ops meetup one
Azure dev ops meetup one
 
The Hitchhiker's Guide to the Azure Galaxy
The Hitchhiker's Guide to the Azure GalaxyThe Hitchhiker's Guide to the Azure Galaxy
The Hitchhiker's Guide to the Azure Galaxy
 
Game matching with SignalR
Game matching with SignalRGame matching with SignalR
Game matching with SignalR
 
Swagger loves WebAPI
Swagger loves WebAPISwagger loves WebAPI
Swagger loves WebAPI
 
Xamarin Workbooks
Xamarin WorkbooksXamarin Workbooks
Xamarin Workbooks
 
Web app slots and webapi versioning
Web app slots and webapi versioningWeb app slots and webapi versioning
Web app slots and webapi versioning
 
Intro xamarin forms
Intro xamarin formsIntro xamarin forms
Intro xamarin forms
 
Windows 10 design
Windows 10 designWindows 10 design
Windows 10 design
 
Windows 10 IoT
Windows 10 IoTWindows 10 IoT
Windows 10 IoT
 
Mobile services multi-piattaforma con Xamarin
Mobile services multi-piattaforma con XamarinMobile services multi-piattaforma con Xamarin
Mobile services multi-piattaforma con Xamarin
 
Universal Apps localization and globalization
Universal Apps localization and globalizationUniversal Apps localization and globalization
Universal Apps localization and globalization
 
Applicazioni web con ASP.NET Owin e Katana
Applicazioni web con ASP.NET Owin e KatanaApplicazioni web con ASP.NET Owin e Katana
Applicazioni web con ASP.NET Owin e Katana
 
Azure Mobile Services con il .NET Framework
Azure Mobile Services con il .NET FrameworkAzure Mobile Services con il .NET Framework
Azure Mobile Services con il .NET Framework
 
Sviluppare app per iOS e Android con Xamarin e Visual Studio
Sviluppare app per iOS e Android con Xamarin e Visual StudioSviluppare app per iOS e Android con Xamarin e Visual Studio
Sviluppare app per iOS e Android con Xamarin e Visual Studio
 
Xaml introduction
Xaml introductionXaml introduction
Xaml introduction
 
Self hosted Services with .NET OWin
Self hosted Services with .NET OWinSelf hosted Services with .NET OWin
Self hosted Services with .NET OWin
 
Web api 2.0
Web api 2.0Web api 2.0
Web api 2.0
 

Game matching with SignalR

  • 1. #TecHeroes loves GameDev Tour Game Matching with SignalR Nicolò Carandini [MVP] n.carandini@outlook.com @TPCWare
  • 2. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Agenda • SignalR • Comunicare in Real Time • HTTP & HTLM5 / WebSockets • ASP.NET SignalR • Casi d’uso • Demo • Game Matching • Un po’ di teoria • Demo
  • 3. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Comunicazione full duplex con HTTP ? Il protocollo HTTP prevede che il Client faccia una richiesta e il Server dia una risposta. Il Server non ha modo di mandare un messaggio al Client di sua iniziativa. INTERNET REQUEST INTERNET RESPONSE <HTML> Page
  • 4. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Comunicazione real time tra clienti Se voglio comunicare tra vari client, quando il server riceve dati da un client, deve poter inviare dati agli altri client:
  • 5. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Possibili soluzioni Polling Long Polling SERVER CLIENT tempo Request Response Request Response Request Response Request Response Request Response Intervallo di polling Intervallo di polling Intervallo di polling Intervallo di polling SERVER CLIENT tempo Request Response Request Response Request Response Response Request Request
  • 6. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Controindicazioni? • Polling: Se l’intervallo è breve, troppe richieste inutili Se l’intervallo è lungo, le informazioni arrivano in ritardo • Long polling: Il Server deve gestire le richieste in modo asincrono altrimenti va in saturazione e non accetta altre richieste
  • 7. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour HTLM5/WebSockets • Fanno parte delle specifiche di HTML5 • Estendono il protocollo HTTP fornendo il supporto alle raw sockets • Consentono la comunicazione full-duplex • Traversano gli HTTP proxies (solo se i proxies sono "moderni"…) Client Proxy Server / Firewall Origin Server
  • 8. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Tutto risolto? Non proprio, perché HTML5/WebSocket è un protocollo di basso livello che richiede la scrittura di molto codice per implementare le funzionalità richieste da una applicazione real-time. Inoltre le condizioni d’uso delle WebSockets sono molto restrittive.
  • 9. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Condizioni d’uso delle WebSockets Funzionano quando: • Il Web Server le supporta • Il Web browser le supporta • Il load balancer/reverse proxy le supporta • Il client proxy server/NAT le supporta • Tutto ciò che sta tra il client e il server le supporta
  • 10. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour ASP.NET SignalR SignalR è la libreria ASP.NET che rende incredibilmente semplice aggiungere funzionalità Real-Time alle applicazioni web
  • 11. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Punti di forza • Implementa, ove possibile, WebSockets. • Fa il downgrade in modo trasparente alle altre tecniche di polling • Fornisce una API di alto livello, molto semplice da usare, per fare RPC tra server e client • Offre funzionalità di gestione degli eventi di connessione e sconnessione e la gestione delle autorizzazioni
  • 12. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Diagramma architetturale di SignalR
  • 13. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour SignalR API PersistentConnection • Implementa le funzionalità minime necessarie • Consente l’invio e la ricezione di stringhe • Broadcast a tutti, a gruppi o a singoli utenti • Connessione, riconnessione e disconnessione Hub • Utilizza la PersistentConnection • Consente l’uso delle RPC da client a server e viceversa • Genera automaticamente i proxy RPC per i web client (in JavaScript)
  • 14. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour PersistentConnection Vs. Hub Nella maggior parte dei casi si usa l’Hub. La PersistentConnection viene utilizzata nei seguenti casi: • Si usa un messaggio con formato custom • Si preferisce lavorare tramite invio di messaggi invece di utilizzare RPC (remote Procedure Call) • Occorre fare il porting a SignalR di un’applicazione preesistente che è basta sull’invio di messaggi e non usa le RPC
  • 15. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour RPC (Remote Procedure Call) Si possono chiamare funzioni JavaScript lato client da codice .NET lato server, e viceversa
  • 16. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Per fare cosa? Oltre ai classici scenari di chat, SignalR è perfetto per tutti quei casi in cui si abbia necessità di update ad alta frequenza, come nei giochi in real-time o implementare funzionalità di comunicazione full duplex all’interno di un applicativo. Interessante notare che Visual Studio (sin dalla versione 2013) usa SignalR per implementare la funzionalità di Browser Link.
  • 17. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Visual Studio Browser Link
  • 18. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Real Time Game: ShootR
  • 19. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Demo ShootR
  • 20. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Performances Throughtput • Un singolo server riesce a gestire da 100.000 a 500.000 messaggi al secondo. • Con un’occupazione di memoria estremamente ridotta. Scalabilità • Fully async • Circa 1.000 connessioni per server • Supporta la scalabilità orizzontale utilizzando un message bus (Service Bus, Redis, SQL)
  • 21. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Scalabilità
  • 22. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Client disponibili • JavaScript(jQuery) • .NET 4.x • Xamarin • UWP • iOS • Android • Java
  • 23. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Next version: ASP.NET Core SignalR • Ancora in fase di sviluppo • Beta prevista per metà anno, RTM per fine anno • Tra le tante novità: • L’indipendenza da jQuery per il client Javascript • Invio/ricezione anche di binary data • Supporto di protocolli/formati multipli • Supporto di clienti WebSocket "puri" …e tanto altro ancora!
  • 24. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Next version: ASP.NET Core SignalR
  • 25. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Riferimenti ASP.NET SignalR 2.0 http://www.asp.net/signalr https://github.com/SignalR/SignalR ASP.NET Core SignalR https://blog.3d-logic.com/2017/01/15/signalr-core-part-13-design-considerations https://speakerdeck.com/davidfowl/introducing-asp-dot-net-core-sockets https://github.com/aspnet/SignalR
  • 26. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Game Player Use Case diagram
  • 27. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Match Making Activity diagram
  • 28. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Match Making Sequence diagram
  • 29. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Play Turn Activity diagram
  • 30. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Play Turn Sequence diagram
  • 31. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Demo Game Matching
  • 32. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Game Matching per Unity • Poiché il game matching è piuttosto oneroso da sviluppare, per chi sviluppa giochi con Unity può essere (molto) conveniente utilizzare un servizio a pagamento come Unity Multiplayer: • Gratuito fino a 20 giocatori contemporaneamente in gioco • Con pagamento mensile in base al traffico prodotto • Per una stima dei costi mensili, basta andare sul sito di Unity: • https://unity3d.com/services/multiplayer
  • 33. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Demo Estimate Your Monthly Bill
  • 34. Roma, 27 Gennaio 2017#TecHeroes loves GameDev Tour Question Time…