JetBrains Rider - Agora para o Unreal Engine

Oi Habr!

Na semana passada, após os lançamentos da versão 2020.1, outro grande evento aconteceu para todos os nossos produtos para desktop - abrimos o acesso público à versão de avaliação do Rider for Unreal Engine . No momento, este é um produto separado, uma versão do nosso ambiente de desenvolvimento para o Rider, mas com suporte para C ++ e Unreal Engine. Então pare! Ambiente de desenvolvimento C ++. Mais um?! Vamos resolver em ordem.

Piloto para motor irreal



Vamos começar com uma pequena história. Alguns anos atrás, reunimos todos os que fabricam ferramentas C ++ no JetBrains para discutir como é difícil para os usuários navegar pela variedade de nossas ofertas. Afinal, há CLion, ReSharper C ++ e suporte para C ++ no AppCode. Após várias horas de discussão, chegamos às seguintes conclusões:

  • Embora a ferramenta universal pareça atraente, com a expansão da segmentação, o aumento no número de ferramentas de terceiros integradas e casos de uso suportados, torna-se muito difícil encontrar um equilíbrio entre conveniência, interface intuitiva e muitos recursos.
  • O mundo do desenvolvimento de software há muito tempo não possui limites claros nas linguagens de desenvolvimento. Muitos projetos são multilíngues. Mais importante é o escopo do software e das tecnologias que são usadas nele.

Como resultado, decidimos unificar a experiência do usuário em nossas ferramentas para C ++, mas concordamos que a abordagem para criar ferramentas diferentes (embora com um kernel comum ou em uma plataforma comum) para diferentes áreas do desenvolvimento de software é a correta. Na prática, fica assim:

  • CLion — C C++. , , , AI, , . , , ( CMake, Gradle Native, compilation database, Bazel, Makefiles) . , , CLion msbuild, , .
  • ReSharper C++ — , Windows, , Visual Studio. C++ C#. Visual Studio, ReSharper, C++.
  • AppCode — , iOS/macOS. C/C++ mac- .

Então, o que o Cavaleiro tem a ver com isso? Qual é o ambiente de desenvolvimento de plataforma cruzada para .NET relacionado ao C ++? Na prática, cerca de 30% dos usuários do Rider são estúdios de jogos e empresas de desenvolvimento de jogos. É compreensível, porque o Rider é amplamente popular precisamente como um ambiente de desenvolvimento para o Unity . Este não é o primeiro ano em que a equipe Rider personaliza um instrumento especificamente para este mecanismo de jogo. O resultado é apreciado não apenas pelos programadores do Unity, mas também pelas próprias Unity Technologies, com as quais interagimos longa e frutuosamente em termos da própria tecnologia.

Indo para muitos de nossos usuários no campo do desenvolvimento de jogos, percebemos que muitos estúdios não têm uma separação clara - crie jogos apenas no Unity ou apenas no Unreal Engine. Hoje eles jogam em uma tecnologia e amanhã em outra, ou uma equipe usa o Unreal Engine e a outra Unity, ou mesmo seu próprio mecanismo personalizado. É claro que desenvolvedores e empresas em geral realmente não gostam de "pular" entre diferentes ambientes de desenvolvimento. E aqui decidimos que, se conseguiríamos tornar o Rider bem-sucedido no Unity, poderíamos ir além e torná-lo bem-sucedido em geral para o mundo do desenvolvimento de jogos. Portanto, a ideia de Rider nasceu como um ambiente de desenvolvimento universal para Game Dev .

Em que consiste o Rider for Unreal Engine


O desenvolvimento posterior de eventos é bastante óbvio para aqueles que estão familiarizados com a tecnologia na qual o Rider é construído. O Rider consiste em uma parte front-end baseada na plataforma IntelliJ e uma parte back-end baseada no ReSharper. Todo o suporte ao idioma funciona no back-end. Portanto, acabamos de conectar o suporte a C ++ e Unreal Engine existente no ReSharper C ++ ao Rider usando a mesma tecnologia. Do específico, eu tive que implementar adicionalmente:

  • Plug-in para selecionar o Rider como um ambiente de desenvolvimento no Unreal Editor ( Rider Source Code Access ) para as versões de mecanismo 4.22-4.24. A partir da versão 4.25, essa funcionalidade já estará incluída no próprio mecanismo da UE.
  • Os plugins UnrealLink para o Rider e o RiderLink for Unreal Editor, que fornecem integração com o Blueprints no Rider e geralmente são responsáveis ​​pela comunicação entre o Rider e o Unreal Editor.
  • Depurador

Vale ressaltar que agora a visualização do Rider for Unreal Engine está disponível apenas no Windows, abre arquivos .sln e depende da compilação do compilador da Microsoft. No futuro, no momento do lançamento, tentaremos expandir para as três plataformas e implementar o suporte ao .uproject como o principal modelo de design.

Depurador baseado em LLDB


Uma parte significativa do desenvolvimento de jogos está acontecendo agora na plataforma Windows e como parte da cadeia de ferramentas da Microsoft. Se observarmos quais ferramentas de depuração existem para código compilado usando o compilador Microsoft Visual C ++, veremos:

  1. A Microsoft usa ferramentas de depuração baseadas no vsdebugeng.dll em suas próprias ferramentas . A licença não permite o uso dessas ferramentas em ambientes de desenvolvimento de terceiros.
  2. CDB WinDbg dbgeng.dll. MS . (.pdb), , , .
  3. Também houve desenvolvimentos na comunidade LLVM para suporte à depuração da cadeia de ferramentas do Visual Studio usando LLDB. Nós os usamos, e apenas um ano e meio escrevemos a primeira versão de um depurador que geralmente funciona. Ele inclui suporte inicial e ainda bruto ao formato NatVis (tais bonitas impressoras específicas para MS). Ao mesmo tempo, o Rider for Unreal Engine agora encontra o NatVis no projeto no Unreal Engine e os carrega no depurador. Agora estamos usando o mesmo depurador no CLion para a cadeia de ferramentas do Visual Studio (ele é ativado por padrão neste caso a partir da versão 2020.1).

O novo depurador ainda está úmido, é claro, ainda tem problemas e lentidões significativos. Mas esperamos trazer isso à mente para o lançamento.

Suporte C ++


Repito - toda a funcionalidade de suporte ao idioma do ReSharper C ++ está agora disponível no Rider for Unreal Engine Preview. Inclui:

  • Cerca de 170 inspeções de código diferentes e mais de 50 correções rápidas.
  • Refatores que levam em consideração todos os usos contextuais de um símbolo (renomear, alterar a assinatura do método, remoção do método, adicionar um campo / variável / typedef, substituir (Inline) uma variável ou typedef e outros).
  • Geração de código (métodos getters / setters, construtores, operadores de comparação, modelos de documentação de código).
  • Ações para ajudar a escrever código, navegação, formatação e suporte para estilos de nomeação, #includediretivas de classificação .

Gerar ação

Suporte para dialetos HLSL, C #, uproject / uplugin


Este ano, começamos a trabalhar no suporte ao idioma para escrever shaders HLSL no ReSharper C ++ , e ele entrou imediatamente na pré-visualização do Rider for Unreal Engine. O suporte inclui destaque de sintaxe, dicas de ferramentas com documentação, dicas de nomes e tipos de parâmetros, ações de navegação, preenchimento automático, suporte para caminhos de arquivos virtuais e até refatoração.

Como o Rider for Unreal Engine é baseado no ambiente de desenvolvimento para .NET, o suporte ao idioma funciona nos arquivos Build.cs e Target.cs.

E, finalmente, quando se trata de oferecer suporte a dialetos de idiomas, o Rider for Unreal Engine compreende dialetos de arquivos .uproject / .uplugin, fornecendo opções para ferramentas de preenchimento automático e documentação.

dialeto de projeto

Integração de Blueprints


Arquivos Blueprints são dados binários que geralmente são editados em um editor visual dentro do Unreal Editor. Os objetos nesses arquivos são herdados das classes em C ++; eles redefinem as propriedades da parte C ++ do jogo. E aqui o Rider for Unreal Engine é aquele ambiente de desenvolvimento exclusivo que lê todos os arquivos Blueprints necessários e mostra esses links no editor de código C ++:

Classes derivadas de BP

Se você alterar, por exemplo, o valor da propriedade no editor Unreal Engine e salvar o ativo, o valor aqui ele também será atualizado automaticamente no Rider (temos observadores pendentes para alterar os arquivos de ativos):

Propriedades BP

Sem salvar os arquivos, esperamos que isso funcione em breve (a preparação para isso agora está sendo feita no plug-in UnrealLink).

A chamada Localizar usos inclui não apenas usos no código C ++, mas também arquivos Blueprints. Clicar duas vezes nesses usos abre o Editor Unreal.

Entendendo o mecanismo de reflexão do UE4


A reflexão no Unreal Engine é implementada usando macros especiais (UCLASS, UFUNCTION, UPROPERTY, etc.). Rider sabe que os parâmetros dessas macros não são apenas texto. O analisador C ++ no ReSharper C ++ e Rider pode realmente “entender” o significado dessas macros sem sequer iniciar a ferramenta Unreal Header Build (antes de o conteúdo dos arquivos .generated.h ser gerado ).

A propósito, falando sobre arquivos .generated.h , o ReSharper C ++ e o Rider sabem que as diretivas #include ausentes adicionadas automaticamente devem ser estritamente inseridas antes de conectar os arquivos .generated.h . E também leve em consideração esses arquivos gerados ao renomear a refatoração.

Voltando ao mecanismo de reflexão, vale a pena dizer que os especificadores de reflexão não são apenas textos no ReSharper C ++ e Rider. Há dicas de preenchimento automático e documentação para eles: as

Doc reflexão

dicas de documentação também estão disponíveis para as próprias macros de reflexão.

E o analisador de código verifica o uso de macros de reflexão e indica os erros associados a isso. Por exemplo:

  • As classes UCLASS devem ser herdadas publicamente do UObject ou de qualquer uma de suas classes descendentes. Além disso, esse pai ou mãe deve ser exatamente um.
  • Especificadores UCLASS devem ser usados ​​para classes, USTRUCT para estruturas.
  • As classes UE4 não podem ser declaradas dentro de outras classes.
  • Objetos armazenados em campos não marcados com UPROPERTY podem ser coletados a qualquer momento pelo coletor de lixo.

Suporte à chamada de procedimento remoto (RPC) para ações de navegação e geração de código


Se considerarmos as chamadas de procedimentos remotos do ponto de vista de um analisador C ++ regular, rapidamente você perceberá a ignorância do analisador de que várias funções com nomes diferentes (por exemplo, sufixos _Validatee _Implementation) podem corresponder a uma declaração de função . Em ReSharper C ++ / Rider, temos treinado um analisador para identificar RPC sobre especificadores Client, Servere NetMulticastnas configurações de macro UFUNCTION. Assim:

  • A navegação oferece todas as opções necessárias para implementar a função.
  • A geração de código pode criar funções com sufixos _Validatee _Implementationou apenas aqueles que estão faltando:
    Geração Rpc
  • As refatorações de código Renomear e Alterar Assinatura atualizarão todas as funções necessárias e, assim, manterão seu código no estado correto.

Conhecimento das regras de nomenclatura do Unreal Engine 4


O ReSharper C ++ e o Rider estão cientes das regras oficiais de nomenclatura no código do Unreal Engine. Essas regras são usadas pelo ambiente de desenvolvimento em todas as ações para trabalhar com código, como gerar getters e setters ou refatorar uma variável (Introduzir Variável). E o mais importante, há uma verificação do código de inspeção de nomenclatura Inconsistente UE4 e uma correção rápida correspondente que fará com que a renomeação seja refatorada e renomeie todos os usos do nome que não estejam em conformidade com as regras.

Desempenho do Editor


Temos apoiado o desenvolvimento do Unreal Engine no ReSharper C ++ há algum tempo e, é claro, vemos que o desempenho do editor é a principal reclamação. Devido à sua arquitetura, o Rider está livre de muitos problemas de desempenho presentes no ReSharper (em parte devido a limitações do estúdio em processos de 32 bits, nos quais o ReSharper trabalha, mas não apenas).

Além disso, ajustamos especificamente o IDE para melhorar o desempenho no Unreal Engine. Primeiro indexamos o código do jogo do usuário, incluindo instantaneamente todas as ações inteligentes do editor no código do usuário. E a indexação do código do mecanismo em si ocorre depois disso em segundo plano. Existem várias opções adicionais para gerenciar a indexação:

Opções de desempenho

Como resultado, aqueles que já começaram a usar o Rider for Unreal Engine respondem muito positivamente sobre o desempenho do editor! E temos certeza de que podemos fazer ainda melhor.

Demonstração em vídeo e mais uma vez sobre como acessar


Esses e muitos outros recursos podem ser vistos em ação em um vídeo de demonstração (em inglês) do nosso advogado desenvolvedor:


E para experimentar esses recursos você mesmo, basta preencher um formulário simples e receber uma carta nossa com um link para a criação e ativação de uma licença gratuita para uma visualização antecipada. Vá, preencha , tente, escreva comentários! Para seu feedback, como sempre, há comentários aqui, um rastreador ( ReSharper C ++ e Rider ) e nosso e-mail de suporte ( rider-cpp-support@jetbrains.com ).

Obrigado pela atenção!

Equipe do Piloto
para o Desenvolvimento

All Articles