Eu tenho um livro de programação de jogos em C ++ e ele possui uma seção Lua. Comecei a ler a seção Lua, e isso parece interessante, mas não consigo determinar os prós e os contras do uso de Lua no meu jogo em C ++. O único benefício que posso pensar atualmente é que você pode fazer algumas atualizações de codificação, via Lua, sem precisar recompilar. Fora isso, não consigo pensar em nada. Então, quais são os prós e os contras de adicionar Lua a um jogo em C ++?
Exemplos seriam apreciados.
Respostas:
Não descarte a utilidade disso tão facilmente. Você nunca entenderá o quão produtivo será até retirar a etapa de recompilação.
O "fluxo" é um conceito psicológico bastante bem compreendido quando se trata de trabalho. O fluxo é aquele sentimento que você sente quando se concentra em uma atividade, quando está analisando e resolvendo problemas quase sem pensar, etc. Você está mais produtivo quando está "fluindo".
Os tempos de compilação estragam tudo isso. É difícil permanecer no fluxo se você tiver uma compilação de 10 segundos entre testar algo.
Quando você está desenvolvendo uma jogabilidade, o que você costuma ter é um "loop apertado". Você tem uma ideia, codifica um teste para ver se funciona e depois tenta. Se não funcionar, modifique-o e tente novamente. O tempo de "código para teste" é muito importante para manter o fluxo. Obter o menor tamanho possível é crucial.
O que Lua (ou qualquer linguagem de script incorporada) permite que você faça é testar as alterações, não apenas sem "compilar", mas viver no jogo . Dependendo de como você constrói seu jogo, você pode executar um comando que reiniciará o jogo com novos scripts sem precisar parar e recarregar dados e assim por diante. Além de não precisar recompilar, você não precisa executar novamente.
A capacidade de fazer isso, com o suporte adequado do mecanismo, pode aumentar drasticamente a produtividade.
Outro grande benefício do script é a capacidade de não se importar. Se você passou muito tempo escrevendo C ++, ficaria surpreso com quanto tempo gasta em minutos. Onde a memória é apagada. Onde isso é liberado. Mesmo se você estiver usando em
shared_ptr
qualquer lugar, apenas o ato de digitar todos esses nomes de tipos de variáveis atrasará você.Em uma linguagem de script de tipo dinâmico, você não precisa se preocupar. O escopo é simples. Funções são objetos de primeira classe; você não precisa criar functors manualmente. É tão fácil fazer algumas coisas.
Agora isso tem negativos, se você não é um programador disciplinado. É muito fácil usar globais em Lua (embora haja maneiras de evitar isso). Não se importar significa que você pode ser muito desleixado ao codificar.
Mas, novamente, ser muito desleixado pode ter vantagens .
Outra vantagem do Lua é que ele cria uma boa linguagem de descrição de dados. Assim como o JSON é apenas um arquivo JavaScript que cria e retorna uma matriz / tabela, você pode criar scripts Lua que retornam tabelas.
Isso é útil para arquivos de configuração; O formato da tabela de Lua é muito melhor que o formato .ini. O formato ainda é bastante limpo, compacto e extensível.
Ah, e ainda é um script Lua, para que ele possa executar a lógica real. A desvantagem disso é ... bem, é um script Lua, para que ele possa executar a lógica real . Isso pode ser desastroso no jogo, já que o usuário pode começar a estragar tudo.
Mas, na verdade, isso é facilmente resolvido. Lua foi projetado para incorporação, o que significa que o isolamento é realmente muito fácil. De fato, um novo estado Lua não fornece nada por padrão; você realmente precisa fazer algo para expor até mesmo as bibliotecas Lua mais básicas. O acesso a arquivos, o estado do jogo, etc., é opcional, não opcional. E cada estado Lua é separado um do outro. O estado Lua que você usa para scripts AI não precisa ser o estado Lua usado para arquivos de configuração.
Na verdade, eu tenho um código que permite registrar muitas bibliotecas padrão Lua, mas analisa e remove todas as E / S de arquivos. Por fim, o pior que um arquivo de configuração baseado em script Lua poderia fazer é causar o travamento do seu jogo imediatamente após a execução, ficando sem memória. E como você não está compartilhando esses arquivos de configuração manualmente, isso não seria muito divertido para um hacker.
Eu diria que a maior desvantagem de qualquer linguagem de script é a depuração. A maioria das linguagens de script não possui depuradores, e Lua não é diferente. Lua possui todas as ferramentas necessárias para criar ferramentas de depuração. Mas, na verdade, ele não possui um depurador embutido. Você tem que montar um. E isso exigirá um grau razoável de trabalho.
Ou você pode fazer o devido com "printf debugging". Realmente depende de quanto código Lua você escreve.
fonte
Onde eu trabalho:
Prós:
luac -l
e espiar o bytecode para fazer algumas análises; também é muito fácil analisar a maioria dos arquivos de origem lua, especialmente se você tiver uma convenção de codificação. Podemos aplicar a convenção local. Você também pode procurar no metalua ainda mais energia aqui.lua_pcall
.Contras:
step
deveria ser muda drasticamente por jogo. Alguns funcionam melhor com o GC completo em todos os quadros (pequeno conjunto de trabalho). Alguns funcionam melhor com passes muito menores com menos frequência. Observe que há muito trabalho para melhorar o GC nas versões mais recentes da lua e em alguns patches (que você não deve ter medo de usar!)lua_State
completamente em alguns casos. E às vezes ainda temos problemas. Ajustar os tamanhos dos pequenos pools de objetos (eles são fixos, para simplificar e reduzir a sobrecarga) e o tamanho da pilha de objetos grandes específicos da lua pode ser um problema. Mas em sistemas maiores que cerca de 4 MB, ainda não nos preocupamos com as pilhas e os pools especializados.__index
e__newindex
). É melhor se você conseguir detectar erros em tempo de compilação. Existem várias coisas que você pode fazer para aliviar isso.Lua é altamente recomendado, apenas esteja disposto a trabalhar um pouco! Você também pode conferir o Squirrel , embora eu acredite que ele tenha uma base de usuários menor.
fonte
Na verdade, existem 3 grandes vantagens:
Esses fatores permitem que você, como desenvolvedor de jogos, habilite recursos que irão acelerar o desenvolvimento e aumentar a qualidade do seu jogo.
Por exemplo:
fonte
Da minha experiência, resumiu-se um pouco.
Prós
Contras
Final, pessoal, veredicto: se você está construindo um jogo de tamanho decente e ainda não possui uma linguagem de script, obtenha Lua. Vai valer a pena.
fonte
O Mod de Garry é um exemplo de jogo que usa Lua e C ++. Eles usam Lua para todos os mods, o que os torna muito mais fáceis para as pessoas. C ++ é usado para todos os internos. O único engodo que consigo pensar seria o fato de Lua não ser tão rápida quanto C ++.
fonte