Tópico AI do jogo RTS

14

Eu tenho um projeto para criar um jogo de estratégia em tempo real do zero. Ainda estou no estágio inicial de planejamento, mas tenho programado um pouco para ver a mecânica.

Eu sei programar. Também tenho uma boa idéia de como estruturarei as classes de jogos e a IA baseada em regras (máquina de estado) do jogador de computador.

Quero desenvolver Doutrinas, que darão um comportamento específico a uma unidade específica (mas podem ser usadas em muitas unidades ao mesmo tempo), como Escoteiro, Seguir Rota da Missão, manter Posição (atacar qualquer inimigo que se aproxima ou recuar se estiver sobrecarregado) etc ...

As doutrinas serão aplicadas apenas às unidades, portanto, elas terão uma perspectiva de unidade e não estarão cientes de toda a localização do mapa.

A IA do computador analisará todo o mapa visível e decidirá em qual sociedade atribuir cada unidade, dependendo de outro conjunto de regras.

Eu estou fazendo isso em c # com OpenGL.

Por enquanto, não tenho muito, apenas algumas coisas em testes antes de começar minha concepção principal. Eu tenho um loop de jogo no qual todo o processamento do jogo (onde chamarei o movimento de atualização, combate, renderização, etc, um após o outro) ocorrerá, é chamado com muita frequência se o evento Application.Idle.

Agora, eu estava pensando. Como haverá muitas coisas para processar no gameloop, a IA do computador e as unidades devem selecionar suas ações nesse loop ou será muito lento?

Se quiser que todas as coisas sejam simultâneas, devo criar um Thread separado para a IA do computador? Ou mesmo uma linha separada para cada unidade?

Não tenho muita experiência com multi-threading. Qual seria a melhor abordagem para isso?

Nate
fonte
Não relacionado - considerado Ogre3D em vez de OpenGL?
Na verdade, não, eu nunca ouvi falar disso. Estou usando o OpenGL, porque foi o que aprendi nas minhas aulas. O Ogre3D também pode fazer 2D? Suponho que sim, mas nunca sabemos ...
Sim, pode, tem até seu próprio kit de ferramentas da GUI (cegui). Por exemplo, o TorchLight é construído com ele. Ele pode economizar seu tempo, pois envolve muito bem o OpenGL. ogre3d.org/tikiwiki/MOGRE
"Ou mesmo uma linha separada para cada unidade" Inferno não. A sobrecarga de um encadeamento é muito grande. Por um lado, há a memória reservada para a pilha do encadeamento (1 MB por padrão). E as opções de rosca também são caras.

Respostas:

3

O que significa "do zero"? Você pode usar algo como XNA em vez disso com o DirectX?

Você deve renderizar algo entre 30 e 60 quadros por segundo para ter movimento fluido. Realmente não há necessidade de ter mais fps.

Se a renderização + lógica demorar menos do que os 16ms que 60fps fornece, não haverá necessidade de um encadeamento de AI.

Se você não tiver tempo suficiente entre renderizar os quadros, precisará pensar com muito cuidado sobre o que deve ser atualizado a cada quadro e o que não.

Suponho que a parte "doutrinas" seja a mais simples e eficiente possível, para que possa ser atualizada a cada quadro, pelo menos para unidades visíveis e outras unidades próximas. As unidades que não influenciam diretamente as unidades visíveis podem ser atualizadas com menos frequência (e, correspondentemente, com um delta T maior).

A AI principal tem mais trabalho a ser executado, pois precisa processar todas as unidades no mapa e descobrir uma estratégia, por isso deve exigir a maior parte do tempo de computação. É o primeiro candidato a um segmento separado.

Observe que você pode querer adicionar outra camada entre as duas, algo como um AI de nível de esquadrão. Basicamente, a IA de cada unidade deve garantir que a unidade responda "de maneira inteligente" à situação imediata, para que seja rápida e responsiva. A IA do esquadrão é responsável pelas ações "inteligentes" de várias unidades, espalhadas por vários segundos, como encontrar uma ponte se o esquadrão precisar atravessar um rio. E a IA principal deve direcionar as ações de muitos esquadrões por um longo período de tempo.

Especialmente se você não tem muita experiência, não faça threading se não precisar. Isso será complicado, pois é sem um ônus extra. Você pode aprender multithreading como um projeto separado ou como uma extensão deste quando estiver em um estado de funcionamento . Boa sorte!


fonte
0

Tenha um segmento separado para a IA. Mas não para todas as unidades, pois consumiria muitos recursos do sistema operacional e a sincronização seria um pesadelo.

Certifique-se de que o encadeamento de AI encontre uma oportunidade de execução. Não leve a sério, se o segmento principal faz muitas coisas, talvez nunca encontre essa oportunidade! Se você simplesmente der uma prioridade mais alta ao segmento de IA, o jogo ficará sem resposta, o que é inaceitável.

Portanto, selecione cuidadosamente pontos de sincronização e / ou eventos no loop principal e permita que o thread do AI conclua seus cálculos enquanto o thread principal para. Por exemplo, se a unidade do usuário vir outra unidade de AI, sincronize-a, para que sua unidade veja uma unidade atualizada vice-versa.


fonte
0

Também estou trabalhando em um jogo RTS do zero. Ainda não testei, mas minha ideia era executar a unidade AI no loop principal do jogo para todas as unidades que estão atualmente visíveis para o jogador (na parte da tela que o jogador realmente vê ou perto da borda da tela) ), pois é mais provável que o player mova a tela um pouco.

As outras unidades são verificadas em um thread separado, e eu tenho duas prioridades: 1. Unidades que estão em locais visíveis ao usuário se ele mover a tela para lá. 2. Unidades que estão em áreas ocultas (ainda não exploradas e "nevoeiro de guerra").

Para unidades com prioridade de segundos, eu corro o loop com menos frequência e compenso movendo-as retrospectivamente quando necessário.


fonte
1
Parece muito complicado.
Sua idéia soa bem, exceto na primeira parte, sobre como mover unidades para dentro e para fora do ciclo principal do jogo. Toda a IA deve ser feita em seu próprio loop, onde você pode optar por pular o loop todas as xiterações em unidades de baixa prioridade.
Olhovsky
0

Se você precisa multithread ou não, pode ser uma boa ideia preparar a IA para multithread.

Seu encadeamento principal atualizaria o mundo, marcaria a física etc., e então preencheria uma estrutura de dados que representa a visão de mundo da IA: posição das unidades, estado dos recursos, etc. Essa estrutura de dados armazenaria em cache os principais sistemas. do que apenas apontar para eles. Às vezes, isso é chamado de ponto de sincronização.

Passe essa estrutura de dados para a IA e permita apenas que ela raciocine sobre o conteúdo dessa estrutura. Se você achar que o AI precisa de mais informações, adicione-o à estrutura. Na linguagem da IA, isso geralmente é chamado de quadro-negro, mas também pode ser chamado de cache. Nunca deixe a AI gravar no cache, a saída deve passar por uma estrutura de dados separada.

Essa configuração permitirá que você paralelize o jogo porque a IA não tem mais nenhuma dependência direta dos outros sistemas de jogos. Esses sistemas não precisam ser seguros para threads e você nunca deve obter bloqueios. Você pode executar o renderizador com segurança ou algo assim enquanto a IA se afasta.

Como um benefício secundário, no futuro, você pode estender o cache deteriorando as informações obtidas dos outros sistemas ao longo do tempo, simulando incertezas em vez de conhecimento exato.

tenpn
fonte