49
Killer Robots are a Concurrency Problem Stephen McQuay @smcquay Fraser Graham @twisted_weasel

Fraser Graham Killer Robots

Embed Size (px)

Citation preview

Page 1: Fraser Graham Killer Robots

Killer Robots are a Concurrency ProblemStephen McQuay @smcquay Fraser Graham @twisted_weasel

Page 2: Fraser Graham Killer Robots

I am learning Go, it's awesome.

I always wanted to write a game.

Cool

Cool

Page 3: Fraser Graham Killer Robots

We should write a game, in Go…

LOL

Page 4: Fraser Graham Killer Robots

“REAL” GAMES

C C++

NOT GAMES

!Java

Python Ruby Go

etc.

“simple” GAMES

Javascript Objective-C

Flash😩 C#

Page 5: Fraser Graham Killer Robots

“Go is like Java, right? Best suited for server

stuff? Nobody ever made a successful game in Java!”

Page 6: Fraser Graham Killer Robots

MINECRAFT

Page 7: Fraser Graham Killer Robots

MATHPHYSICSOPEN GLGUIINPUTCONCURRENCY

Page 8: Fraser Graham Killer Robots

Let’s Make a Game!

\o/

Page 9: Fraser Graham Killer Robots

Robots Are Cool

Page 10: Fraser Graham Killer Robots

START:!MV 100, 200!FIR 300, 312!SCN 3000!JMPIF s0, FOUND!GOTO START:!FOUND:!FIR s0

Screenshots are Pre-Rendered

Page 11: Fraser Graham Killer Robots

WEBWebGL

WebsocketsGame

Server

Page 12: Fraser Graham Killer Robots
Page 13: Fraser Graham Killer Robots
Page 14: Fraser Graham Killer Robots
Page 15: Fraser Graham Killer Robots

Game Architecture

Bandwidth Management

Page 16: Fraser Graham Killer Robots

Game Architecture

Page 17: Fraser Graham Killer Robots

Robot Protocol

Game ServerRobot

Page 18: Fraser Graham Killer Robots

Game Server

SIMULATION LOGIC

PLAYER MANAGEMENT

SERIALIZATION

SERIALIZATION

SERIALIZATION

SERIALIZATION

Page 19: Fraser Graham Killer Robots

Game(s) Server

SIMULATION LOGIC PLAYER MANAGEMENT

SERIALIZATION

SERIALIZATION

SERIALIZATION

SIMULATION LOGIC PLAYER MANAGEMENT

SERIALIZATION

SERIALIZATION

SERIALIZATION

SIMULATION LOGIC PLAYER MANAGEMENT

SERIALIZATION

SERIALIZATION

SERIALIZATION

Page 20: Fraser Graham Killer Robots

SIMULATION LOGIC

PLAYER MANAGEMENT

SERIALIZATION

SERIALIZATION

SERIALIZATION

60Hz Not 60Hz

Page 21: Fraser Graham Killer Robots

SIMULATION LOGIC

!GOROUTINE

PLAYER MANAGEMENT

!GOROUTINE

PLAYER SERIALIZATION

!GOROUTINE(S)

CHANNEL CHANNEL

Page 22: Fraser Graham Killer Robots

Control, Control, You must learn Control

Game ServerRobot

Page 23: Fraser Graham Killer Robots

Control, Control, You must learn Control

Game ServerRobot Game

Broker

Page 24: Fraser Graham Killer Robots

SIMULATION LOGIC !

GOROUTINE

PLAYER MANAGEMENT

!GOROUTINE

PLAYER SERIALIZATION

!GOROUTINE(S)

CHANNEL CHANNEL

HTTP CONTROL

!GOROUTINE

SIMULATION LOGIC !

GOROUTINE

PLAYER MANAGEMENT

!GOROUTINE

PLAYER SERIALIZATION

!GOROUTINE(S)

CHANNEL CHANNEL

SIMULATION LOGIC !

GOROUTINE

PLAYER MANAGEMENT

!GOROUTINE

PLAYER SERIALIZATION

!GOROUTINE(S)

CHANNEL CHANNEL

Page 25: Fraser Graham Killer Robots

Bandwidth Management

OR

“How I Learned to Stop Worrying and Love Interfaces”

Page 26: Fraser Graham Killer Robots

Robot ProtocolGame

Server

Spectator Player

Page 27: Fraser Graham Killer Robots

Robot ProtocolGame

Server

Spectator Player

Page 28: Fraser Graham Killer Robots
Page 29: Fraser Graham Killer Robots
Page 30: Fraser Graham Killer Robots

Robot ProtocolGame

Server

Spectator Player

Page 31: Fraser Graham Killer Robots
Page 32: Fraser Graham Killer Robots

http

://h

yper

bole

anda

half

.blo

gspo

t.co

m/20

10/0

6/th

is-i

s-wh

y-il

l-ne

ver-

be-a

dult

.htm

l

Page 33: Fraser Graham Killer Robots

type Point struct { X, Y float64 } !... !p := Point{x, y} b, err := json.Marshal(p) !... !json: '{"X":23.827610293658736,"Y":42.273774761991874}' bytes: 47 (worst)

Page 34: Fraser Graham Killer Robots

func (fp *Point) AsArray() []float64 { return []float64{fp.X, fp.Y} } !... !p := Point{x, y} b, err := json.Marshal(p.AsArray()) !... !json: '[23.827610293658736,42.273774761991874]' bytes: 39 (47 worst)

Page 35: Fraser Graham Killer Robots

type Point struct { X, Y float32 } !func (p *Point) AsArray() []float32 { return []float32{p.X, p.Y} } !... !jsoned: '[23.82761,42.273773]' bytes: 20 (47 worst) !

Page 36: Fraser Graham Killer Robots

"(ಠ益ಠლ) but at what cost?!

Page 37: Fraser Graham Killer Robots

game.go:123: invalid operation: d + f (mismatched types float64 and float32)

Page 38: Fraser Graham Killer Robots

ʕノ◔ϖ◔ʔノ ( ┻━┻

Page 39: Fraser Graham Killer Robots

type Gopher interface { Squeak() }

Page 40: Fraser Graham Killer Robots

type Point struct { X, Y float64 } !

func (ip Point) Squeak() { // ... } !

... !

var p Point = Point{2, 3} var g Gopher = Point{2, 3}

Page 41: Fraser Graham Killer Robots

func foo(g Gopher) {} !

var p Point = Point{2, 3} foo(p)

Page 42: Fraser Graham Killer Robots

If an encountered value implements the Marshaler interface and is not a nil pointer, Marshal calls its MarshalJSON method to produce JSON

Page 43: Fraser Graham Killer Robots

type Point struct { X, Y float64 } !func (p *Point) MarshalJSON() ([]byte, error) { coords := []float32{ float32(fp.X), float32(fp.Y), } return json.Marshal(coords) } !... !jsoned: '[23.82761,42.273773]' bytes: 20 (47 worst)

Page 44: Fraser Graham Killer Robots

!

┬─┬ ʕ◔ϖ◔ʔ

Page 45: Fraser Graham Killer Robots
Page 46: Fraser Graham Killer Robots

package encoding !type BinaryMarshaler interface { MarshalBinary() (data []byte, err error) } !type TextMarshaler interface { MarshalText() (text []byte, err error) }

Page 47: Fraser Graham Killer Robots

type encoder interface { Encode(v interface{}) error } !if encoding == "json" { player.enc = json.NewEncoder(ws) } else { player.enc = gob.NewEncoder(ws) } !... player.enc.Encode(boardState)

Page 48: Fraser Graham Killer Robots

Demo

Page 49: Fraser Graham Killer Robots

Future Work