1k speedup

Preview:

Citation preview

1000X SPEEDUPAnton Pleshivtsev

AGENDA

ARCHITECTURE

TWO KINDS

• Classic

• Authoritative

CLASSIC

Client

Client Client Client

t

AUTHORITATIVE

Server

Client

Client Client

Client

FINITE-STATE MACHINE

State 1

State 2

State 3

Message 1 Message 2

DATA FLOW

t

Build

!

S1

Building…

S2

S1 S2 S2 S2

GAME PROBLEM

GAME MAPPlayer 1 Player 2

Player 3 Player 4

Player 5 Player 6

Player 7 Player 8

King 1 King 2

PLAYER SLOT

Wave respawn

Player respawn

~ 36 enemies

~ 20 allies

GAME WORLD OBJECT

(36 + 20) * 8 * 500 B = 224 KB

SMALL CHANGE PROBLEM

{time: 1,phase: ‘build’,units: […],players: […],projectiles: […]}

{time: 2,phase: ‘build’,units: […],players: […],projectiles: […]}

JSON PATCH

[ { "op": "replace", "path": "/baz", "value": "boo" }, { "op": "add", "path": "/hello", "value": ["world"] }, { "op": "remove", "path": "/foo"}]

DEEP MEGRE

{time: 1,phase: ‘build’,units: […],players: […],projectiles: […]}

{time: 2,phase: ‘build’,units: […],players: […],projectiles: […]}

{time: 2}

PROGRAM FLOWWar calculation

Deep copy

Diff

Compression

PROGRAM FLOW (UNICORN WORLD)

t

100ms 400ms200ms 300ms

War State 1 S2 S3 S4

PROGRAM FLOW (REAL WORLD)

t 100ms 400ms200ms 300ms

War State 1 War State 2

Rubbers

PROFILINGWar calculation

Deep copy

Diff

Compression

60%

5%

30%

5%

Math

Structures

Structures

C binding

PYTHON

0

40

80

120

160

Python

PYTHONSPEEDUP

PYPY

PYPY

0

40

80

120

160

Python Pypy

2.6X

PYPY PROBLEM

0

30

60

90

120

100 200 300 400 500 600 700 800 900 1000 1100 1200 1300

WTF?

CYTHON

• Python -> C *.so module

• Optional types

CYTHON

0

40

80

120

160

Python Pypy Cython

2.6X 3.5X

GO

• Static types

• 10x speedup by default

GO

0

40

80

120

160

Python Pypy Cython Go

2.6X 3.5X 80X

SCALA + AKKA?

GO

• Reflect(((

• Opensource problems (ex. websocket)

• Races (ex. maps)

NEXT FEATURES

• Abilities - f(unit, world)

• Projectiles - f(unit1, unit2, world)

PROFILING

War calculation

Deep copy

Diff

Compression

2%

6%

90%

2%

Math

Structures

Structures

C binding

60%

30%

Python Go

5%

5%

GEN DIFF

3. ХОД КОНЕМ - мы вернулись к питону, с которого мы начинали и написали на питоне код, который нам генерит код на го, который генерит диффер

DIFF VS GEN_DIFF

0

15

30

45

60

Reflect_diff Gen_diff

20X

NO WEB SOCKET COMPRESSION 6. Проблема 1 - отсутствие

компрессии в диффере. Проблема большая, народ уже год ждет компрессии в вебсокете на го. Пришлось прочитать RFC по вебсокету и реализовать (в issue есть вознаграждение 100 баксов за фичу, но что такое 100 баксов у них и что у нас) 7. Мы реализовали свою компрессию lzma, местами даже лучше zip (забавно, но в unity нет поддержки zip, поэтому пришлось брать экзотический lzma) 8. Сложный баг с непонятным исключением. Оказалось, второй бит пожатого пакета надо менять на 1. Не спрашивайте, как я это обнаружил.

WEB SOCKET COMPRESSION

• 2 libs

• LZMA

• Strange exception

JSON MODULE

9. JSON-кодировщик го не умеет кодировать словари, ключи которого численного типа. (Автор сказал, что это противоречит спецификации). В отместку автору json-кодировщика мы форкнули его проект и добавили кодирование числовых ключей

JSON

• map[int] encoding

• float 3.00000001 -> 3.0

CONCLUSION

0

40

80

120

160

Python Pypy Cython Go Go + Gendiff

2.6X 3.5X 80X 1600X

CONCLUSION

0

5

10

15

20

Go Go + Gendiff

Anton Pleshivtsev

anton@emby.ru

github.com/allaud

Recommended