Ponto V!

Home Arquitetura Programação Funcionamento de um jogo
Bruno Crivelari Sanches
Funcionamento de um jogoImprimir
Escrito por Bruno Crivelari Sanches
Índice do Artigo
Funcionamento de um jogo
Objetos do Jogo
Rede
Todas Páginas

Jogos são aplicativos multimídia que funcionam em tempo real, neste artigo vamos explorar um pouco de como esses aplicativos são implementados, desde o game loop a gerenciamento de recursos.

Hoje se compararmos um jogo com um aplicativo de janelas, como o um bloco de notas, podemos ver que entre os dois existe uma diferença crucial, que é o fato do jogo rodar em tempo real e o bloco de notas ficar parado esperando que algo aconteça. O bloco de notas (e aplicações de janela em geral) são aplicativos orientados a eventos, ou seja, quando são executados eles fazem a inicialização, criação de janelas, carregam recursos, etc. Depois entram no chamado “loop de mensagens”, que é onde o aplicativo consulta o sistema operacional (ou o gerenciador de janelas) para ver se algo aconteceu, se nada ocorreu o aplicativo fica “parado” esperando uma mensagem (ou evento) chegar.

O ficar “parado” aqui quer dizer que o aplicativo não vai estar consumindo CPU (ou apenas um minimo desta), pois o sistema operacional vai ter tirado ele da fila de execução. Quando um evento ocorre (por exemplo, o usuário digitou algo) é gerado um evento que o sistema operacional envia ao aplicativo, que então desperta, processa o evento (imprimindo o texto na tela, caso seja preciso) e depois se não houverem mais eventos fica parado novamente.

Programas em Tempo Real

Os jogos são aplicativos em tempo real devido a estes terem que prover uma “resposta” ao jogador o mais rápido possível, de modo que o jogo parece estar “fluindo” como um filme ou uma cena da vida real, mas na verdade não é bem assim que acontece.

Um jogo funciona de maneira semelhante a um desenho animado ou a um filme de rolo, sua principal tarefa é gerar imagens (apesar dos sons serem importantes, vamos dar um foco maior as imagens para simplificar) e mostrar estas na tela e ir trocando por novas imagens de maneira a dar sensação de algo animado. Filmes costumam trabalhar com uma taxa de 24 quadros por segundo, onde quadro é a imagem que vemos na tela, assim a cada segundo são exibidos na televisão 24 imagens diferentes, que causam a ilusão de movimento ao olho humano.

No caso dos jogos 24 quadros (os famosos frames por segundo ou FPS) costuma ser um número razoável, mas é notável a diferença quando um jogo consegue atualizar a tela taxas mais altas, como por exemplo 60 quadros. Essa taxa de 60 quadros costuma ser o frame rate máximo de um jogo, pois a maioria dos monitores trabalham nessa mesma frequência, sendo assim se o jogo passar a desenhar mais quadros do que a frequência que o monitor suporta estes quadros extras não vão ser exibidos, sendo descartados.

Dispositivos de Entrada

Além de exibir as imagens na maior velocidade possível, um jogo precisa também dar resposta aos comandos do jogador, que no caso de um computador é comum utilizar o teclado e mouse para este fim. O jogo então antes de desenhar algo na tela verifica o estado destes dispositivos, caso o jogador tenha tomado alguma ação (como atirar) o jogo responde de maneira adequada, desenhando o tiro no próximo quadro, ligando o som, etc.

É fundamental perceber que a taxa com a qual o jogo lê os comandos do jogador e os processa 'é importante para uma boa jogabilidade, pois caso o jogo atualize o video a 60 quadros por segundo, mas processe a entrada a apenas 10 quadros por segundo, o jogador certamente vai ter uma sensação de lentidão nas respostas.

Loop Principal

Como já temos uma noção do que é um jogo vamos ver o esquema básico de funcionamento do mesmo. Para passar a sensação de tempo real o jogo precisa atualizar a tela o mais rápido possível e processar os comandos do jogador no mesmo ritmo, a maneira de realizar estas tarefas varias vezes é utilizando o que chamamos de loop principal (main loop) que é simplesmente um loop onde tudo acontece, que pode ser estruturado como:

void main()
{
   loadResources();

    while(!quit())
    {
        readInput();
        updateGame();
        drawGame();
    }
}

O loop acima (feito com um pseudo-código C) faz algumas tarefas, para começar, antes do loop o jogo carrega todos os recursos que este utiliza (imagens, sons, níveis, etc), depois ele entra no loop principal, onde ele lê os dispositivos de entrada, atualiza o jogo e por fim desenha o jogo na tela.

Este joguinho realmente simples vai ficar apenas rodando o mais rápido possível, mas este loop tem um sério problema, ele não controla o tempo. Por causa disso, o jogo vai funcionar mais rapidamente ou lentamente conforme a capacidade do computador. Sem falar que quando o jogador chegar em um ponto onde o loop gaste mais tempo para executar (como uma sala cheia de inimigos) o jogo vai rodar mais lento devido a demora maior do loop, parecendo estar então rodando em câmera lenta.

Para manter então sempre a mesma fluidez é preciso que o jogo controle o tempo e atualize-se de acordo, por exemplo, um inimigo que se desloca a 2 metros por segundo, deve sempre andar 2 metros por segundo, não a 1 metro por segundo ou 3 metros por segundo conforme a capacidade do computador, então vamos adicionar um controle tempo ao jogo:

void main()
{
    loadResources();

    float lastTime = getTime();

    while(!quit())
    {
        float delta = getTime() - lastTime;
        lastTime = getTime();

        readInput();
        updateGame(delta);
        drawGame(delta);
    }
}

Agora antes do loop o jogo armazena em uma variável o tempo atual, depois no inicio do loop ele calcula quanto tempo passou desde o ultimo loop e atualiza o tempo atual. Com isso temos o delta (a diferença de tempo) entre um loop e outro (vamos assumir aqui que a unidade de tempo usada é o segundo). Agora na chamadas de updateGame e drawGame passamos como parâmetro o tempo passado, assim o jogo pode ser atualizado com base no tempo real.

Vamos supor que temos um jogo rodando a 60 quadros por segundo, nesse ritmo o valor de delta vai ser de 0,016 segundos e no caso de um inimigo que se desloca a 5 metros por segundo, este vai se deslocar a 0,083 metros por quadro. Caso o jogador entre numa sala cheia de inimigos e isso derrube a taxa de quadros do jogo para 30 quadros por segundo, o delta vai passar a ser 0,033 e o inimigo vai passar a se deslocar 0,16 metros por quadro, dessa forma o jogo vai rodar sempre no mesmo ritmo, não importando o desempenho da maquina.

Claro que em um caso extremo onde a taxa de quadros do jogo caia a valores muito baixos a sensação de imersão vai ser prejudicada, estragando assim toda experiência do jogo.



Comentários (50)
  • Vitor Almeida da Silva  - Muito bacana
    avatar

    Muito bacana o artigo.

    É sempre importante comentar sobre as diferenças entre abordagens diferentes (no caso as arquiteturas) pra poder saber os prós e contras de cada uma e usá-las (ou não) da melhor maneira possível.

    É até engraçado, mas ontem mesmo eu tinha estudado o código da estrutura (struct mobj_s
    ) do Doom do iPhone e não tinha encontrado o que significava o prefixo "mob" (nem tinha imaginado)...

  • Bruno Crivelari Sanches
    avatar

    Obrigado Vitor!

    os códigos do Doom (e da Id em geral) são uma verdadeira escola, vale muito a pena gastar um tempo fuçando eles.

    O mais interessante desses códigos é como eles usam técnicas relativamente simples para fazer tarefas que muitos acabam complicando.

    Custou para eu descobrir também de onde vinha o nome :).

  • José Ricardo  - Excelente
    avatar

    Parabéns pelo artigo Bruno. Tenho aprendido realmente muita coisa com o site. Este seu novo artigo também está excelente.

    Valeu!!! :lol:

  • Bruno Crivelari Sanches
    avatar

    Obrigado José! É muito bom saber que as pessoas tem conseguido aprender e entender os artigos :).

  • Alan de Oliveira
    avatar

    Muito bacana o artigo.
    A propósito, qual seria o significado de mobj_s ?
    XD~ também estou curioso agora.

  • Bruno Crivelari Sanches
    avatar

    Valeu Alan!

    Esta la no texto hein o significado, não vou contar :evil: .

  • Bruno
    avatar

    Muito bom o artigo. Parabéns!
    A criação de jogos está cada vez mais interessante. Você poderia indicar alguns livros?

  • Lopídio Guigui  - Excelente artigo!
    avatar

    Ótimo artigo.
    Já fazia um tempo que eu procurava algo parecido com isso pela internet.
    Incrível, bastante esclarecedor!
    Aliás, como todo o site!

    Parabéns, vocês ganharam um fã!

  • Bruno Crivelari Sanches
    avatar

    Pessoal, muito obrigado pelos elogios! Fico feliz em saber que os artigos tem ajudado!

  • Gustavo Campos  - Ótimo artigo
    avatar

    Parabéns pelo artigo, muito bom. Cheguei até ele pois estava escrevendo sobre o auxilio dos conceitos da programação de jogos em simuladores de negócios.

  • 9-volt  - 9-volt
    avatar

    cara estou estudando Java, quem sabe qua ndo eu me desenvolver mais eu aprenda a fazer um joguinho.

  • Sora  - Muito legal!
    avatar

    Gostei muito do artigo, com certeza essas técnicas que foram mostradas vão ajudar muita gente. Parabéns! :)

  • Roberval Sena  - mais exemplos?
    avatar

    rapaizz

    eu to aqu estudando C++, e já brinco com outras linguagens... e o que fica pra mim é a falta de exemplos....

    tipo... será que existe um jogo com os códigos de cliente e servidor pra eu poder ver como é o "andar da carruagem?"?

    sabe .. brincar com algo que esteja andando.. por a mão....

    pq do zero.. nossa como dói!

    []s Sena

  • Jeison Frasson  - MMO
    avatar

    Gostei muito da postagem, mesmo por que eu já trabalhava com esse ultimo conceito de cliente executar o jogo, porem sofro de mais com LAG pois programo jogos em php + JS

    agora decidi partir para JAVA

    esse é um teste que estou fazendo em php + js para um mmoRPG

    londor3.londor.com.br

    como disse meu problema é o tempo de resposta de clientes para clientes já que fazer 60 consultas em php por segundo é homicídio de banda

    até mais

  • Fernando  - Ajuda !!! Urgente
    avatar

    Olá pessoal, tenho um cliente meio urgente, e não sei onde encontrar tal profissional, meu cliente precisa,alias quero montar um site de jogos no estilo click jogos, desenvolvemos toda a estrutura do site e funcionalidades, porem os jogos estão sendo um grande problema, são 3 jogos iniciais, jogos de carta, sinuca e poker, tudo isso com usuarios em tempo real, com chat e video conferencia nas salas vip, enfim todo o projeto esta desenvolvido e ja desenhado. Agora com relação aos jogos, ainda nao encontrei quem possa desenvolver, encontrei um programador conheci alguns de seus trabalhos mas me cobrou 3 mil reais pelo desenvolvimento dos jogos no site, um outro amigo me disse que está caro, por se tratar de jogos que na maioria das vezes ja tem pronto é so adaptar ao sistema do site, mas não conheço e me indicaram voces como sendo a melhor fonte para descobrir isso, agradeço a ajuda de quem puder me retornar essa questão, grande abraço e parabens pelo site.

  • Bruno Crivelari Sanches
    avatar

    Olá Fernando,

    por esse valor ou menos não sei de ninguém que faria.

    O desenvolvimento disso não é tão simples e mesmo tendo jogos prontos por ai não é apenas "adaptar" no site, podem surgir n problemas.

    Se o programador cobrou esse valor e garantiu que vai entregar tudo pronto com as funcionalidades que você esta pedindo, não acho caro.

    Certamente tem pessoas que fariam por bem menos, mas tem que tomar cuidado para o barato não sair caro.

  • Vinícius Godoy de Mendonça
    avatar

    Lembre-se também que na maioria das vezes você não pode simplesmente copiar o código de outro e comercializá-lo. Além de adaptações necessárias, como citou o Bruno, você poderia sofrer um problema legal, caso o criador do software resolva questionar a autoria.

    O programador, com razão, deve ter cobrado o desenvolvimento integral do software.

    Além disso, a menos que seu conteúdo seja exclusivo, você precisará também pagar pelas imagens e sons do seu jogo.

  • adailton  - manero
    avatar

    :) muito bom post eu ja suspeitava que o jogo era nada mais que muitos fps em segundos agora imagina um mmorpg como o runescape mais de 10 mil online enviando para o servidor mensagens e atualizaçoes com 60 quadros por segundo e o jogo e em browsers.

  • Bruno Crivelari Sanches
    avatar

    Obrigado Adailton!

    Apenas um detalhe: um MMORPG e geralmente qualquer outro jogo multiplayer não mantém a parte de rede rodando a 60 fps, quando muito o sistema de rede roda a 10 fps. Mas se considerarmos um ping nacional típico de 200ms, temos apenas 5 fps na parte de rede.

    T+

  • adailton  - voltei
    avatar

    cara tive quebrando a cabeça com uns mmorpg e nao consigo entender como sao feito as comunicaçoes, server e cliente.

    sera que é assim quando o cliente se move é aberto um socket com servidor e depois que foi ecoado para todos o socket é fechado?

    porque eu nao entendo com é que o servidor consegue fazer comunicaçao entre 100 clientes sustentando posiçao,imagem,level,nome etc, e nao sei onde fica armazenado essas variaveis.

    tive a ponto de fazer um com java no lado do server e javascript no lado do cliente só que nao consegui encontrar uma maneira de lidar com os sockets entre os dois.


    tentei com esse servidor java: http://jwebsocket.org/

    mas eles nao tem um passo a passo nem um helow world nem nada.

    estamos precisando de um passo a passo de como fazer isso.

  • Bruno Crivelari Sanches
    avatar

    Não, a conexão é aberta assim que você carrega o jogo. O cliente vai conectar no server, fazer autenticação, etc. Isso pode ser feito com udp ou tcp, tanto faz...

    No jogo a comunicação é feita via UDP e o socket fica aberto tempo todo. O cliente é o que chamamos de terminar burro. Quando você manda ele andar ele envia um pedido ao servidor, que movimenta ele e depois lhe manda sua nova posição.

    Claro que isso gera um lag absurdo, dai entra o que chamamos de predição ou previsão, o cliente tenta prever para onde vai mover e se movimenta, depois só confirma a posição com o servidor. Mas a autoridade é sempre o server.

  • adailton  - entendi
    avatar

    entao digamos que eu me em seu jogo e la vai ter as tabelas:

    nome = adailton

    senha = 1234

    personagem = teste

    posiçaox = 120

    posiçaoy = 250

    vou logar ai digito meu login e senha no server, e entro digamos que voce esta no jogo:

    nome = vinicíus

    personagem = vinicius

    posiçaox = 300

    posiçaoy = 400

    como que ao entrar no jogo o servidor vai lidar com esses dados tipo variavel nome, prsonagem, posiçaox, posiçaoy. e vai destinguir o seu avatar do meu? esses dados sao armazenados em variaveis? ou tem outro geito?

    ou esses dados fica no cliente tipo chat ele péga oque esta digitado nos campos nome, e mensagem, e manda para o servidor assim

    adailton mandou uma mensagem: oi

    e na sala do jogo pegaria meu nome posiçao e imagem e e enviaria para quem estivesse na sala?


  • Bruno Crivelari Sanches
    avatar

    Você esta falando de um MMO usando html? Desses jogos interativos via web? Nesse caso não tem diferença de um app web qualquer.

    E nem tem porque se preocupar com sockets, nenhum framework moderno deixa você sequer chegar perto de algo parecido com socket.

    T+

  • adailton  - javascript
    avatar

    seria na verdade java(server) html + javascript(cliente) da mesma forma do jwebsocket. no jwebsocket o socket ou seila oque é declarado em uma variavel pelo cliente assim:

    var host = "ws://localhost:8000//server";

    nao seria bem um jogo seria uma pagina na web como se fosse uma sala de jogo, onde os visitantes podessem ver oque os outros estivessem fazendo

    parecido com isso aqui: http://dkozar.com/flash/izometrija.html só que em javascript sei fazer mapa personagem e tudo só nao sei como torna-lo multplayer.

  • Bruno Crivelari Sanches
    avatar

    Nesse caso eu acho que não diferencia muito de um jogo tradicional. O básico mesmo é simplesmente transmitir a posição do personagem para o servidor e este replicar para os clientes.

    Problema é que pelo jeito websockets somente via TCP, isso pode gerar um bocado de lag.

    T+

  • Anônimo  - MUITO BOM
    avatar

    Só tenho uma coisa para dizer sobre o artigo :D e é :

    MAMA MIA :woohoo:

  • Bruno Crivelari Sanches
    avatar

    Muito obrigado! :)

  • Anônimo  - Bruno uma ajudinha
    avatar

    :) Bruno você esta on-line filho? Poderia me passar uns links sobre controle de pacotes UDP não consigo imaginar como faze-lo. Estou pensando de usar o Raknet ele ja vem com todo o controle né? Obrigado.

  • Bruno Crivelari Sanches
    avatar

    Nesse link existe uma explicação sobre como fazer com o UDP: http://gafferongames.com/networking-for-game-programmers/reliability-a nd-flow-control/

    No caso da Raknet que eu saiba a lib já cuida de tudo para você.

    T+

  • augustowebd  - calculo de delta
    avatar

    Olá Bruno,

    Em primeiro lugar eu gostaria de parabenizá-lo pelo excelnte artigo.

    Lendo o artigo eu fiquei com uma dúvida que é a seguinto: "vamos supor que temos um jogo rodando a 60 quadro por segundo, neste ritmo o valor de delta vai ser de 0,016 segundos"

    Estamos assumindo que que a diferença de tempo foi de 3,750seg?
    (delta = 3,750/60).

    Caso meu entimento esteja errado, poderia por favor me explicar?

    Grato mais uma vez.

  • Bruno Crivelari Sanches
    avatar

    Obrigado Augusto!

    Não, o tempo vai ser 1 segundo. O delta indica quanto o tempo variou entre um quadro e outro. Se temos uma taxa de 60 quadros por segundo, então temos: 1/60 = 0,1666666...

    T+

  • Anônimo  - re:
    avatar
    Bruno Crivelari Sanches Escreveu:
    Obrigado Augusto!

    Não, o tempo vai ser 1 segundo. O delta indica quanto o tempo variou entre um quadro e outro. Se temos uma taxa de 60 quadros por segundo, então temos: 1/60 = 0,1666666...

    T+

    Agora sim entendi.

    Grato!

  • Marcius  - Parabéns
    avatar

    Valeu mesmo cara, deu uma esclarecida legal nas ideias.

  • Bruno Crivelari Sanches
    avatar

    Obrigado Marcius

  • Felipe Merlim  - .
    avatar

    Bruno,você conseguiria mostrar o diagrama de classes de god of war?

  • Anônimo
    avatar

    Não tem como, não sei detalhes do código, a empresa não divulgou muita coisa.

  • Wagner  - Acessar a continuação
    avatar

    Não consigo acessar as sessões Objetos do Jogo e Rede do artigo. Gostaria que arrumassem. Grato.

  • Anônimo
    avatar

    Testando aqui e todos abriram normalmente.

    Qual navegador?

  • Wagner
    avatar

    Google Chrome Versão 23

  • Wagner
    avatar

    Agora funcionou :whistle:

  • Marcos Silva
    avatar

    Cara muito bom o artigo, tava procurando por algo assim faz um tempinho

  • Anônimo
    avatar

    Obrigado Marcos!

  • adailton  - programaçao
    avatar

    obrigado pelo belo post. :D

    como funciona as animaçoes tipo a parte do tiro eu entendi mas:

    mas se meu jogo for em fps 'frames por segundo' , tenho um avatar movendo um background com 6 imagens e para que outros players vessem eu me movendo eu teria que enviar para o servidor a posiçao do background a cada 2ms para o servidor atualizar meu movimento para outros jogadores que estão na area de visão do mapa.


    esse envio de posiçao do background nao iria derrubar meu servidor?

    exemplo; tenho um loop for correndo em um background que faz animaçao do avatar eu envio todas aquelas animaçoes para o servidor em tao pouco tempo?

  • Anônimo
    avatar

    Você não precisa enviar tudo ao servidor, o servidor já sabe as propriedades do seu avatar, idem para animação.

    Se ele esta andando, o servidor já sabe que tem que rodar a animação dele andando e os outros clientes também, não precisam saber mais nada.

    A mesma coisa é o background, se o servidor sabe que você andou, sabe que tudo mudou.

  • Jadson
    avatar

    Muito informativo. Parabéns!
    (A propósito, apesar de ver perfis com avatar, não achei onde me registrar no site. É possível? rs)

  • Anônimo
    avatar

    Oi Jadson, registro hoje só para autores. Não existe nada especifico para leitores :).

  • michel
    avatar

    Boa ...Seguinte queria ver se pode me ajudar ...

    Tenho que criar um jogo river raid em c..

    MAs estou sem saber como começar ...

    Tem como dar um Luz ...algum código ...Obrigado !!!T+++

  • Anônimo
    avatar

    Vai fazer do zero? Se sim, comece pelo básico, faça o código para inicializar uma janela, mostrar gráficos e vá evoluindo. Aqui no porta temos diversos artigos que cobrem coisas básicas, além de exemplos de jogos.

  • Rodrigo
    avatar

    Bruno, você teria algum material onde se explica a organização de objetos em forma de componentes?
    Obrigado desde já.

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter