Saudações, aventureiros!
Vamos atualizar nossos antigos sistemas de combate e animação para melhorar o desempenho em áreas com muitos jogadores junto com o lançamento da Season of the Guardian. Este novo sistema (que chamamos afetuosamente de Slayer Script) vai facilitar as melhorias do nosso combate de agora em diante. Fizemos o máximo para manter a sensação do jogo a mesma, mas gostaríamos muito de receber seus comentários sobre estas mudanças. Do processo de desenvolvimento aos desafios, junte-se ao Líder Técnico Kevin Christensen para um detalhamento sobre o que esse sistema significa para o futuro do New World.
Slayer Script
O Slayer Script é uma linguagem de script baseada no C++. É compilado de maneira nativa e carregado de modo dinâmico pelo New World com a finalidade de fornecer um desempenho excelente, bem como atualizações em tempo real aos scripts. Ele pode gerar eventos (renascer inimigos, tocar sons, etc.), responder a eventos (se um inimigo é eliminado, se um jogador entra em uma sala, etc.), rodar animações, controlar movimentos e muito mais. Com ele, muito trabalho pode ser agrupado em poucas linhas de código.
Processo de desenvolvimento
O New World tem uma enorme quantidade de objetos que são atualizados com freqüência, o que dificulta a utilização eficiente de linguagens de script tradicionais. Uma linguagem de script, por exemplo a Lua, é interpretada e não pode aproveitar as otimizações de hardware. Embora o desempenho de execução da Lua seja bom, ele seria usado por centenas de objetos no New World. A sobrecarga e o custo de memória não seriam suficientes. Precisávamos de uma solução que fosse a mais rápida possível com um impacto aceitável na iteração de desenvolvimento.
Nosso sistema de script de personagens original rodou bem durante o desenvolvimento, mas com o tempo começou a apresentar problemas de desempenho, memória e alocação de tempo de execução conforme o New World continuou a crescer. Isso nos levou a adotar o Slayer Script como um projeto paralelo alternativo. O Slayer Script reduziu o custo de algumas alocações e seu código compilado nativamente é muito compacto, o que reduziu a memória de tempo de execução significativamente.
A ideia inicial era aproveitar o Slayer Script para controlar o jogador. O jogador é de longe o objeto que mais demanda memória no New World. Grande parte do projeto estava concentrado na leitura das entradas do jogador e no controle de suas animações. Esta tarefa demandaria muito tempo. Acontece que a Equipe de Expedição, que não requer entradas do jogador ou animações, foi a primeira a usar o Slayer Script. Foi aí que o Slayer Script passou a ser uma linguagem de script com um propósito mais geral. Só recentemente o Slayer Script foi usado para seu propósito pretendido.
Objetivos
Mais de 400 ações foram convertidas à mão em um novo sistema para garantir que a jogabilidade permaneça individual. Nossos objetivos foram:
Aproveitar o C++ compilado nativamente para obter a maior velocidade possível.
Reduzir o custo de memória diminuindo a quantia de estado que precisa ser armazenada.
Aprimorar a escalabilidade usando uma arquitetura que tem um impacto menor de execução para novos comportamentos.
Permitir carregamento a quente para permitir desenvolvimento em tempo de execução.
Permitir uma depuração mais fácil.
Reduzir o custo de memória acabou sendo o problema mais fácil de resolver. O Slayer Script foi desenvolvido para armazenar o estado em um único local, e todo o comportamento foi criado de modo que possa ser compartilhado entre todas as instâncias de um script.
A escalabilidade seguirá como uma tarefa em andamento. Mesmo o C++ pode ser usado de um modo não eficiente. Cuidados devem ser tomados ao adicionar novos recursos, mas o C++ fornece amplas soluções para monitorar o desempenho e observar a execução da operação.
O sistema anterior era difícil de depurar. Foram criadas ferramentas auxiliares, mas torná-lo capaz de avançar na execução não foi possível. Agora, qualquer designer com um depurador pode definir pontos de interrupção, inspecionar a memória e avançar na execução do script. Depurar o sistema anterior era uma perda de tempo, justamente por conta do processo. Depurar scripts complexos ainda é difícil, mas pelo menos o método é fácil.
Desafios
O maior desafio tem sido manter a iteração rápida. Os designers precisam ter a capacidade de ver os resultados de seu trabalho com rapidez. Com uma linguagem compilada, isso normalmente pode significar fechar o jogo, fazer edições, compilar e então executar o jogo novamente para ver os resultados. O Slayer Script é desenvolvido em um módulo que pode ser carregado enquanto o jogo está sendo executado. Recarregar um módulo dinamicamente pode ser complicado, então qualquer referência a objetos dentro do módulo devem ser liberadas antes que o módulo seja descarregado e readquiridas depois que o módulo estiver recarregado. Se isso não for feito corretamente, o jogo ou as ferramentas vão travar.
Mas com o C++, o custo de memória e desempenho do sistema começa com um grande potencial. O C++ é destinado a desenvolver aplicativos de alta performance e ser o mais eficiente possível. É uma linguagem madura com muitas ferramenta para ajudar o desenvolvimento e medir o desempenho.
Outro desafio foi amenizar as complexidades do C++ para as pessoas que vão usar o Slayer Script. O C++ pode ser uma linguagem difícil de usar, mas quando usada como linguagem de script não tem que ser mais complexa do que qualquer outra. Ainda há muito o que aprimorar neste ponto. E ele segue entre os nossos objetivos.
Esperamos por seus comentários e sugestões no PTR da Season of the Guardian. Agradecemos o seu apoio. A gente se vê em Aeternum!