Pergunta

Quero mover várias partes do meu aplicativo para scripts simples, para permitir que pessoas que não têm um forte conhecimento de c++ possam editar e implementar vários recursos.

Por ser um aplicativo em tempo real, preciso ter algum tipo de multitarefa para esses scripts.Idealmente, quero que o aplicativo c++ chame uma função de script que continue em execução (no thread c++) até um ponto de pausa (Wait(x)) ou retorne.No caso de esperar, o estado precisa ser salvo, pronto para que o script seja reiniciado na próxima vez que o aplicativo entrar em loop após o término da duração.

Os scripts também precisam ser capazes de chamar métodos de classe C++, de preferência usando as classes C++ em vez de funções simples de wrapper em torno de classes C++.

Não quero gastar muito tempo implementando isso, portanto, é preferível usar uma linguagem de script existente do que escrever a minha própria.Ouvi dizer que Python e Lua podem ser integrados em um aplicativo c++, mas não sei como fazer isso para atingir meus objetivos.

  • Os scripts devem ser capazes de chamar funções C++
  • Os scripts devem ser capazes de “pausar” quando certas funções são chamadas (ex.Aguarde) e seja reiniciado novamente pelo thread c++
  • Precisa ser rápido - isso é para um aplicativo em tempo real e pode haver muitos scripts em execução.

Provavelmente posso rolar o código multitarefa com bastante facilidade, desde que os scripts possam ser salvos e reiniciados (possivelmente por um thread diferente do original).

Foi útil?

Solução

Você pode usar Lua ou Python.Lua é mais "leve" que python.Ele ocupa menos memória do que o python e, em nossa experiência, foi mais fácil de integrar (a quilometragem das pessoas neste ponto pode variar).Ele pode suportar vários scripts em execução simultaneamente.Lua, pelo menos, suporta parar/iniciar threads da maneira que você desejar.

Boost.python é bom, mas na minha experiência (limitada), foi difícil compilar para nossos diferentes ambientes e era bastante pesado.Tem (na minha opinião) a desvantagem de exigir Boost.Para alguns, isso pode não ser um problema, mas se você não precisa do Boost (ou não o usa), você está introduzindo uma tonelada de código para fazer o Boost.python funcionar.YMMV.

Incorporamos Lua em aplicativos em múltiplas plataformas (win32, Xbox360 e PS3).Acredito que funcionará em x64.A sugestão de usar Luabind é boa.Acabamos escrevendo nossa própria interface entre os dois e, embora não seja muito complicado, ter esse código cola vai economizar muito tempo e talvez aborrecimentos.

Porém, com qualquer solução, a depuração pode ser uma dor.Atualmente não temos uma boa solução para depurar scripts Lua incorporados em nosso aplicativo.Como não usamos python em nossos aplicativos, não posso falar sobre quais ferramentas podem estar disponíveis lá, mas alguns anos atrás o cenário era praticamente o mesmo: depuração ruim.Ter scripts para estender a funcionalidade é bom, mas bugs nos scripts podem causar problemas e podem ser difíceis de localizar.

O código Lua em si é meio complicado de trabalhar se você precisar fazer alterações nele.Vimos bugs na própria base de código Lua que eram difíceis de rastrear.Suspeito que Boost::Python possa ter problemas semelhantes.

E com qualquer linguagem de script, não é necessariamente uma solução para “não-programadores” estender a funcionalidade.Pode parecer que sim, mas você provavelmente acabará gastando bastante tempo depurando scripts ou até mesmo Lua.

Dito isso, estamos muito felizes com Lua e a lançamos em dois jogos.Atualmente não temos planos de nos afastar do idioma.Resumindo, achamos que é melhor do que outras alternativas disponíveis há alguns anos.Python (e IronPython) são outras opções, mas com base na experiência, eles parecem mais pesados ​​que Lua.Eu adoraria ouvir sobre outras experiências lá.

Outras dicas

Eu recomendo fortemente que você dê uma olhada Luabind.Isso torna muito simples integrar Lua em seu código C++ e vice-versa.Também é possível expor classes C++ inteiras para serem usadas em Lua.

Sua melhor aposta é incorporar lua (www.lua.org) ou python (www.python.org).Ambos são usados ​​​​na indústria de jogos e acessam funções externas "C" com relativa facilidade, com lua tendo uma vantagem aqui (porque os tipos de dados são mais fáceis de traduzir entre lua e C).A interface com objetos C++ será um pouco mais trabalhosa para você, mas você pode pesquisar como fazer isso no Google ou em fóruns de discussão lua ou python.

Espero que isso ajude!

Definitivamente, você pode fazer o que quiser com Python. Aqui estão os documentos sobre como incorporar Python em um aplicativo. Tenho quase certeza de que Lua também funcionaria, só que estou menos familiarizado com ela.

Você está descrevendo multitarefa cooperativa, onde o script precisa chamar uma função Break ou Wait periodicamente.Talvez uma solução melhor seria executar a linguagem de script em seu próprio thread e, em seguida, usar mutexes ou filas sem bloqueio para as interfaces entre a linguagem de script e o restante do seu programa.Dessa forma, um script com erros que não chama Break() com frequência suficiente não pode congelar acidentalmente seu programa.

Dê uma olhada no Boost.Python biblioteca.Parece que deve ser bastante simples fazer o que você deseja.

Dê uma olhada GOLE.Eu o usei para fazer interface com Python, mas ele oferece suporte a muitas outras linguagens.

Mais um voto para Lua.É pequeno, rápido e não consome muita memória (para jogos, sua melhor aposta é alocar um buffer grande na inicialização e redirecionar todas as alocações de memória Lua para lá).Usamos tolua para gerar ligações, mas existem outras opções, a maioria delas muito menores/mais fáceis de usar (IMO) do que boost.python.

Quanto à depuração de Lua (se você seguir esse caminho), tenho usado o DeCoda e não tem sido ruim.Ele finge ser um IDE, mas meio que falha nisso, mas você pode anexar o processo de depuração ao visual studio e descer na pilha de chamadas nos pontos de interrupção.Muito útil para rastrear esse bug.

Você também pode incorporar scripts C/C++ usando CH.Estou usando-o para um projeto de jogo em que estou trabalhando e funciona bem.Bela mistura de poder e adaptabilidade.

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