Otimização de Desempenho
Otimize sua cena para carregar rápido e rodar suavemente para todos os jogadores.
Existem vários aspetos que você pode otimizar nas suas cenas para garantir a melhor experiência possível para os jogadores que as visitam. Este documento cobre algumas melhores práticas que podem fazer uma grande diferença em quão rápido sua cena carrega e quão suave 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 feito para jogos, e através do navegador, o que limita quanto do poder de processamento do hardware está disponível. A experiência de visitar sua cena deve ser suave para todos.
O Explorer da Decentraland aplica muitas otimizações a nível de 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 rodarem suavemente.
Temporização
Reprodução de vídeo
Reproduzir vídeos é uma das coisas mais custosas para a 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 na performance, mas assim que você adicionar uma segunda VideoTexture, seus efeitos na taxa de quadros tornam-se muito perceptíveis.
Você também deve evitar ter vídeos tocando em regiões onde eles não podem ser vistos. Por exemplo, se você tem uma tela dentro de um ambiente interno, ative o vídeo usando uma trigger area com base em quando o jogador entra e sai.
💡 Dica: Um truque que várias cenas usaram é streamar 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 mapping 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.
💡 Dica: Quando os jogadores estão fora da sua cena, as VideoTextures não são atualizadas a cada frame. Isso ajuda a reduzir o impacto para cenas ao redor. Ainda assim, é ideal só ativar a reprodução de vídeos quando os jogadores entram na sua cena .
Carregamento preguiçoso
Se sua cena é grande, ou tem áreas internas que nem sempre são visíveis, você pode escolher 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 a engine precisa lidar a cada frame.
Por exemplo, o edifício principal de um museu poderia carregar desde o começo, mas as pinturas em cada andar só carregam para cada jogador quando eles visitam aquele andar.
Veja esta cena de exemplo para como isso pode funcionar.
Para obter o melhor resultado em termos de evitar travamentos, oculte entidades alterando a propriedade visible da shape para false. Com essa abordagem, você as adiciona à engine ao criá-las, mas simplesmente não torna seus modelos visíveis.
Uma alternativa é não adicionar as entidades à engine até que sejam necessárias. Isso pode resultar em alguns travamentos quando as entidades aparecem pela primeira vez, e elas podem também levar alguns segundos para se tornarem visíveis. A vantagem dessa abordagem é que é uma maneira válida de contornar as limitações de cena. Tenha em mente que a contagem das limitações de cena é para o conteúdo que está sendo renderizado na cena em um dado 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.
📔 Nota: Entidades que não são visíveis mas estão adicionadas à engine contam para as limitações de cena.
Você também pode ativar ou desativar animações para entidades que estão distantes ou ocluídas. Por exemplo, para um NPC que toca uma animação de idle muito 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 ative/desative suas animações conforme necessário.
💡 Dica: Quando uma entidade está distante e pequena o suficiente, ela é culled pela engine. Esse culling ajuda a nível de drawcall, mas remover entidades da 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 code são processados em uma thread separada do resto 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 bloqueia o restante do carregamento da cena enquanto espera por uma resposta. O mesmo se aplica a quaisquer chamadas para servidores de terceiros.
Note que a cena será considerada completamente carregada quando tudo que não é async estiver concluído. Processos async podem ainda estar rodando quando o jogador entra na cena. Evite situações onde um processo async resulte no carregamento de uma entidade que poderia potencialmente prender o jogador dentro de sua geometria.
Dependa de Events
Tente fazer a lógica da cena depender de escutar events tanto quanto possível, em vez de executar verificações a cada frame.
A update() function em um system roda a cada frame, 30 vezes por segundo (idealmente). Evite fazer verificações recorrentes se você puder se inscrever em um event em vez disso.
Por exemplo, ao invés de verificar constantemente os wearables do jogador, você pode se inscrever no onProfileChanged event, e verificar os wearables do jogador somente quando eles mudarem.
Se você deve usar um system, evite fazer verificações ou ajustes em cada frame. Você pode incluir um timer como parte da função update e executar a verificação apenas uma vez a cada segundo completo, ou qualquer período que faça sentido.
Otimize modelos 3D
Existem várias maneiras pelas quais seus modelos 3D podem ser otimizados para serem mais leves.
Ao trabalhar com o Creator Hub, você pode ver estatísticas sobre os recursos usados pelos modelos 3D na sua cena, e se eles ultrapassam alguma das limitações de cena.

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 única textura como um atlas, compartilhada entre todos os modelos na cena. É melhor ter 1 textura grande compartilhada de 1024x1024 pixels em vez de várias pequenas.
Nota: Evite usar o mesmo arquivo de imagem tanto para a textura albedo quanto para o normal map ou o emissive map de um material. Use arquivos separados, mesmo que idênticos. Atribuir o mesmo arquivo de imagem a diferentes tipos de propriedades de textura pode introduzir artefatos visuais indesejados quando comprimidos 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 pipeline, que permite ter .glb modelos com arquivos de textura externos.
Evite usar transparências blended. Transparências blended precisam contornar várias das otimizações de renderização. Se possível, prefira geometria opaca ou com alpha test.
Evite skinned meshes. Elas podem prejudicar bastante a performance.
💡 Dica: Leia mais sobre melhores práticas para modelos 3D na [Seção de Modelagem 3D](/creator/3d-modeling/3d-models
Backface Culling
Para otimização de performance, Backface Culling será definido como On ligado em todos
os materiais do modelo uma vez renderizados na engine, independentemente de suas configurações.
Se você espera ver o verso ou o interior dos seus modelos, duplique as faces e inverta as normais.
Resolução de problemas
Para verificar se uma cena tem problemas de Backface Culling em materiais, siga estes passos:
Abra odebug
painel na cena.
Se a cena estiver publicada, digite o/debugcomando no chat.
Se você estiver no modo Preview na cena, clique no ícone de Bug (
) localizado no canto superior direito da tela.
O painel de debug aparecerá no canto inferior direito da tela. SobCurrent Scene , clique no botão Backface debugger

. AlternarForce Backface Culling
: Mostra os materiais renderizados com Backface Culling On. Esta é a renderização real uma vez que a Otimização esteja em produção. Alterne Ligado & Desligado para identificar materiais que precisam de correção. , clique no botão Alterne o
para identificar facilmente materiais que têm Backface Culling Off. Ele destaca:Red On.
: Materiais que não têm Backface Culling definido comoGreen On.
: Materiais com Backface Culling
Material com Backface Culling Off (esquerda) vs. Backface Culling On (direita)
Conversão para Asset Bundle .gltf Cerca de uma vez por dia, os servidores de conteúdo da Decentraland executam um processo para comprimir cada .glb e modelo em cada cena recém-implantada para o formato de asset bundle. Este formato é significativamente
💡 Dicamais leve, tornando as cenas muito mais rápidas para carregar e mais suaves de rodar no navegador.
📔 Nota: 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, você 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 onde seu tamanho esteja definido como 0. : Se você fizer qualquer
alteração em um arquivo de modelo 3D, mesmo que seja apenas uma mudança de nome, ele será considerado um novo arquivo, e deve ser convertido para o formato de asset bundle novamente.
Conectividade Se sua cena se conecta a servidores terceiros ou usa o messagebus
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 pela engine de modo que apenas uma seja tratada por vez. Quaisquer requisições adicionais são enfileiradas internamente e devem esperar até que outras requisições sejam concluídas. Esse processo de enfileiramento é tratado automaticamente, você não precisa fazer nada. Se sua cena se conecta a servidores terceiros ou usa o Ao usar o
para enviar mensagens entre jogadores, tenha em mente que todas as mensagens são enviadas para todos os outros jogadores na ilha do servidor. Evite situações em que uma mensagem recebida resulte diretamente no envio de outra mensagem, pois o número de mensagens pode crescer exponencialmente quando há uma multidão na cena.
UI da cena
💡 DicaUIs de cena podem se tornar custosas de renderizar quando são compostas por muitos elementos individuais. Tenha em mente que cada elemento de UI requer um drawcall separado na engine.
: 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 já embutidos na imagem de fundo. Isso poupa a 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 há uma barra de vida na sua UI que deve encolher ao longo do tempo, os jogadores provavelmente não notarão diferença se ela for atualizada a 10 FPS em vez de 30 FPS (a cada frame). O sistema que atualiza essa barra pode usar um timer breve que conte 100 milissegundos, e só afetar a UI quando esse timer chegar a 0.
Evite ter muitos elementos de UI ocultos; estes também afetam a performance mesmo se não estiverem sendo renderizados. Quando possível, tente criar componentes de UI sob demanda.
Monitorar Performance
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 buscar sempre 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 a engine.
Quando você executa uma cena em preview, note que no canto superior direito diz “Y = Toggle Panel”. Aperte Y no teclado para abrir um painel com algumas informações úteis que são atualizadas em tempo real.
📔 NotaÀ medida que você interage com coisas que envolvem mensagens entre o SDK e a engine, você notará o número ‘Processed Messages’ crescer. 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 de ‘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.
: Não mantenha o painel aberto enquanto não estiver usando, pois ele tem um impacto negativo na performance.
Tenha em mente que a performance que você experimenta no preview pode diferir daquela 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 que visitam sua cena podem estar utilizando hardware menos potente É sempre uma boa prática tentar implantar sua cena primeiro no test environment
para fazer testes mais aprofundados.
Atualizado