Usar scripts Lua para definir a lógica do jogo para um servidor MMO seria muito mais lento que o compilado em C ++?

10

Estou usando um sistema de entidades para o servidor MMO e estava pensando em definir o comportamento de "ações" usando scripts Lua. O servidor está escrito em C ++. Não estou familiarizado com o uso de velocidade / memória de Lua em C ++, mas usei-o para criar scripts para a GUI do cliente. Usar Lua para definir a lógica do jogo no servidor reduziria muito o desempenho?

BarakatX2
fonte
Pergunta relacionada: gamedev.stackexchange.com/questions/2913/…
Tetrad

Respostas:

20

TL; DR: Lua possui sobrecarga, mas se usada corretamente, é insignificante e facilmente mitigável. Não o utilize para operações matemáticas pesadas ou para transformar geometria. Você provavelmente não verá nenhum problema de desempenho ao usá-lo para criar scripts para uma GUI.

Fiz alguns benchmarks básicos sobre o desempenho de Lua como uma linguagem de script de jogos, e é muito rápido. Usando o tolua ++ para ligar o LuaJIT ao meu mecanismo de jogo, criei 2.000 atores, cada ator controlado por um script Lua chamado cada loop do jogo (com um argumento de tempo delta). Metade dos atores tinha um roteiro reunido e a outra metade estava fazendo uma espécie de caminhada aleatória (e foi evitada pelo rebanho).

Desligar o componente de renderização me deu um pouco mais de 400 ticks por segundo no meu Opteron 170 (2x2,0 GHz, embora meu mecanismo fosse de rosca única na época). Eu imagino que eu poderia ter espremido um pouco mais do que isso se eu pesquisasse e otimizasse, talvez movendo parte do trabalho pesado de volta para C ++. Atualizar 2000 atores 400 vezes por segundo ainda era bastante impressionante e excedeu em muito as minhas expectativas na época.

Agora uso Lua em todos os meus projetos e, na verdade, constitui uma grande parte do código do jogo (AI, layout / lógica da GUI, eventos / mensagens). Criar jogos é MUITO mais divertido quando você pode alterar rapidamente algo e testá-lo sem precisar sair, recompilar e reinicializar. De vez em quando, encontro alguns problemas de desempenho, mas eles são facilmente resolvidos reimplementando o código incorreto no C ++ (e depois chamando-o de Lua).

Embora um pouco fora de tópico, os servidores do EVE Online são escritos quase completamente em Stackless Python (acredito que eles adiam a maioria de suas operações matemáticas para uma lib C ++), que é consideravelmente mais pesada que Lua, e, com base em minha própria pesquisa pessoal e em várias disponíveis benchmarks, muito menos desempenho que LuaJIT. Eles conseguem lidar com mais de 30k players simultâneos sem muitos problemas. É verdade que eles têm uma tonelada de hardware caro executando tudo isso, mas acredito que a maior parte do custo está no cluster de banco de dados ...

Desculpas pela parede do texto.

Codewaffle
fonte
1
Ótima resposta! Não há necessidade de desculpas por uma resposta tão detalhada. Acho que vou dedicar tempo para desenvolver "ações" componentes definidas em Lua e fazer alguns testes comparativos. Obrigado!
BarakatX2 01/09/10
2
O maior sucesso nesse tipo de sistema é geralmente analisar os scripts, portanto, certifique-se de antecipar a carga na inicialização.
Coderanger 01/09/10
Este é um bom ponto. Na verdade, eu compilei minha Lua no bytecode antes do empacotamento para liberação, o que pode reduzir o tempo de carregamento ainda mais, embora eu não tenha feito nenhuma medição.
Codewaffle
Eu tendo a discordar. Enquanto em um jogo normal a lógica é uma parte menor do tempo de execução (renderizar é uma fera), em um servidor MMO é uma parte muito maior, então o impacto seria muito mais substancial. Eu tenho experiência com LUAJit e C ++ e enquanto LUAJit é substancialmente mais rápido que LUA, ainda é muito mais lento que C ++ (supondo que você codifique C ++ corretamente). Admito que o fluxo de trabalho com o LUAJit é incrível, mas, rapidamente, é necessário. Não importa como você torce, variáveis ​​em tabelas com pesquisas de string, tipos dinâmicos e coleta de lixo têm um preço. O LUAJit é mais lento que o .NET, disse nuff
Kaj
2

Resposta curta: Sim, sim.

Resposta longa: depende da lógica do jogo, da quantidade e da complexidade, e se é necessário executá-la para todos os jogadores. Se é muito simples e não se repete muito, você pode ficar bem com isso. Mas, na maioria dos casos, o uso de LUA em vez de C ++ fornecerá um desempenho muito menor e terá uma escala ruim, assumindo, é claro, que o código seja bem projetado e otimizado.

AttackingHobo
fonte