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

Содержание

Слайд 2

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

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

Слайд 3

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

видео

трансляции

фотографии

голосовые сообщения

рассылка пушей

мониторинг

логи

Go RPC

CDN

аудио

документы

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

Слайд 4

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

видео

трансляции

фотографии

голосовые сообщения

рассылка пушей

мониторинг

логи

Go RPC

CDN

аудио

документы

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

Слайд 5

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

трансляции

фотографии

голосовые сообщения

рассылка пушей

мониторинг

логи

Go RPC

CDN

аудио

документы

игры

видео

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

Слайд 6

Подходы к GameDev’у

- Pascal (или Basic) DOS-графика

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

Слайд 7

Подходы к GameDev’у

- Pascal (или Basic) DOS-графика
- DirectDraw/DirectX, OpenGL

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

Слайд 8

Подходы к GameDev’у

- Pascal (или Basic) DOS-графика
- DirectDraw/DirectX, OpenGL
-

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

Слайд 9

Подходы к GameDev’у

Mail.ru Game Jam 2 (2017)
Unity (C#)

youtube.com/watch?v=WhxkAu-GAsw

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

Слайд 10

Внутренний хакатон
Go, GopherJS, WebGL

Подходы к GameDev’у

youtube.com/watch?v=no1ZJVJ1llk

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

Слайд 11

Внутренний хакатон
CoronaSDK (lua), WebGL

Подходы к GameDev’у

vk.com/app6810744

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

Слайд 12

Ludum Dare 42
- CoronaSDK (lua), WebGL
- ASEprite, sfxr, Bosca Ceoil

Подходы

Ludum Dare 42 - CoronaSDK (lua), WebGL - ASEprite, sfxr, Bosca Ceoil
к GameDev’у

ldjam.com/events/ludum-dare/42/
oh-no-this-is-monsters

Слайд 13

Ludum Dare 43
CoronaSDK (lua), WebGL
ASEprite

Подходы к GameDev’у

ldjam.com/events/ludum-dare/43/
ludumcoin

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

Слайд 14

Lua, Lua, Lua...

Где Go?

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

Слайд 15

Выбор в пользу Go

- Типизация, отладка, профилирование
- Поддержка в IDE

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

Слайд 16

А если Go...

Есть чё?

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

Слайд 17

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

А если Go...

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

Слайд 18

Какие есть игровые движки на Go

ENGi

Oak

Korok

g3n

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

Слайд 19

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

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

Слайд 20

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

- Живость

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

Слайд 21

ENGi
Desktop + GopherJS
“SUPER ALPHA v0.6”
Не обновлялся > 3 лет

github.com/ajhager/engi

Тот самый хакатон

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

Слайд 22

3D
Desktop
Не обновлялся > 3 лет

github.com/azul3d/engine

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

Слайд 23

Какие все еще есть игровые движки

ENGi

Oak

Korok

g3n

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

Слайд 24

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

- Живость
- Поддержка платформ

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

Слайд 25

Платформы

- Desktop
Windows, Linux, MacOS
- Mobile
Android, iOS
- Web

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

Слайд 26

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

- Живость
- Поддержка платформ
- Web HTML5

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

Слайд 27

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

- Живость
- Поддержка платформ
- Web HTML5

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

Слайд 28

Посмотрим на оставшиеся

ENGi

Oak

Korok

g3n

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

Слайд 29

Oak
Software renderer
Desktop Windows

github.com/oakmound/oak

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

Слайд 30

2D
Desktop

github.com/faiface/pixel

pixel-examples raycaster

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

Слайд 31

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

github.com/KorokEngine/Korok

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

Слайд 32

G3N
3D
Desktop cgo ‒ сломана
wasm syscall/js ‒ как?
Нет примеров
Почти нет документации

github.com/g3n/engine

github.com/danaugrs/gokoban

G3N 3D Desktop cgo ‒ сломана wasm syscall/js ‒ как? Нет примеров

Слайд 33

3D + 2D
Desktop, mobile, web
C++ / C# / GDScript

godotengine.org

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

Слайд 34

GDNative API
godotengine.org/article/look-gdnative-architecture
Плагин
.so, .dylib, .dll
Нет mobile, web

github.com/ShadowApex/godot-go

godot-go examples DodgeTheCreeps

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

Слайд 35

3D + 2D
C library

github.com/raysan5/raylib

raylib examples textures_bunnymark

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

Слайд 36

cgo binding
Desktop + Android

github.com/gen2brain/raylib-go

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

Слайд 37

Что остается?

ENGi

Oak

Korok

g3n

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

Слайд 38

2D
Desktop, mobile, web

github.com/hajimehoshi/ebiten

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

Слайд 39

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

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

Слайд 40

Примеры


Примеры …

Слайд 41

Примеры

Примеры

Слайд 42

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

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

Слайд 43

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

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

Слайд 44

Код ‒ Go Way

Код ‒ Go Way

Слайд 46

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

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

Слайд 47

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

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

Слайд 48

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

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

Слайд 49

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

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

Слайд 50

2D
Desktop, mobile, web
+ VulkanAPI

github.com/EngoEngine/engo

Engo

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

Слайд 51

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

Engo

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

Слайд 52

Engo

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

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

Слайд 53

Примеры

Engo

Примеры Engo

Слайд 54

A cross-platform game engine written in Go following an interpretation of the

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

v1.0 is now available!
...

Engo

Слайд 56

Engo

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

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

Слайд 57

Engo

// Setup is called before the main loop starts. It allows you

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

Слайд 58

Engo

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

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

Слайд 59

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

Engo

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

Слайд 60

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

Engo

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

Слайд 61

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

Engo

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

Слайд 62

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

Engo

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

Слайд 63

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

Engo

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

Слайд 64

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

Engo

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

Слайд 65

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

Компоненты сами себя не обновят func (*myScene) Setup(u engo.Updater) { world, _
...
}

Engo

Слайд 68

Engo

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

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

Слайд 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()

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

Слайд 71

Engo

“All problems in computer science can be solved by another level of

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

Слайд 72

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

Engo

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

Слайд 73

- Странная реализация ECS
// RunOptions are the options used to

- Странная реализация ECS // RunOptions are the options used to Run
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
}

Engo

Слайд 74

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

Engo

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

Слайд 75

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

Engo

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

Слайд 76

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

Engo

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

Слайд 77

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

Engo

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

Слайд 78

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

Engo

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

Слайд 79

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

Engo

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

Слайд 80

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

Engo

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

Слайд 81

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

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

Engo

Слайд 82

А если Go...

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

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

Слайд 83

Handmade Web HTML5

Handmade Web HTML5

Слайд 84

- WebGL
github.com/nuberu/webgl
- js WebSockets
- GopherJS / WASM

Handmade Web

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

Слайд 85

Ebiten - 9 МБ
Engo - 7 МБ
Фигак-фигак - 1.5

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

Handmade Web HTML5

Слайд 86

Ebiten - 9 МБ
Engo - 7 МБ
Фигак-фигак - 1.5

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

Handmade Web HTML5

Слайд 87

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

DEMO TIME

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

Слайд 89

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

Demo

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

Слайд 90

Что выбрать?

- Desktop
Godot-go выглядит круто / Raylib для души
-

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