Como o City-sim pode simular centenas de caracteres?


8

Meus jogos geralmente começam a ficar muito fáceis quando há algumas centenas de caixas representando possíveis personagens. Enquanto jogos como SimCity ou mesmo Anno têm centenas de personagens.

Percebi que esses jogos não atualizam tudo a cada tique, as necessidades são tratadas em intervalos e não é um problema de renderização, mas todas essas criaturas minúsculas têm um caminho individual, etc.
Eu simplesmente não consigo entender como eles podem puxar isso por milhares de caracteres, mesmo em máquinas antigas. Como eles fazem isso?

Esta questão foi atualizada para se referir a grandes números, onde os indivíduos realmente não contam e são simplesmente simulados para imersão e estética.

(Relacionado se se referir a caracteres individuais: Como o Dwarf Fortress controla tantas entidades sem perder o desempenho? )

(Pergunta diferente, mas talvez relacionada ?: Renderização de centenas de personagens animados no Unity3D )


2
Isso realmente não parece uma duplicata para mim. Embora jogos como o Dwarf Fortress simulem as ações de todos os agentes individualmente, uma vez que realizamos jogos em escala de cidade, conforme descrito nesta pergunta, isso não é mais muito prático. Em vez disso, esses sims geralmente operam em um nível mais "fragmentado" de tendências populacionais, preenchendo os detalhes de pessoas que seguem essas tendências apenas quando você olha de perto. Devido a essas diferenças nas estratégias, acho que vale a pena reabrir e responder separadamente da questão vinculada.
DMGregory

Fiz algumas alterações para destacar as diferenças. Como desvincular as perguntas?
precisa

A otimização de desempenho é um campo muito amplo. Há um milhão de coisas que você poderia fazer de errado no desempenho do jogo. Mas, sem olhar para o seu jogo e a saída do profiler, é difícil saber onde estão os seus gargalos. Agora, poderíamos filmar no escuro e refletir sobre a localização da memória, o paralelismo ou os algoritmos avançados de busca de caminhos para vários agentes, mas é difícil dizer o que você já sabe e o que se aplica ao seu jogo. Por isso, tenho medo de que essa questão seja muito ampla.
21417 Philipp Philipp

Você já tentou o pool de objetos? Instanciação é caro, activando e desactivando objectos já não é instanciado (tanto)

Você também pode usar um emissor de partículas. Como eles são apenas uma representação visual de dados demográficos, eles não precisam ser inteligentes ou complexos.
21717 Stephan

Respostas:


12

Como grande parte do gamedev, a resposta de como os jogos sim da cidade realizam esse feito aparentemente impossível é: provavelmente não. Eles estão apenas fingindo bem. ;)

Sims como esses normalmente operam em um nível "fragmentado", modelando grupos de pessoas, bairros, corredores de tráfego ou outras dinâmicas da cidade como um todo, em vez de processar a IA para cada um dos milhares ou milhões de residentes.

Existem algumas maneiras pelas quais podemos abordar isso:

  • "Esparso" de baixo para cima: aqui ainda simulamos residentes individuais da cidade, mas não "muitos" deles, e nem todos os cenários. Você pode pensar nisso como uma pesquisa ou censo emitido para uma amostra aleatória das pessoas a cada semana. Você interpola os resultados para obter estimativas da população virtual mais ampla - onde eles moram, sua vocação, renda, dados demográficos etc.

    Por exemplo, se você simular apenas uma centena de residentes em sua cidade, e 5 deles forem estudantes, poderá estimar que cerca de 5% da população de sua cidade são estudantes e modelar a demanda por escolas de acordo.

    Pode ser necessário gerar novamente amostras aleatórias a partir da distribuição da população da sua cidade ocasionalmente, para evitar excesso de aglomeração / escassez (por exemplo, se um bairro se tornar impopular e todos os residentes do seu censo se afastarem, você deve observar o êxodo sem deixá-lo completamente sem representação no seu sim!)

  • De cima para baixo: aqui você cria uma fórmula mestre que analisa sua cidade e modela sua dinâmica como um todo. Em um estilo semelhante à macroeconomia, negligenciamos os detalhes de agentes individuais ou os consideramos um tipo de "fluido" continuamente divisível de atividade econômica que flui de acordo com as leis baseadas em princípios.

    Em vez de pensar nas preferências individuais e na variabilidade das pessoas, suas regras de jogo podem parecer mais com equações diferenciais relacionadas a proximidade de amenidades e taxas de impostos e produtividades e valores de propriedades e taxas de crimes ee e ...

  • Meio intermediário: vários híbridos entre os dois são possíveis - por exemplo, simulando cada "facção", "indústria" ou segmento demográfico da cidade como sua própria meta-pessoa, tomando suas próprias decisões individuais, mas espalhadas em um mapa de calor ou função de onda em toda a cidade, em vez de existir em qualquer órgão. Ou dividir a cidade em bairros onde cada um processa suas próprias regras de menor escala em interação com seus vizinhos.

Agora, quando o jogador aproxima o zoom o suficiente para ver pessoas individuais ou observa relatórios de estatísticas citando números de pessoas - essas não são necessariamente a verdade básica que está sendo usada para executar o sim. Em vez disso, eles podem ser um produto inferido disso.

Digamos que aumentemos o zoom em um quarteirão específico. No nosso sim geral da cidade, conhecemos a população aproximada dessa parte da cidade, os tipos de atividades que acontecem lá, as horas do dia em que ela está ativa. Portanto, sob demanda, podemos gerar um número apropriado de pessoas com as informações demográficas apropriadas realizando esses tipos de atividades lá. A IA deles pode ser muito simples, talvez tão pouco quanto reproduzir uma animação no local ou seguir um waypoint até a borda da porta / tela mais próxima, onde eles podem desovar.

Isso significa que geralmente não precisaremos procurar caminhos para todos os agentes. Em vez disso, podemos fazer um passe principal de mapeamento de fluxo em toda a rede rodoviária, para identificar o volume geral de diferentes tipos de tráfego ao longo de cada segmento. Então podemos gerar veículos suficientes do tipo certo nesses segmentos para refletir essa densidade. Uma vez gerados, os agentes podem apenas seguir com a direção local ou pontos de referência pré-gerados para chegar a um ponto de desova. Manter os armários de desova ao longo de cada segmento corretamente equilibrados com a taxa de desova permite manter qualquer volume constante de tráfego que desejamos.

Dessa forma, as pessoas e veículos que o jogador vê são invenções, como um sistema de partículas absorvido, dando a impressão de nuvens realistas sem calcular a dinâmica de fluidos em todas as moléculas de vapor. ;) Organizamos-os como curativos para comunicar o estado da simulação, em vez de controlá-lo.

Para muitos jogos, isso será suficiente. O jogador geralmente não é capaz de selecionar um agente individual para interrogá-lo sobre o que está fazendo lá ou para onde está indo; portanto, é difícil identificar as costuras e perceber se um agente faz algo que não faz sentido, como dirigir pelo mesmo quarteirão três vezes.

Mas se você precisar de agentes absolutamente consistentes em um ambiente densamente povoado, poderá procurar uma técnica elegante chamada " Geração de álibi ". Essa é uma técnica sofisticada de amostragem que permite gerar agentes que você esperaria encontrar em uma determinada situação. Então, se o jogador tentar investigar um com mais detalhes, você poderá retroativamente obter mais detalhes sobre o que está fazendo, de maneira consistente com o que o jogador observou até agora. A idéia é que você ainda obtenha os benefícios leves das pessoas que "substituem o papelão" a maior parte do tempo, mas no local elas podem criar um álibi plausível para passar como agentes totalmente simulados.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.