Muitas vezes sou tentado a quebrar o jogo em que estou trabalhando para tentar uma arquitetura baseada em tarefas paralelas, mas isso não parece ser um grande requisito para o meu projeto, por isso evito isso por enquanto. Estou planejando experimentá-lo primeiro em um projeto de brinquedo, para "brincar com o conceito".
Agora, o que estou perguntando é: como muitos jogos (que não são AAA) não exigem um desempenho realmente muito alto, parece que usar um mecanismo baseado em tarefas não vale a pena incomodar até ... quais casos?
No momento, acho que isso é necessário quando você realmente precisa explorar o desempenho máximo do hardware (multi-core). Há outros casos em que é uma boa ideia usar o mecanismo baseado em tarefas? Ou talvez, para novos projetos, seja sempre bom começar com um mecanismo baseado em tarefas?
fonte
Se o seu jogo for intensivo em hardware remotamente, você precisará de threads para lidar com todo o hardware moderno; as futuras CPUs lançadas no próximo ano ou dois estão começando a tornar o mínimo de 4 núcleos e até 16 núcleos comuns para os mercados de entusiastas / desempenho. Se você estiver fazendo algum multiencadeamento, faça definitivamente uma arquitetura orientada a tarefas, pois qualquer outro modelo de encadeamento é inerentemente quebrado para mecanismos de jogos prospectivos.
Agora, lembre-se de que com "tarefas" quero dizer "trabalhos" e não "segmentos separados para diferentes subsistemas de mecanismo". Você absolutamente não quer fazer algo como ter um tópico gráfico, um tópico físico, um tópico AI, etc. Isso não ultrapassa um punhado de núcleos e, na verdade, não gera nenhum paralelismo real. A física não deve executar mais de uma atualização por atualização de IA (você deseja que sua AI possa reagir a eventos de física), e os gráficos não têm quase nada de novo para renderizar se a física não for executada, portanto, cada subsistema é executado naturalmente em uma sequência ordem. Você não
O que você quer é fazer é isso. Crie um carretel de linha. Execute o loop do jogo com a sequência clássica de atualizações do subsistema. No entanto, para cada subsistema, separe a carga de trabalho em lotes separáveis distintos e distribua-os ao conjunto de encadeamentos. Aguarde a conclusão de todos os trabalhos antes de executar o próximo estado do loop de atualização do jogo. Alguns subsistemas podem ter várias subestações; por exemplo, os gráficos podem emitir uma série de trabalhos para seleção e, em seguida, uma segunda série de trabalhos para criar a criação de fila. Essa abordagem evita o problema de sincronização da primeira, aumenta para um número muito maior de núcleos e, francamente, é apenas mais fácil de codificar, depurar e manter.
fonte
existem dois usos no multithreading, um é melhorar a performance do programa e o outro é permitir que o programa seja executado quando houver um grande processo em andamento. por exemplo, quando você está tentando carregar alguns dados, é incomodador se o seu programa desligar, então você pode usar outro thread para carregar e manter o Thread principal livre para continuar o loop principal. melhorar o desempenho usando threads é, por outro lado, algo realmente difícil. já que geralmente você faz tudo em um processo linear e isso contrasta com o processamento paralelo. e você sempre deve usar o thread principal para atualizações gráficas de dispositivos, o que dificulta ainda mais a divisão de tarefas entre os threads.
fonte