Suponha que você tenha um jogo no qual existem muitas (muitas) entidades que cumprem algumas funções, nem todas são constantemente necessárias ou precisam ser consideradas em todos os quadros. O problema concreto em que estou trabalhando, no qual esse problema está presente, é uma simulação detalhada de um corpo, incluindo seus órgãos.
No jogo, cada criatura tem seu próprio corpo, que é separado em partes menores (tronco, pernas, etc.) e, às vezes, essas partes contêm órgãos, que desempenham uma função específica dentro do corpo. Se um órgão atualmente serve ou não a um objetivo ou está ativo nunca é realmente claro. Afinal, um animal pode estar com o estômago vazio e, portanto, não precisa digerir nada. Seria bastante ridículo verificar ou simular cada objeto em cada quadro e muito caro assim que você tiver muitas criaturas no mundo. Então, eu estava pensando em uma maneira inteligente de diferenciar entre objetos que precisam ser atualizados e aqueles que não precisam.
O que eu criei parece uma solução pelo menos aceitável. Ele cria uma fila / pilha simples (essencial é que cada elemento seja removido assim que for lido; a ordem é irrelevante) chamada de "pilha de atenção" onde residem os objetos que precisam ser simulados. Objetos que precisam de atenção simplesmente se colocam na pilha ou são colocados lá por outros objetos. Esses objetos provavelmente implementariam uma interface simples com uma função simulate ().
Aplicado ao meu exemplo de digestão anterior, isso significaria:
O jogador escolhe algo para comer (suponha que seja pão) no inventário e o coloca na boca de seu personagem, e a boca é colocada na pilha de atenção. No próximo quadro, a boca é retirada da pilha e sua função simular () - é chamada. Como é uma boca, seria razoável simular a mastigação aqui. Isso pode continuar por alguns quadros em que a boca continua se colocando na pilha até decidir que o alimento está pronto para ser engolido. Nesse caso, a boca coloca o pão mastigado no estômago (eu sei que ele não vai diretamente para lá, mas o esôfago é deixado de fora para simplificação), que também é colocado na pilha de atenção. No próximo quadro, a simulação do processo de digestão é iniciada. E assim por diante para o restante dos órgãos necessários.
Um problema previsível com isso são os objetos inativos. Um animal adormecido é um bom exemplo disso. Isso pode ser feito conforme descrito anteriormente, mantendo o animal adormecido na pilha e verificando cada vez que ele precisa acordar, mas isso parece um desperdício, pois é a única coisa a ser feita. Para tornar os objetos ociosos mais eficientes, eu planejava adicionar um tipo de agendamento que armazena os trabalhos a serem executados em um horário específico. Se um animal for dormir, colocará um trabalho nesse horário que seria agendado por um certo período de tempo após o animal dormir. Esse trabalho cuidaria de colocar o animal adormecido na pilha de atenção novamente. Agora, você pode dizer que um animal adormecido que não está na pilha de atenção pode deixar de ser atacado por algo porque sua IA não é simulada,
Agora, sinceramente, não sei se isso é mesmo uma solução elegante para esse problema devido à falta de experiência. Estou perto de algo utilizável? Como isso geralmente é feito ou alguém tem sugestões ou soluções melhores?