Bem, eu sei que este post é bastante antigo, mas não pude resistir.
Recentemente, construí um mecanismo de jogo. Ele usa bibliotecas de partes 3d para renderização e física, mas eu escrevi a parte principal, que define e processa as entidades e a lógica do jogo.
O mecanismo certamente segue uma abordagem tradicional. Existe um loop de atualização principal que chama a função de atualização para todas as entidades. As colisões são relatadas diretamente por retorno de chamada nas entidades. As comunicações entre entidades são feitas usando ponteiros inteligentes trocados entre entidades.
Existe um sistema de mensagens primitivo, que processa apenas um pequeno grupo de entidades para criar mensagens. É preferível que essas mensagens sejam processadas no final de uma interação do jogo (por exemplo, criação ou destruição de uma entidade) porque podem interferir na lista de atualizações. Portanto, no final de cada ciclo do jogo, uma pequena lista de mensagens é consumida.
Apesar do sistema de mensagens primitivo, eu diria que o sistema é amplamente "baseado em loop de atualização".
Bem. Depois de usar este sistema, acho que é muito simples, rápido e bem organizado. A lógica do jogo é visível e independente dentro das entidades, não dinâmica como uma fila de mensagens. Eu realmente não faria isso orientado a eventos, porque, na minha opinião, os sistemas de eventos introduzem complexidade desnecessária à lógica do jogo e tornam o código do jogo muito difícil de entender e depurar.
Mas também acho que um sistema "baseado em loop de atualização" puro como o meu também tem alguns problemas.
Por exemplo, em alguns momentos, uma entidade pode estar em um estado "não faça nada", pode estar esperando o jogador se aproximar ou algo mais. Na maioria dos casos, a entidade gasta o tempo do processador por nada e é melhor desligá-la e ativá-la quando um determinado evento acontece.
Então, no meu próximo mecanismo de jogo, adotarei uma abordagem diferente. As entidades se registrarão para operações do mecanismo, como atualização, desenho, detecção de colisão e assim por diante. Cada um desses eventos terá listas separadas de interfaces de entidade para as entidades reais.