Otimização de Performance

Otimize sua cena para carregar rápido e rodar suavemente para todos os jogadores.

Existem vários aspectos que você pode otimizar em suas cenas para garantir a melhor experiência possível para os jogadores que as visitam. Este documento cobre algumas práticas recomendadas que podem fazer uma grande diferença em quão rápido sua cena carrega e em quão suavemente ela roda para os jogadores que estão nela ou em cenas vizinhas.

Tenha em mente que muitos jogadores podem estar visitando Decentraland usando hardware que não foi projetado para jogos, e via navegador, o que limita quanto do poder de processamento do hardware está disponível. A experiência de visitar sua cena deve ser fluida para todos.

O Explorer da Decentraland aplica muitas otimizações no nível do engine. Essas otimizações fazem uma grande diferença, mas o desafio de renderizar múltiplas experiências geradas por usuários simultaneamente em um navegador é grande. Precisamos da sua ajuda para fazer as coisas funcionarem de forma suave.

Temporização

Reprodução de vídeo

Reproduzir vídeos é uma das coisas mais custosas para o engine lidar. Se sua cena inclui vídeos, certifique-se de que apenas UM VideoTexture esteja em uso por vez. Você pode ter dezenas de planos compartilhando a mesma VideoTexture sem impacto significativo no desempenho, mas assim que adicionar uma segunda VideoTexture, seus efeitos na taxa de quadros se tornam muito perceptíveis.

Você também deve evitar que vídeos toquem em regiões onde não podem ser vistos. Por exemplo, se você tem uma tela dentro de um ambiente interno, alterne o vídeo usando uma trigger area com base em quando o jogador entra e sai.

circle-info

💡 Tip: Um truque que várias cenas usaram é transmitir um único vídeo com múltiplas regiões que são mapeadas de forma diferente para diferentes planos. Cada tela de vídeo usa UV mappingarrow-up-right para mostrar apenas uma parte distinta da VideoTexture. Graças a isso, pode parecer que há vídeos separados tocando sem o custo de múltiplas VideoTextures.

circle-info

💡 Tip: Quando os jogadores estão parados fora da sua cena, as VideoTextures não são atualizadas em todos os frames. Isso ajuda a reduzir o impacto para as cenas ao redor. Ainda assim, é ideal apenas ligar a reprodução de quaisquer vídeos quando os jogadores entram na sua cenaarrow-up-right .

Carregamento preguiçoso

Se sua cena for grande, ou tiver áreas internas que nem sempre estão visíveis, você pode optar por não carregar todo o conjunto de entidades desde o início. Em vez disso, carregue o conteúdo por região conforme o jogador visita diferentes partes da cena. Isso pode reduzir significativamente o tempo de carregamento da cena, e também a quantidade de texturas e conteúdo 3D que o engine precisa processar a cada frame.

Por exemplo, o prédio principal de um museu poderia carregar desde o início, mas as pinturas em cada andar só carregariam para cada jogador à medida que eles visitassem cada andar.

Veja esta cena de exemploarrow-up-right para como isso pode funcionar.

Para obter o melhor resultado em termos de evitar travamentos, oculte entidades alternando a propriedade visível de sua shape para false. Com essa abordagem, você as adiciona ao engine ao criá-las, mas simplesmente não torna seus modelos visíveis.

Uma alternativa é não adicionar as entidades ao engine até que sejam necessárias. Isso pode resultar em alguns travamentos quando as entidades aparecem pela primeira vez, e elas também podem levar alguns segundos para se tornarem visíveis. A vantagem dessa abordagem é que é uma forma válida de contornar o limitações da cenaarrow-up-right. Tenha em mente que a contagem de limitações da cena é para o conteúdo que está sendo renderizado na cena a qualquer momento, não para o conteúdo total que poderia ser renderizado. Carregar e descarregar partes da cena deve permitir que você contorne essas limitações.

circle-exclamation

Você também pode alternar animações ligadas ou desligadas para entidades que estejam distantes ou ocultas. Por exemplo, para um NPC que toca uma animação de idle bem sutil, você poderia fazê-lo tocar essa animação apenas quando o jogador estiver a menos de 20 metros de distância. Use uma trigger area ao redor do NPC e alterne suas animações conforme necessário.

circle-info

💡 Tip: Quando uma entidade está longe e pequena o suficiente, ela é removida por culling pelo engine. Esse culling ajuda ao nível de drawcall, mas remover entidades do engine é sempre melhor. Esse culling também não leva em conta a oclusão por outras entidades, então entidades que não são tão pequenas mas estão escondidas por uma parede ainda são renderizadas.

Blocos async

Blocos de async codearrow-up-right são processados em uma thread separada do restante da cena, para evitar bloquear o progresso de todo o resto.

Qualquer processo que dependa de respostas de serviços assíncronos, como getPlayerData() ou getRealm() deve sempre rodar em blocos async, pois caso contrário bloqueiam o restante do carregamento da cena enquanto aguardam uma resposta. O mesmo se aplica a quaisquer chamadas a servidores de terceiros.

Observe que a cena será considerada totalmente carregada quando tudo o que não é async estiver concluído. Processos async podem ainda estar em execução quando o jogador entra na cena. Evite situações onde um processo async resulte no carregamento de uma entidade que potencialmente possa prender o jogador dentro de sua geometria.

Confie em Events

Tente fazer a lógica da cena depender de escutar eventsarrow-up-right tanto quanto possível, em vez de executar verificações a cada frame.

O update() função em um sistemaarrow-up-right roda a cada frame, 30 vezes por segundo (idealmente). Evite fazer verificações recorrentes se você puder assinar um event em vez disso.

Por exemplo, em vez de checar constantemente os wearables do jogador, você pode assinar o onProfileChanged event, e verificar os wearables do jogador apenas quando eles tiverem mudado.

Se você precisar usar um system, evite fazer verificações ou ajustes a cada frame. Você pode incluir um timer como parte da função update e executar a verificação apenas uma vez por segundo completo, ou qualquer período que faça sentido.

Otimizar modelos 3D

Existem várias maneiras pelas quais seus modelos 3D podem ser otimizados para serem mais leves.

Ao trabalhar com o Creator Hubarrow-up-right, você pode ver estatísticas sobre os recursos usados pelos modelos 3D em sua cena, e se eles ultrapassam algum dos limitações da cenaarrow-up-right.



Você pode expandir este menu para ver detalhes.



Aqui estão algumas dicas para melhorar essas métricas:

  • Quando possível, compartilhe texturas entre modelos 3D. Uma boa prática é usar uma textura única como atlas, compartilhada entre todos os modelos na cena. É melhor ter 1 textura grande compartilhada de 1024x1024 pixels em vez de várias pequenas.

    Observação: Evite usar o mesmo arquivo de imagem tanto para a textura albedo quanto para o mapa normal ou o mapa emissivo de um material. Use arquivos separados, mesmo que idênticos. Atribuir o mesmo arquivo de imagem para diferentes tipos de propriedades de textura pode introduzir artefatos visuais indesejados quando comprimido em asset bundles.

  • .glb é um formato comprimido, ele sempre pesará menos que um .gltf. Por outro lado, com .gltf é fácil compartilhar imagens de textura exportando as texturas como um arquivo separado. Você pode ter o melhor dos dois mundos usando o seguinte pipelinearrow-up-right, que permite ter .glb models with external texture files.

  • Evite usar transparências blendadas. Transparências blendadas precisam contornar várias otimizações de renderização. Se possível, prefira geometria opaca ou com alpha test.

  • Evite meshes com skinning. Elas podem degradar o desempenho significativamente.

circle-info

💡 Tip: Leia mais sobre práticas recomendadas para modelos 3D na [Seção de Modelagem 3D](/creator/3d-modeling/3d-models

Conversão para Asset Bundle

Cerca de uma vez por dia, os servidores de conteúdo da Decentraland executam um processo para compactar cada .gltf e .glb model em cada cena recém-implantada para o formato de asset bundle. Esse formato é significativamente mais leve, tornando as cenas muito mais rápidas para carregar e mais suaves de executar no navegador.

circle-info

💡 Tip: Ao planejar um evento na Decentraland, certifique-se de implantar sua cena um dia antes, para que os modelos já tenham sido convertidos para asset bundles até lá. Se você não quiser estragar a surpresa antes do evento, pode implantar uma versão da sua cena que inclua todos os modelos 3D finais na pasta do projeto, mas onde estes não sejam visíveis ou tenham seu tamanho definido como 0.

circle-exclamation

Conectividade

Se sua cena se conecta a quaisquer servidores de terceiros ou usa o messagebusarrow-up-right para enviar mensagens entre jogadores, há também algumas coisas que você pode querer ter em mente.

  • Sua cena deve ter apenas uma conexão WebSockets ativa por vez.

  • Chamadas HTTP são canalizadas pelo engine de modo que apenas uma seja tratada por vez. Quaisquer solicitações adicionais são enfileiradas internamente e devem esperar até que outras solicitações sejam concluídas. Esse processo de enfileiramento é tratado automaticamente, você não precisa fazer nada.

  • Ao usar o messagebusarrow-up-right para enviar mensagens entre jogadores, tenha em mente que todas as mensagens são enviadas para todos os outros jogadores na server island. Evite situações em que uma mensagem recebida resulte diretamente no envio de outra mensagem, pois o número de mensagens pode crescer rapidamente de forma exponencial quando há uma multidão na cena.

UI da cena

UIs de cena podem se tornar custosas para renderizar quando são compostas por muitos elementos individuais. Tenha em mente que cada elemento de UI requer um drawcall separado no engine.

circle-info

💡 Tip: Tente mesclar múltiplos elementos em uma única imagem. Por exemplo, se você tem um menu com vários elementos de texto, o ideal é ter o texto dos tiles e quaisquer imagens adicionais baked na imagem de fundo. Isso poupa o engine de fazer um drawcall adicional por frame para cada elemento de texto.

Evite fazer ajustes na UI a cada frame, estes são especialmente custosos e podem acabar sendo enfileirados. Por exemplo, se houver uma barra de vida na sua UI que deva reduzir ao longo do tempo, os jogadores provavelmente não notariam diferença se ela atualizasse a 10 FPS em vez de 30 FPS (a cada frame). O sistema que atualiza essa barra pode usar um breve timer que conta 100 milissegundos, e só afetar a UI quando esse timer chegar a 0.

Evite ter muitos elementos de UI ocultos, eles também têm efeito no desempenho mesmo não sendo renderizados. Quando possível, procure criar componentes de UI sob demanda.

Monitorar desempenho

A melhor métrica para saber quão bem uma cena está performando é o FPS (Frames Per Second). No preview, você pode ver o FPS atual da cena no painel de debug. Você deve sempre visar ter 30 FPS ou mais.

Na cena implantada, você pode alternar o painel que mostra essas métricas escrevendo /showfps na janela de chat.

Um dos principais gargalos na performance de uma cena geralmente é o envio de mensagens entre o código da cena e o engine.

Quando você executa uma cena em preview, observe que no canto superior direito diz “Y = Toggle Panel”. Pressione Y no teclado para abrir um painel com algumas informações úteis que são atualizadas em tempo real.

Ao interagir com coisas que envolvem mensagens entre o SDK e o engine, você notará que o número 'Processed Messages' cresce. Você deve observar de perto o número 'Pending on Queue', ele deve sempre ser 0 ou próximo de 0. Isso indica quantas dessas mensagens não foram processadas e foram empurradas para uma fila. Se a contagem 'Pending on Queue' começar a crescer, então você entrou na zona de perigo e deve pensar em fazer mais otimizações na sua cena.

circle-exclamation

Tenha em mente que o desempenho que você experiencia no preview pode diferir daquele em produção:

  • Cenas vizinhas ao redor podem ter um impacto negativo

  • A compressão dos modelos 3D das cenas em asset bundles pode ter um impacto positivo

  • Alguns jogadores visitando sua cena podem estar rodando em hardware menos poderoso

É sempre uma boa prática tentar implantar sua cena primeiro no test environmentarrow-up-right para fazer alguns testes mais aprofundados.

Peça sempre feedback aos jogadores. Nunca presuma que como você experiencia a cena é o mesmo para todo mundo.

Atualizado