PYCON DE 2012 - Echtzeit browsergames

Post on 24-May-2015

977 views 6 download

description

Folien von meinem Vortag "Echtzeit Browsergames" von der PYCON DE 2012 in Leipzig. https://2012.de.pycon.org/programm/schedule/sessions/19/ Mit gevent und browserseitigem JavaScript können Mehrspieler Browsergames entwickelt werden, die Spielerinteraktionen in Echtzeit zulassen. Dieser Vortrag versucht Lust auf das Echtzeit Web zu machen und zeigt anhand eines konkreten Spieles (KODEX, http://kodexgame.com/) Lösungen für Entwicklung, Hosting und Vertrieb auf. Der Vortrag beleuchtet neben den Implikationen des Realtime Web wie Caching, Scaling, Same-Origin-Policy und Cross-Origin-Resource-Sharing auch Strategien zur horizontalen Skalierbarkeit, oder: Wie löst man das C10K Problem? Während NodeJS oft als die Lösung für Echtzeitanwendungen angepriesen wird, kommt hier auf der Serverseite gezielt Python mit gevent zum Einsatz.

Transcript of PYCON DE 2012 - Echtzeit browsergames

Echtzeit BrowsergamesMichael P. Jung <me@bikeshedder.com>

Thursday, 1. November 2012 [W]

Kapitel 0 – Michael P. Jungwhoami

Thursday, 1. November 2012 [W]

Michael P. JungSoftware Engineer und Designer

SoftwareentwicklerC, C++, Python, Java (uvm.)

Linux Benutzerseit 1994

Python Entwicklerseit Python 2.3, ~2003

Django Entwicklerseit magic-removal branch, ~2006

Brettspielefan

me@bikeshedder.com

Thursday, 1. November 2012 [W]

Gegründet: 2000

Echtzeit Client-Server-Anwendungen

E-Commerce

App-Developers (HTML5)

Game Developers

http://terreon.de/Software und Design

Thursday, 1. November 2012 [W]

Gegründet: 2008

Python Shared Hosting

Individuelle Hostinglösungen

“The next big thing” (ETA 2013)

http://pyrox.eu/@pyrox_euHosting Experts

Thursday, 1. November 2012 [W]

Kapitel 1 – KonzeptVon der Idee zum Spiel

Thursday, 1. November 2012 [W]

Foto von doom.wikia.comFotograf: Janzidreg

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Kapitel 2 – Technikvon async bis zmq

Thursday, 1. November 2012 [W]

AnatomieWas gehört zu einem Browsergame?

Thursday, 1. November 2012 [W]

Datenbank

Browser

SoundsMusik

GFXGrafikenGame server Hub Server

MoMMessage oriented

Middleware

Missionen

SpielinhalteClient

Server

JavaScript Applikation Gegner

Waffen

Achievements

Thursday, 1. November 2012 [W]

Technologie Stack (Server)

Python 2.7http://python.org/

Djangohttp://www.djangoproject.com/

Django Socialauthhttps://github.com/omab/django-social-auth

geventhttp://gevent.org/

PostgreSQLhttp://www.postgresql.org/

RabbitMQhttp://www.rabbitmq.com/

Mushroomhttps://bitbucket.org/terreon/mushroom

Sync Modelshttps://bitbucket.org/terreon/sync-models (noch nicht released)

Thursday, 1. November 2012 [W]

Technologie Stack (Client)

JQueryhttp://jquery.com/

Knockouthttp://knockoutjs.com/

Sugarhttp://sugarjs.com/

Mushroomhttps://bitbucket.org/terreon/mushroom

Sync Modelshttps://bitbucket.org/terreon/sync-models (noch nicht released)

Compasshttp://compass-style.org/

Thursday, 1. November 2012 [W]

Architektur

Browser

static.kodexgame.com

kodexgame.com

hub.kodexgame.com

gNNN.kodexgame.com

Database

MoM

Thursday, 1. November 2012 [W]

Opoge PusherNette Idee, aber leider etwas umständlich...

Thursday, 1. November 2012 [W]

Opoge Pusher

Publish-Subscribe Dienst

Keine Permissions

Senden von Nachrichten und Steuern der Subscribe ausschließlich über Kontrollkanal

https://bitbucket.org/bikeshedder/opoge-pusher/

Thursday, 1. November 2012 [W]

Deployment

Web Applikation

Browser

Opoge Pusher

Thursday, 1. November 2012 [W]

Ablauf

Browser WebApp Pusher

Login

Pusher Session

Login

Data

session.create

session.push

Thursday, 1. November 2012 [W]

Pro und Contra

Einfach zu verwenden

Kompatibel mit beliebigen Programmiersprachen

Sessions müssen doppelt verwaltet werden

Session-Pinning notwendig

Thursday, 1. November 2012 [W]

MushroomRealtime web messaging

Thursday, 1. November 2012 [W]

Designziele

Kein vollwertiger Dienst sondern ein Framework

Eingebautes RPC

Unterstützung von Message Queues

Thursday, 1. November 2012 [W]

Architektur

Server

Client

Long pollingCall WebSocket SSE*

*Server-sent eventsThursday, 1. November 2012 [W]

Mushroom Server (1/2)

class GameServer(object):

def __init__(self, listener): self.server = mushroom.Server(listener, mushroom.MethodDispatcher(self, ‘rpc_’)) self.mom = mushroom.messaging.Client( settings.BROKER_URL, exchange, queue, mushroom.MethodDispatcher(self, ‘mom_’))

Thursday, 1. November 2012 [W]

Mushroom Server (2/2)

class ChatServer(object):

(...)

def mom_message(self, request): self.server.sessions.notify(‘message’, request.data)

def rpc_message(self, request): self.mom.notify(‘message’, request.data)

Thursday, 1. November 2012 [W]

Mushroom Client

var client = new mushroom.Client({ url: SERVER_URL});client.method.method(function(request) { console.log(request.data);});function sendMessage(text) { client.notify(‘message’, { text: text })}

Thursday, 1. November 2012 [W]

Download

https://bitbucket.org/terreon/mushroom/

Thursday, 1. November 2012 [W]

Sync-ModelsSynchronisierte Objektgraphen

Thursday, 1. November 2012 [W]

Grundidee

Objektgraphen synchronisieren

Änderungen vom von Server zum Client pushen (z.B. via Mushroom)

Jedes Objekt erhält eine eindeutige Objekt ID

Sobald ein Objekt Teil des Graphs wird werden Änderungen automatisch übertragen.

Server

Client

Push!!!11one

Thursday, 1. November 2012 [W]

Zutaten

Django (optional)

“Simple JavaScript Inheritance” by John Resig

KnockoutJS

Thursday, 1. November 2012 [W]

Beispiel Graph

Root [0]

Root [0]

Server Client

Thursday, 1. November 2012 [W]

Beispiel Graph

Root [0]

Root [0]

Server Client

X

Thursday, 1. November 2012 [W]

Beispiel Graph

Root [0]

Root [0]

Server Client

X[1]

Thursday, 1. November 2012 [W]

Beispiel Graph

Root [0]

Root [0]

Server Client

X[1]

X[1]

push

Thursday, 1. November 2012 [W]

Server

from kodex.sync import models

class BulletinBoard(models.RootModel): messages = models.ReferenceListField()

class Message(models.Model): user = models.ReferenceField() text = models.StringField()

Thursday, 1. November 2012 [W]

Server

from kodex.sync import server

class Server(server.SyncServer):

def __init__(self): self.root = BulletinBoard()

def post(message): self.root.messages.append(message)

Thursday, 1. November 2012 [W]

Client

bb.Client = kodex.sync.Client.extend({ post: function(text) { this.request(‘post’, { text: text }) }})

var client = new bb.Client();$(‘#bb’).koApplyBindings(client);

Thursday, 1. November 2012 [W]

Client<div id=”bb”> <ul class=”messages” data-bind=” foreach: root().messages”> <li> <span class=”user” data-bind=” text: user”></span>: <span class=”text” data-bind=” text: user”></span> </li> </ul></div>

Thursday, 1. November 2012 [W]

Protokoll(Snapshot)

{ “0”: { “class”: “bb.BulletinBoard”, “messages*”: [1] }, “1”: { “class”: “bb.Message”, “user*”: 2, “text”: “Was rockt?” }, “2”: { “class”: “auth.User”, “username”: “bikeshedder” }}

Thursday, 1. November 2012 [W]

Protokoll(Update)

{ “0”: { “messages*”: [2, 4] }, “4”: { “class”: “bb.Message”, “user*”: 5, “text”: “PYCON DE 2012” }, “5”: { “class”: “auth.User”, “username”: “solid” }}

Thursday, 1. November 2012 [W]

Protokoll(Delete)

{ “0”: { “messages*”: [4] }, “1”: null, “2”: null}

Thursday, 1. November 2012 [W]

Kapitel 3 – HostingWie hoste ich ein System dieser Art?

Thursday, 1. November 2012 [W]

Google Appengine

Asynchrone Kommunikation mit dem Client nur über die Channel API möglich.

Stateful Services umständlich

Verhältnismäßig teuer

Wartungsfrei

Lokale Entwicklung eingeschränkt

Thursday, 1. November 2012 [W]

Heroku

Beliebt unter Entwicklern

Serverstandort nur in USA

Push-Dienst muss zusätzlich gebucht werden (z.B. Pusher oder PubNub)

Lokale Entwicklung eingeschränkt

Thursday, 1. November 2012 [W]

Eigene Servervirtuell oder physikalisch

Server müssen gewartet werden

Maximale Flexibilität

Software läuft sowohl lokal als auch remote

Kein Vendor Lock-in

Thursday, 1. November 2012 [W]

Kapitel 4 – MarketingPublisher, Social Marketing, P2P Propaganda

Thursday, 1. November 2012 [W]

Publisher

7 Games

BigPoint

Gameforge

Frogster

...

Keine Resonanz}Thursday, 1. November 2012 [W]

Social-Networks

Facebookhttp://kodexgame.com/facebook/

Google+http://kodexgame.com/google+/

Twitterhttp://kodexgame.com/twitter/

Thursday, 1. November 2012 [W]

P2P Propaganda

Registrierung für Closed-Betahttp://kodexgame.com/beta/

Thursday, 1. November 2012 [W]

Kapitel 5 – Geld verdienenBezahlmodelle und -systeme

Thursday, 1. November 2012 [W]

ZahlungsmodelleAbo, Free to play, Premium Items,...

Thursday, 1. November 2012 [W]

Abo (Subscription)

World of Warcraft hatte zeitweise bis zu 12 Millionen Abonnenten.

Neue “Stammspiele” lassen sich schwer etablieren.

Für kleinere Indie- oder Casualgames kein brauchbares Zahlungsmodell.

Thursday, 1. November 2012 [W]

Free to play

Große Teile des Spiels sind spielbar aber bestimmte Inhalte und/oder die Spielzeit sind eingeschränkt.

Premium Items können gegen Geld gekauft werden.

Die Anzahl der Spielzüge ist begrenzt und kann durch Einsatz von Geld wieder aufgefüllt werden.

Thursday, 1. November 2012 [W]

Pay what you want

Spieler bestimmen selbst was Sie für das Spiel bezahlen wollen.

Thursday, 1. November 2012 [W]

Werbefinanziert

Kann große Teile der Spielatmosphäre zerstören

Spieler können gegen ein Entgelt die Werbung entfernen lassen.

Thursday, 1. November 2012 [W]

Sponsored

... schön wär’s.

Thursday, 1. November 2012 [W]

Zahlungsmodell – Fazit

Free to play ist Pflicht.

Spielbalance sollte nicht darunter leiden.

Unkritisch:

Spielzeit einschränken

Spielinhalte verkaufen

optische Individualisierung

Thursday, 1. November 2012 [W]

BezahlsystemePayPal, Amazon FPS, Google Checkout, Paymill, VirtualPiggy, Premium SMS,...

Thursday, 1. November 2012 [W]

Bezahlsysteme (1/4)

PayPal: 0,35 € + 1,9% (non-EU teurer)PayPal Micropayment: 10 Cent + 10%

Google Checkout: 0,20 £ + 3,4% (gestaffelt bis 1,4%)

Amazon FPS (>10 $): 0,30 $ + 2,9%Amazon FPS (> 0,05 $): 0,05 $ + 5%Amazon FPS (<0,05 $): 20%

ClickandBuy: 0,35 € + ~4%

Thursday, 1. November 2012 [W]

Bezahlsysteme (2/4)

Paymill: 0,28 € + 2,95%VISA und MasterCardhttps://www.paymill.de/

Fortumo: 45% – 60%Premium SMShttp://fortumo.com/

Sofortüberweisung: 0,25 € + 0,9%...mit Abo (4,90 €/Monat): 0,10 € + 0,85%

Thursday, 1. November 2012 [W]

Bezahlsysteme (3/4)

VirtualPiggyPayment Lösung für Kinder und Jugendlichehttp://virtualpiggy.com/

Pay by CallT-Pay wurde 2010 eingestelltDaoPay: Gebühren nicht öffentlich

paysafecard: 15% - 17%

Thursday, 1. November 2012 [W]

Bezahlsysteme (4/4)

Publisher bzw. Platform

Thursday, 1. November 2012 [W]

Kapitel 6 – Lessons learnedOooops...

Thursday, 1. November 2012 [W]

Lektion 1: Releases“When it’s done” = Flexible Releaseplanung

Thursday, 1. November 2012 [W]

Releases

Closed Beta – 1. April 2012

Closed Beta – 4. Juni 2012 (DjangoCon Europe)

Closed Beta – 15. August 2012 (gamescom)

Closed Beta – 30. Oktober 2012 (PYCON DE)

Closed Beta – 1. Januar 2013 (*sigh*)

Thursday, 1. November 2012 [W]

Lektion 2: JugendschutzUnterhaltungssoftware Selbstkontrolle

Thursday, 1. November 2012 [W]

Jugendschutz

Nur Spiele, die auf einem Speichermedium vertrieben werden müssen von der USK geprüft werden.

Browsergames können optional geprüft werden.Einmalige Prüfung: 300 EURJahresmitgliedschaft: 3.000 EUR + Prüfgremium + X

Jugendschutzlabel empfehlenswert:/age-de.xml im Root-Verzeichnis der Domain ablegen

Thursday, 1. November 2012 [W]

Lektion 3: Kein IEInternet Explorer? Nein Danke!

Thursday, 1. November 2012 [W]

Kein Internet Explorer

Verwendung von Chrome Frames:https://developers.google.com/chrome/chrome-frame/

Akzeptanz für Spiele mit Browser-Plugins ist merklich gestiegen. Chrome Frame ist in wenigen Minuten installiert und sofort einsatzbereit.

Anwender mit Internet Explorer und ohne Chrome Frame werden ignoriert.

Thursday, 1. November 2012 [W]

Lektion 4: NIHNot invented here

Thursday, 1. November 2012 [W]

Not invented here

Opoge Pusher

Dependency Injection

JavaScript Bundler

...

Thursday, 1. November 2012 [W]

Kapitel 7 – KODEXJoin the intergalactic scavenger hunt.

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

Thursday, 1. November 2012 [W]

KODEX beta sign-up:http://kodexgame.com/beta/

Michael P. Jung <me@bikeshedder.com>

Thursday, 1. November 2012 [W]