41
1000X SPEEDUP Anton Pleshivtsev

1k speedup

  • Upload
    -

  • View
    308

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 1k speedup

1000X SPEEDUPAnton Pleshivtsev

Page 2: 1k speedup

AGENDA

Page 3: 1k speedup

ARCHITECTURE

Page 4: 1k speedup

TWO KINDS

• Classic

• Authoritative

Page 5: 1k speedup

CLASSIC

Client

Client Client Client

t

Page 6: 1k speedup

AUTHORITATIVE

Server

Client

Client Client

Client

Page 7: 1k speedup

FINITE-STATE MACHINE

State 1

State 2

State 3

Message 1 Message 2

Page 8: 1k speedup

DATA FLOW

t

Build

!

S1

Building…

S2

S1 S2 S2 S2

Page 9: 1k speedup

GAME PROBLEM

Page 10: 1k speedup

GAME MAPPlayer 1 Player 2

Player 3 Player 4

Player 5 Player 6

Player 7 Player 8

King 1 King 2

Page 11: 1k speedup

PLAYER SLOT

Wave respawn

Player respawn

~ 36 enemies

~ 20 allies

Page 12: 1k speedup

GAME WORLD OBJECT

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

Page 13: 1k speedup

SMALL CHANGE PROBLEM

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

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

Page 14: 1k speedup

JSON PATCH

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

Page 15: 1k speedup

DEEP MEGRE

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

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

{time: 2}

Page 16: 1k speedup

PROGRAM FLOWWar calculation

Deep copy

Diff

Compression

Page 17: 1k speedup

PROGRAM FLOW (UNICORN WORLD)

t

100ms 400ms200ms 300ms

War State 1 S2 S3 S4

Page 18: 1k speedup

PROGRAM FLOW (REAL WORLD)

t 100ms 400ms200ms 300ms

War State 1 War State 2

Rubbers

Page 19: 1k speedup

PROFILINGWar calculation

Deep copy

Diff

Compression

60%

5%

30%

5%

Math

Structures

Structures

C binding

Page 20: 1k speedup

PYTHON

0

40

80

120

160

Python

Page 21: 1k speedup

PYTHONSPEEDUP

Page 22: 1k speedup

PYPY

Page 23: 1k speedup

PYPY

0

40

80

120

160

Python Pypy

2.6X

Page 24: 1k speedup

PYPY PROBLEM

0

30

60

90

120

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

WTF?

Page 25: 1k speedup

CYTHON

• Python -> C *.so module

• Optional types

Page 26: 1k speedup

CYTHON

0

40

80

120

160

Python Pypy Cython

2.6X 3.5X

Page 27: 1k speedup

GO

• Static types

• 10x speedup by default

Page 28: 1k speedup

GO

0

40

80

120

160

Python Pypy Cython Go

2.6X 3.5X 80X

Page 29: 1k speedup

SCALA + AKKA?

Page 30: 1k speedup

GO

• Reflect(((

• Opensource problems (ex. websocket)

• Races (ex. maps)

Page 31: 1k speedup

NEXT FEATURES

• Abilities - f(unit, world)

• Projectiles - f(unit1, unit2, world)

Page 32: 1k speedup

PROFILING

War calculation

Deep copy

Diff

Compression

2%

6%

90%

2%

Math

Structures

Structures

C binding

60%

30%

Python Go

5%

5%

Page 33: 1k speedup

GEN DIFF

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

Page 34: 1k speedup

DIFF VS GEN_DIFF

0

15

30

45

60

Reflect_diff Gen_diff

20X

Page 35: 1k speedup

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

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

Page 36: 1k speedup

WEB SOCKET COMPRESSION

• 2 libs

• LZMA

• Strange exception

Page 37: 1k speedup

JSON MODULE

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

Page 38: 1k speedup

JSON

• map[int] encoding

• float 3.00000001 -> 3.0

Page 39: 1k speedup

CONCLUSION

0

40

80

120

160

Python Pypy Cython Go Go + Gendiff

2.6X 3.5X 80X 1600X

Page 40: 1k speedup

CONCLUSION

0

5

10

15

20

Go Go + Gendiff

Page 41: 1k speedup

Anton Pleshivtsev

[email protected]

github.com/allaud