Ponto V!

Home Arquitetura de Jogos Programação Funcionamento de um jogo
Bruno Crivelari Sanches
Funcionamento de um jogoPDFImprimir
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 (18)
  • 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.

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