Desenvolvimento de um Escalonador de Cenas para motores de jogos

Lucas Pinheiro Otaviano André

Por que separar o código do jogo do código dO MOTOR ?

  • Prática utilizada em jogos, como Doom da Id Software
  • Separação bem definida entre o código do jogo e motor
  • Fácil de reutilizar
  • Maior organização
  • Maior manutenabilidade de código
  • Baseado no conceito de um escalonador de cenas
  • Utilizado no Nightmare Fiction Framework

Por que separar o código do jogo do código dO MOTOR ?

Fonte: Game Engine Architecture Second Edition - Jason Gregory

  • Motor de jogos desenvolvido em C++(11)
  • Utilizando Modern OpenGL(GL3.3+)
  • Atualmente sendo utilizado para o desenvolvimento de um fã game de Resident Evil.
  • Código aberto sobre a licença MIT 

NF FRaMEwork

ESCALONADORES SISTEMAS OPERACIONAIS

  • O escalonador vai despachar o processo que deve ser executado no momento
  • Cada processo tem um estado e dependendo do estado o escalonador vai realizar diferentes tarefas com ele (inicializar, executar, encerrar).
  • Prática geralmente utilizada por escalonadores de Processos e Threads

DESENVOLVIMENTO

  • A partir dessa ideia de escalonador, temos o conceito de Escalonador de Cenas. 
  • Uma cena é uma classe genérica que vai utilizar o conceito de polimorfismo, onde as classes que herdam dela podem ter seu comportamento modificado através da herança.
  • O controle de uma cena é feito através  do escalonador 

DESENVOLVIMENTO

Estados de uma cena

  • A cena diz ao escalonador através dos estados, o que deve fazer com a cena que está sendo executada.
  • O escalonador vai ser executado com frequência e verificar o estado atual da cena que está sendo executada. As ações tomadas por ele variam de acordo com o estado da cena. 
  • O escalonador deve garantir que quando uma cena for encerrada os recursos alocados por ela devem ser liberados da memória.

Estados de uma cena e escalonador

  • Caso a cena esteja no estado INIT, o escalonador deve passar a referência dos objetos utilizado por essa cena e após isso chamar a função para inicializar os recursos da cena.

Estados de uma cena e escalonador

  • Caso a cena esteja no estado INIT, o escalonador deve passar a referência dos objetos utilizado por essa cena e após isso chamar a função para inicializar os recursos da cena.
  • Caso a cena esteja no estado RUN, o escalonador apenas vai executar a função de maquina de estados da cena.

Estados de uma cena e escalonador

  • Caso a cena esteja no estado INIT, o escalonador deve passar a referência dos objetos utilizado por essa cena e após isso chamar a função para inicializar os recursos da cena.
  • Caso a cena esteja no estado RUN, o escalonador apenas vai executar a função de maquina de estados da cena.
  • Caso a cena esteja no estado SLEEP, o escalonador deve pegar qual a próxima cena e alocar se necessário. Caso ela esteja no estado SLEEP, o escalonador deve mudar o estado da cena para RUN.

Estados de uma cena e escalonador

  • Caso a cena esteja no estado INIT, o escalonador deve passar a referência dos objetos utilizado por essa cena e após isso chamar a função para inicializar os recursos da cena.
  • Caso a cena esteja no estado RUN, o escalonador apenas vai executar a função de maquina de estados da cena.
  • Caso a cena esteja no estado SLEEP, o escalonador deve pegar qual a próxima cena e alocar se necessário. Caso ela esteja no estado SLEEP, o escalonador deve mudar o estado da cena para RUN.
  • Caso a cena esteja no estado END, o escalonador deve pegar qual a próxima cena e alocar se necessário. Caso ela esteja no estado SLEEP, o escalonador deve mudar o estado da cena para RUN. Como o estado da cena atual é END, o escalonador deve liberar todos os recursos alocados por ela.

Funcionamento

Trabalhos futuros

  • Compartilhamento de recursos entre cenas, assim, uma cena pode enviar um buffer contendo informações para a outra cena.
  • Paralelismo de cenas, nessa melhoria o escalonador pode utilizar threads e executar duas cenas ao mesmo tempo. Isso seria útil quanto por exemplo, precisamos de uma cena secundária que vai carregar os recursos(texturas, modelos 3d, cenários) enquanto a primaria renderiza o que já foi carregado pela cena secundária. 

ESCALONADOR DE CENAS

Dúvidas ?

Github: https://github.com/St4rk/nightmare-fiction