Pergunta

O tipo de jogo de simulação que eu tenho em mente é o tipo onde você tem coisas para construir em vários locais e trabalhadores / transportadores que conectam esses locais.

Algo mais parecido com a série Settlers.

Vamos supor que eu não quero que todos os gráficos no momento, que eu acho que posso controlar.

Então, minhas dúvidas são as seguintes:

  1. deve cada entidade ser uma classe e cada um tem um fio?
  2. entidades devem ser agrupados em listas dentro de classes e cada um tem um fio?

Se um toma implementação 1, que vai ser muito difícil de ser executado em máquinas de baixa especificação e não escala bem para grandes números.

Se um toma implementação 2, que vai ser melhor em termos de recursos, mas depois ...

Como devo grupo das entidades?

  1. Tenha uma classe para casas em geral e ter uma lista de interfaces para gerenciar isso?
  2. Tenha uma classe para grupos específicos de casas e tem uma lista de objetos para gerenciar isso?

e que sobre tópicos?

  1. Eu deveria ter o loop principal do jogo simplista?
  2. Eu deveria ter uma linha para cada grupo de classe?
  3. Como trabalhadores / transportadores caber na foto?
Foi útil?

Solução

A abordagem normal não usar enfiar em tudo, mas sim entidades implementos como estado-máquinas. Em seguida, seus MainLoop esta aparência:

 while( 1 )
{
    foreach( entity in entlist )
    {
        entity->update();
    }

    render();
}

Outras dicas

O MMORPG Eve Online usa python stackless e o modelo do ator para emular um sistema thread-per-entidade sem o hit de recursos.

Confira neste link para mais informações: http://harkal.sylphis3d.com / 2005/08/10 / multithreaded-game-scripting-com-stackless-python /

Estou bastante certo de que você só deseja ter um thread em execução a lógica do jogo. Tendo vários tópicos não vai acelerar nada, e só vai tornar o código confuso. Ter um loop do jogo principal é perfeitamente bem, embora as coisas ficam um pouco mais complicado se o jogo tem multiplayer.

Estou um pouco confuso sobre a parte da sua pergunta relacionada com classes. Se eu entendi sua pergunta, a minha sugestão seria a de ter uma classe para cada tipo de casa (fazenda de porcos, moinho de vento, etc) provenientes de um House abstrato comum classe base. Você iria em seguida, armazenar todas as casas no mundo do jogo em uma lista de casas.

Pense em usar Erlang. Com Erlang você pode gerar muito mais processos (= tópicos leves) do que um fio normal do sistema. Ainda mais a sua distribuição, ou seja, se o seu is not sistema bom o suficiente, adicione outro nó.

Outra alternativa seria python stackless (ou a alternativa python atual), como também apoiar algum tipo de lightweightthread, que é muito legal para motores de jogo. Eve Online usa-lo para seus servidores. Mas não é distribuída, mas que pode ser facilmente alcançado manualmente.

Enquanto a resposta por @ Mike F é principalmente correta, você tem que ter em mente que a iteração sobre as entidades em um ciclo foreach faz a ordem de avaliação significativamente determinista, que tem efeitos colaterais indesejáveis. Por outro lado, a introdução de tópicos abre potencial para heisenbugs e problemas de concorrência, de modo a melhor maneira que eu tenho visto e usado depende da combinação de dois ciclos: o primeiro recolhe as ações de agentes / trabalhadores com base na anterior estado, o segundo ciclo compõe os resultados das ações e atualiza o estado da simulação. Para evitar a possibilidade de polarização, em cada ciclo da ordem de avaliação é ao acaso. A BTW escalas para avaliação massivamente paralelo, sujeito a uma sincronização no final de cada ciclo.

Gostaria de evitar fazer uma classe separada para cada entidade, porque então você vai ter situações em que ou você está repetindo código para recursos compartilhados, ou você vai ter uma árvore de herança funk.

Eu diria que o que você quer é uma classe única e objetos com funcionalidade composta para ele. Eu vi um artigo em um blog falando sobre este conceito mesmo em um RTS ... espera, eu acho que foi uma turnê de padrões de design que alguém estava escrevendo .

Use o padrão Visitor gerando uma discussão sobre DoEvents de cada objeto (por falta de uma palavra melhor) para contar cada objeto para fazer o que ele vai fazer durante este dado loop. Sincronizar os fios no final do seu ciclo, porque você não quer ter alguns objetos com lógica complexa ainda está fazendo a sua coisa de loops de dez para trás quando na realidade ele foi destruído cinco voltas atrás.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top