Eu sou novo no desenvolvimento de jogos. Para aprender, estou recriando este jogo na plataforma Android. Você pode observar o vídeo do jogo no link acima. É um jogo simples.
Eu li muitos artigos sobre como começar o desenvolvimento de jogos. Quase todos eles recomendaram o uso de um loop de jogo em um thread separado, o que faz sentido para outros jogos. No entanto, para este jogo em particular, preciso iniciar um segmento separado?
Respostas:
Um loop de jogo é geralmente recomendado porque é simples . Quase qualquer jogo pode ser desenvolvido e executado adequadamente utilizando um loop, e a maioria dos jogos exigiria um para funcionar adequadamente.
Por exemplo, a maioria dos mecanismos de física exige atualizações constantes confiáveis para uma simulação adequada. Animações e outros conteúdos e gráficos dinâmicos precisam ser atualizados a cada alteração, etc.
Agora esteja ciente de que seu loop não precisa ser executado em um thread separado. De fato, a maioria dos jogos executa o loop no thread principal por simplicidade. Até meus projetos para Android seguem esse princípio.
Agora, a verdadeira questão aqui é qual alternativa você propõe? Se você tem outra idéia de como obter informações com segurança, fazer atualizações e desenhar molduras que funcionem para você, então vá em frente! Caso contrário, um loop de jogo pode ser a maneira mais fácil de começar.
fonte
Não , um encadeamento separado não é necessário. Se você não estiver fazendo algo muito intenso (o que não parece ser o caso no jogo que você nos mostrou), tudo pode ser feito no tópico principal.
Um segundo encadeamento é necessário se você estiver processando muito ou enfrentando problemas com a interface do usuário / entrada que não responde. Por exemplo, em jogos mais complexos, você não deseja que a interface do usuário / entrada pare de responder quando a IA estiver calculando sua próxima jogada. Como seu jogo parece responder principalmente à entrada do usuário e à atualização de recursos visuais, não é necessário um segundo segmento.
Respondendo à pergunta original "É necessário um loop".
Não , mas as alternativas são mais complicadas, mais difíceis de implementar e raramente usadas.
Os jogos são por definição interativos. No mínimo, isso está aguardando entrada e atualização de saída. A maneira mais simples de fazer isso é com um loop. Não é necessário gerar um novo tópico para isso.
Mesmo que o jogo que você mencionou pareça simples, ele possui visuais e sons interativos e atualiza constantemente aqueles com base nas informações do usuário.
Também não há muitas alternativas para um loop de jogo. Algum tipo de sistema baseado em interrupção pode ser possível. No entanto, esses sistemas aumentam a complexidade e reduzem outros fatores, como o determinismo. Há uma razão pela qual os loops de jogos são tão comuns, são fáceis de implementar, fáceis de entender, flexíveis e fazem um ótimo trabalho.
fonte
Resposta à pergunta real (um loop do jogo precisa estar em um segmento separado):
A razão pela qual as pessoas geralmente recomendam o uso de um encadeamento separado é porque não desejam que o processamento pesado interfira na interatividade da interface do usuário. Você é o único que pode dizer se é necessário um segmento separado para o seu jogo. Depende inteiramente do mecanismo e da estrutura se o loop principal do jogo em seu design atual pode interferir no tempo de resposta da interface do usuário. Pensei que você geralmente assume que não vai (em pequenos projetos), a menos que você tenha um motivo para pensar de outra forma.
Outro motivo para manter o código em threads separados é manter o código modular e simples. A combinação de dois pedaços de código não relacionados pode fazer com que o código se torne menos legível e mantenível a longo prazo.
Um loop de jogo precisa ser executado em seu próprio segmento separado? Possivelmente. Se houver um problema com o tempo de resposta ou o código e você precisar de vários itens da interface do usuário para responder, independentemente do processamento pesado, ou simplesmente desejar dividir o código em tarefas específicas que ocorrem simultaneamente por motivos de design, siga-o. No entanto, é considerada uma prática de programação avançada .
Um exemplo simples, mas talvez não ótimo, para ilustrar é um jogo para dois jogadores. Você pode executar duas instâncias de uma classe que lida com a entrada do usuário e converte em alterações de estado na instância do personagem do jogador.
Algumas estruturas incentivam / exigem que você utilize um sistema baseado em evento / interrupção, como o ActionScript3.0. Nesse caso, o código do loop normalmente irá para o
OnEnterFrame
evento ou algo semelhante que ocorre 20 - 60 ou 120 vezes por segundo.Resposta à pergunta original (Preciso de um loop principal):
Tudo se resume ao contador do programa . Se você estiver criando um jogo que funcionará mais do que um tempo predeterminado e não gerará código, então será necessário solicitar ao PC do usuário que repita algumas instruções que ele já processou e o que possivelmente será alterado. enquanto isso é o estado (os valores armazenados nos objetos e globais do jogo).
Como você sabe que precisará repetir as instruções, existem várias maneiras de concluir esta tarefa e processar continuamente as mesmas instruções. Todos esses métodos envolvem mover o contador do programa de volta à instrução atualmente relevante. As instruções de fluxo de controle mais comuns que fazem com que o código seja repetido são chamadas de loops, outra é a
goto
instrução que raramente é usada no código moderno e tem um efeito semelhante nesse caso (completamente não relevante para você).Então, para responder à sua pergunta anterior, você precisa de um loop? Sim você faz.
fonte
Apenas para adicionar as respostas de outras pessoas aqui, algo que ninguém mencionou explicitamente: Se você correr o risco de executar o loop do jogo em um segundo segmento e ele não responder, você corre o risco de o SO encerrar seu aplicativo. É por isso que é recomendável usar um thread separado. Portanto (por exemplo), os NDKs
native_app_glue.c
/.h
geram um thread separado para o seu loop.fonte