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.