22.01M

Go делать игры!

1.

Go делать игры!
Алексей Акулович (ВКонтакте)
2019.10.07 #6

2.

Как так вышло?
2

3.

Как так вышло?
голосовые сообщения
фотографии
рассылка пушей
CDN
аудио
документы
логи
Go RPC
мониторинг
трансляции
видео
3

4.

Как так вышло?
голосовые сообщения
фотографии
рассылка пушей
CDN
аудио
документы
логи
Go RPC
мониторинг
трансляции
видео
4

5.

Как так вышло?
голосовые сообщения
фотографии
рассылка пушей
CDN
аудио
документы
логи
Go RPC
мониторинг
трансляции
видео
игры
5

6.

Подходы к GameDev’у
- Pascal (или Basic) DOS-графика
6

7.

Подходы к GameDev’у
- Pascal (или Basic) DOS-графика
- DirectDraw/DirectX, OpenGL
7

8.

Подходы к GameDev’у
- Pascal (или Basic) DOS-графика
- DirectDraw/DirectX, OpenGL
- Blitz3D, Scratch, LÖVE
8

9.

Подходы к GameDev’у
Mail.ru Game Jam 2 (2017)
Unity (C#)
9
youtube.com/watch?v=WhxkAu-GAsw

10.

Подходы к GameDev’у
Внутренний хакатон
Go, GopherJS, WebGL
10
youtube.com/watch?v=no1ZJVJ1llk

11.

Подходы к GameDev’у
Внутренний хакатон
CoronaSDK (lua), WebGL
11
vk.com/app6810744

12.

Подходы к GameDev’у
Ludum Dare 42
- CoronaSDK (lua), WebGL
- ASEprite, sfxr, Bosca Ceoil
12
ldjam.com/events/ludum-dare/42/
oh-no-this-is-monsters

13.

Подходы к GameDev’у
Ludum Dare 43
CoronaSDK (lua), WebGL
ASEprite
13
ldjam.com/events/ludum-dare/43/
ludumcoin

14.

Lua, Lua, Lua...
Где Go?
14

15.

Выбор в пользу Go
- Типизация, отладка, профилирование
- Поддержка в IDE
- Мало Go на работе
15

16.

А если Go...
Есть чё?
16

17.

А если Go...
Какие есть игровые движки на Go?
17

18.

Какие есть игровые движки на Go
ENGi
Korok
Oak
18
g3n

19.

Как выбрать ТОТ САМЫЙ?
19

20.

Как выбрать ТОТ САМЫЙ?
- Живость
20

21.

ENGi
Desktop + GopherJS
“SUPER ALPHA v0.6”
Не обновлялся > 3 лет
Тот самый хакатон
21
github.com/ajhager/engi

22.

3D
Desktop
Не обновлялся > 3 лет
22
github.com/azul3d/engine

23.

Какие все еще есть игровые движки
ENGi
Korok
Oak
23
g3n

24.

Как выбрать ТОТ САМЫЙ?
- Живость
- Поддержка платформ
24

25.

Платформы
- Desktop
Windows, Linux, MacOS
- Mobile
Android, iOS
- Web
HTML5
25

26.

Как выбрать ТОТ САМЫЙ?
- Живость
- Поддержка платформ
- Web HTML5
- Mobile
- Desktop
26

27.

Как выбрать ТОТ САМЫЙ?
- Живость
- Поддержка платформ
- Web HTML5
- Mobile
- Desktop
- Предоставляемое API
27

28.

Посмотрим на оставшиеся
ENGi
Korok
Oak
28
g3n

29.

Oak
Software renderer
Desktop Windows
29
github.com/oakmound/oak

30.

2D
Desktop
pixel-examples raycaster
30
github.com/faiface/pixel

31.

Korok
2D
Desktop, mobile, web
Делает (делал?) один китаец
Не смог запустить даже desktop
31
github.com/KorokEngine/Korok

32.

G3N
3D
Desktop cgo ‒ сломана
wasm syscall/js ‒ как?
Нет примеров
Почти нет документации
github.com/danaugrs/gokoban
32
github.com/g3n/engine

33.

3D + 2D
Desktop, mobile, web
C++ / C# / GDScript
33
godotengine.org

34.

GDNative API
godotengine.org/article/look-gdnative-architecture
Плагин
.so, .dylib, .dll
Нет mobile, web
godot-go examples DodgeTheCreeps
34
github.com/ShadowApex/godot-go

35.

3D + 2D
C library
35
github.com/raysan5/raylib
raylib examples textures_bunnymark

36.

cgo binding
Desktop + Android
36
github.com/gen2brain/raylib-go

37.

Что остается?
ENGi
Korok
Oak
37
g3n

38.

2D
Desktop, mobile, web
38
github.com/hajimehoshi/ebiten

39.

Документация
39

40.

Примеры

40

41.

Примеры
41

42.

Код ‒ Go Way
ebiten.NewImageFromImage(source image.Image, ...)
42

43.

Код ‒ Go Way
// +build android ios
43

44.

Код ‒ Go Way
44

45.

45

46.

Медленная загрузка картинок
Немного лучше с go-bindata, statik, ...
46

47.

Ограниченный API
Но есть всякие DrawImageOptions.ColorM и т.п.
47

48.

Очень жирный и медленный для веба GJS/WASM
9+МБ на пустышке
GJS еще и глючный
48

49.

“Но ENGO-то мне точно подойдет!”
49

50.

Engo
2D
Desktop, mobile, web
+ VulkanAPI
50
github.com/EngoEngine/engo

51.

Engo
Документация
51

52.

Engo
Документация
52

53.

Engo
Примеры
53

54.

Engo
A cross-platform game engine written in Go following an
interpretation of the Entity Component System paradigm.

v1.0 is now available!
...
54

55.

Engo
55

56.

Engo
Как включить рендер?
56

57.

Engo
// Setup is called before the main loop starts. It allows you
to add entities and systems to your Scene.
func (*myScene) Setup(u engo.Updater) {
world, _ := u.(*ecs.World)
world.AddSystem(&common.RenderSystem{})
}
57

58.

Engo
Как добавить спрайт
на сцену?
58

59.

Engo
type MySuperPuperGopher struct {
ecs.BasicEntity
common.RenderComponent
common.SpaceComponent
}
59

60.

Engo
type MySuperPuperGopher struct {
ecs.BasicEntity
common.RenderComponent
common.SpaceComponent
common.MouseComponent
}
60

61.

Engo
type MySuperPuperGopher struct {
ecs.BasicEntity
common.RenderComponent
common.SpaceComponent
common.MouseComponent
common.AnimationComponent
}
61

62.

Engo
type MySuperPuperGopher struct {
ecs.BasicEntity
common.RenderComponent
common.SpaceComponent
common.MouseComponent
common.AnimationComponent
common.AudioComponent
}
62

63.

Engo
type MySuperPuperGopher struct {
ecs.BasicEntity
common.RenderComponent
common.SpaceComponent
common.MouseComponent
common.AnimationComponent
common.AudioComponent
common.CollisionComponent
}
63

64.

Engo
Компоненты сами себя не обновят
64

65.

Engo
Компоненты сами себя не обновят
func (*myScene) Setup(u engo.Updater) {
world, _ := u.(*ecs.World)
world.AddSystem(&common.RenderSystem{})
world.AddSystem(&common.MouseSystem{})
world.AddSystem(&common.AnimationSystem{})
// ...
}
65

66.

Engo
66

67.

Engo
67

68.

Engo
Как обработать click/tap?
68

69.

Engo
btn.AddToWorld(u)
mouseSystem.Add(&btn.BasicEntity, &btn.MouseComponent,
&btn.SpaceComponent, &btn.RenderComponent,
)
scene.World().AddSystem(&systems.MousableSystem{
Callback: func(dt float32) {
if btn.MouseComponent.Clicked {
scene.join()
}
}})
69

70.

Engo
70

71.

Engo
“All problems in computer science
can be solved by another level of
indirection”
David Wheeler
71

72.

Engo
- Странная реализация ECS
72

73.

Engo
- Странная реализация ECS
// RunOptions are the options used to Run engo
type RunOptions struct {
// Update is the function called each frame during the runLoop to
update all of the systems. If left blank, it defaults to &ecs.World{}. Use
this if you plan on utilizing engo's window / GL management but
don't want to use the ECS paradigm.
Update Updater
}
73

74.

Engo
- Странная реализация ECS
- Баги, нехватка документации
74

75.

Engo
- Странная реализация ECS
- Баги, нехватка документации
- Работает
75

76.

Engo
Нативный на компе
76

77.

Engo
Браузер на компе
77

78.

Engo
Браузер на компе
Сеть?
gorilla/websocket
+
js.Global().Get(`WebSocket`)
78

79.

Engo
Браузер на компе
Производительность?
Пару секунд мир подождет
79

80.

Engo
Браузер на телефоне
Samsung / iPad
80

81.

Engo
Браузер на телефоне
Samsung / iPad
GJS / WASM файл: 7+МБ
Парсинг на ноуте: 2 сек
Парсинг на телефонах: +∞
81

82.

А если Go...
“А разве еще что-нибудь есть?”
82

83.

Handmade Web HTML5
83

84.

Handmade Web HTML5
- WebGL
github.com/nuberu/webgl
- js WebSockets
- GopherJS / WASM
84

85.

Handmade Web HTML5
Ebiten - 9 МБ
Engo - 7 МБ
Фигак-фигак - 1.5 МБ
85

86.

Handmade Web HTML5
Ebiten - 9 МБ
Engo - 7 МБ
Фигак-фигак - 1.5 МБ
86

87.

DEMO TIME
87
Картинка: https://www.teepublic.com/t-shirt/5102595-golang-gopher-unicorn

88.

Demo
88

89.

Demo
Попробовать:
ater.me/go_races
Исходники:
github.com/atercattus/golangconf19_examples
89

90.

Что выбрать?
- Desktop
Godot-go выглядит круто / Raylib для души
- Mobile
Android ‒ raylib; iOS ‒ ?
- Web
Handmade или никак
90

91.

ater.me/conf/goc19.pptx Презентация
ater.me/go_races
vk.com/ac
@atercattus
91
Демка
Вопросы
English     Русский Rules