1 of 53

Construindo um game clássico da década de 70 em Go com suporte a multiplayer

2 of 53

Carlos Henrique

  • Formado em Ciências da Computação
  • Pós Graduado em Gestão de Projetos
  • 18 anos inserindo bugs em produção
  • 6 anos em Golang
  • Atualmente Backend Developer na Coinbase
  • Contribuidor em projetos Open Source

3 of 53

Renê Cardozo

  • Especializado em transformar cafeína em código de qualidade duvidosa
  • 5 anos desenvolvendo em Go
  • Senior Software Engineer - TRACTIAN
  • Formado em Ciência da Computação - USP

@reneepc

4 of 53

Agenda

  • Um pouco de história
  • Qual engine utilizar?
  • Desafios
  • Como detectar colisão?
  • Criando uma IA simples
  • Máquina de estados
  • Comunicação client-server
  • Goroutines, channels, context
  • Demo!

5 of 53

Um pouco de história

  • Pong é um jogo eletrônico de esporte de arcade com temática de tênis de mesa, com gráficos bidimensionais, desenvolvido pela Atari e lançado originalmente em 1972. Foi
  • 6502 Assembly foi a linguagem escolhida pelos desenvolvedores da Atari e foi originalmente lançada em 1947.
  • Pong foi o primeiro jogo comercialmente bem-sucedido e ajudou a estabelecer a indústria de jogos eletrônicos junto com o Magnavox Odyssey.

6 of 53

Um pouco de história

7 of 53

Qual engine utilizar?

  • gen2brain/raylib-go

  • oakmound/oak

  • hajimehoshi/ebiten

8 of 53

  • Ebitengine é uma biblioteca open source para criação de jogos 2D. Permite criar jogos de forma rápida e simples utilizando sua API.
  • Tudo é considerado uma imagem.
  • Suporte a Gráficos 2D, Mouse, Teclado, Gamepad, Touch, Áudio.
  • Cross-Platform: Windows, macOS, Linux, Web, Mobile e até para Nintendo Switch.

9 of 53

10 of 53

11 of 53

Ebitengine

  • 60 FPS por padrão
  • Draw
  • Update
  • Layout

12 of 53

Desafios

  • Aprender a mecânica e as funções da Ebitengine
  • Criar um mecanismo de colisão
  • Exibir estatísticas tais como FPS, Ping, …
  • Interagir com o usuário
  • Adicionar suporte ao modo multiplayer

13 of 53

Estrutura do Projeto

Lógica da engine

compartilhada

14 of 53

Como detectar colisão?

15 of 53

Como detectar colisão?

16 of 53

Criando uma IA simples

17 of 53

Lógica de Menu

18 of 53

Spaghetti

  • Apenas 3 menus já tornam a lógica de seleção enorme
  • Alto acoplamento entre componentes

19 of 53

State Pattern

Robert Nystrom

20 of 53

Menu State

Main menu

Name Input

Connecting

Playing

Watch

Level Selection

21 of 53

Menu State

Name Input

Connecting

22 of 53

State Pattern

23 of 53

State Pattern

24 of 53

Base menu

25 of 53

Base menu

26 of 53

Desacoplamento

27 of 53

Game State

Main menu

Connecting

Playing

Pause

Winner

28 of 53

Game State

Main menu

Connecting

Playing

Pause

Winner

29 of 53

Game State

Playing

Pause

30 of 53

Desacoplamento

31 of 53

Multiplayer

Client

Server

Inputs

Estado do mundo

  • Overhead mínimo para envio de mensagens

32 of 53

Multiplayer

Client

Server

Inputs

Estado do mundo

  • Full duplex
  • Real-time
  • Overhead mínimo para envio de mensagens

33 of 53

Multiplayer (HTTP)

Client

Server

Inputs

Estado do mundo

HTTP

  • Overhead mínimo para envio de mensagens
  • Full duplex
  • Real-time

34 of 53

Multiplayer (HTTP)

Client

Server

Inputs

Estado do mundo

HTTP

  • Overhead mínimo para envio de mensagens
  • Full duplex
  • Real-time

35 of 53

Multiplayer (WebSockets)

Client

Server

Inputs

Estado do mundo

WebSockets

  • Full duplex
  • Real-time
  • Overhead mínimo para envio de mensagens

36 of 53

gorilla/websocket

37 of 53

gorilla/websocket

38 of 53

coder/websocket

  • WASM support
  • O acesso de rede em WebAssembly é restrito
    • Erro de DNS, dial, etc.
  • Implementa build tags para detectar quando está rodando no browser e utiliza APIs específicas.

39 of 53

Goroutines (latência)

40 of 53

Goroutines (input)

41 of 53

User Network Context

42 of 53

Game loop

  • Ticker (60hz)

43 of 53

Frame update

44 of 53

Read Input

45 of 53

State Broadcast

46 of 53

Game State

47 of 53

Live streaming

48 of 53

Spectator (Live streaming)

49 of 53

Melhorias

  • Command Pattern (permite rebind)
  • Streaming das sessões
  • Replay das sessões
  • Utilizar custom UDP ao invés de TCP
  • Melhorias de performance

- channels vs Iterators

- generics vs interface

  • Não enviar mudança de estado quando não houver necessidade
  • Tocar som ao interagir

50 of 53

51 of 53

Demo!!

It’s only a demo sometime shit happens

pong.go-go.dev

52 of 53

Repositórios

pong-multiplayer-go

(game)

pongo-server

(server)

53 of 53

Obrigado

Carlos

Renê