Projetar para desempenho significa seguir um punhado de melhores práticas enquanto você constrói seu jogo. Comparado a encontrar e corrigir problemas de desempenho mais tarde no processo de desenvolvimento, projetar para desempenho desde o início pode economizar muito tempo e esforço.
Dispositivos de baixo desempenho
Dispositivos de baixo desempenho, especialmente dispositivos móveis, têm limitações severas de memória e são suscetíveis a falhas devido a erros de falta de memória (OOM):
Se você quiser dar suporte a dispositivos de baixo desempenho, escolha pelo menos um dispositivo "base", teste seu jogo nele durante todo o processo de desenvolvimento e preste atenção na taxa de quadros e no uso de memória. Ao encontrar áreas problemáticas em seu jogo, use essas áreas para identificar os limites do seu dispositivo.
Por exemplo, você pode testar um jogo com as estatísticas de depuração Render (ShiftF2) e Resumo (ShiftF2) ativadas. Se a taxa de quadros começar a cair em uma área particularmente desordenada, você poderia examinar os números de Desenho (cena) e determinar que precisa ficar abaixo de 1.000 chamadas de desenho e 1.000.000 triângulos para que o jogo funcione bem no seu dispositivo base.
Ou você poderia examinar o Console do Desenvolvedor (F9) e notar que o uso de memória está um pouco alto, a menos que você ative streaming. Ter uma compreensão clara dos limites do dispositivo pode ajudar você a se manter abaixo deles enquanto continua a construir seu jogo.

O emulador de dispositivos no Roblox Studio é útil para verificar a proporção da tela e os controles, mas não é preciso para uso de memória; quando você testa um jogo no Studio, ele executa o servidor e o cliente, então o uso de memória é significativamente maior.
De maneira mais geral, testar em uma variedade de dispositivos pode ajudar você a verificar se o jogo corresponde às suas expectativas visuais e de desempenho em diferentes níveis de qualidade gráfica. Para um exemplo muito mais detalhado de como você pode pensar em otimizar seu jogo para dispositivos móveis de baixo desempenho, veja Otimização de Construção e Script no Mundo Real.
Streaming e teletransporte
Streaming de instâncias permite que o Roblox carregue e descarregue dinamicamente conteúdo 3D e é uma ótima opção para a maioria dos lugares, especialmente os maiores. O streaming melhora os tempos de entrada, reduz a pegada de memória e aumenta a taxa de quadros.
Por exemplo, quando você ativa Workspace.EnableSLIMAvatars e define a propriedade LevelOfDetail de seus modelos de mundo para SLIM, você pode criar mundos com espaços sociais e eventos lotados que permanecem visualmente povoados enquanto escalam em uma ampla gama de capacidades de dispositivos. Para mais informações, veja SLIM e Melhorar desempenho.
Considere dividir lugares grandes em outros mais gerenciáveis e usar teletransporte para mover jogadores entre eles. Essa abordagem pode reduzir os tempos de entrada iniciais, mas impõe tempos de entrada adicionais à medida que os jogadores se teletransportam de lugar para lugar. Os benefícios para o uso de memória variam dependendo do tamanho do lugar e se você ativou o streaming.
Mesmo ignorando considerações de desempenho, você pode descobrir que ter múltiplos lugares simplifica o processo de desenvolvimento, especialmente se você adicionar regularmente novo conteúdo ao seu jogo ou fizer parte de uma equipe maior.
Materiais e duplicação
Materiais integrados usam muito menos memória do que texturas personalizadas, mas podem não corresponder à sua visão artística. Tente usar materiais sempre que possível para preservar o orçamento de memória para as texturas que são centrais para o seu jogo.
À medida que você cria ativos, converta-os em pacotes. Fazer dos pacotes parte do seu fluxo de trabalho ajuda a evitar o problema comum de ativos duplicados com IDs diferentes, que podem prejudicar o desempenho.
Quando você adiciona malhas e texturas, use e reutilize-as em vez de importar cópias duplicadas. Redimensionando, girando e sobrepondo, você pode criar ambientes ricos e variados que requerem muito poucas chamadas de desenho. Para mais informações, veja Remover texturas duplicadas.
Transparência
- Evite valores de transparência diferentes de 0 (visível) e 1 (invisível). Quando você usa transparência parcial, tenha cuidado especial para evitar overdraw de alta transparência.
Script
Sempre que possível, escreva código orientado a eventos em vez de cálculos por quadro. A 60 FPS, o orçamento total para cada quadro é de 16,67 milissegundos (ms). Mesmo cálculos por quadro aparentemente menores podem usar uma parte significativa desse orçamento.
Encontre maneiras de dividir códigos de longa duração em partes gerenciáveis. Se um pedaço de código leva 100 ms para executar e você o roda a cada quadro, seu jogo só pode rodar a 10 FPS. Se você decidir rodar o código apenas uma vez por segundo em um jogo que de outra forma roda a 60 FPS, 59 de seus quadros chegam após 16,67 ms... e então um após 100 ms, o que causa uma tremulação brusca.
Em vez disso, investigue como você pode dividir o código. Talvez você possa realizar 5 ms de trabalho por quadro, usar task.wait(), e ter o cálculo concluído a cada 20 quadros enquanto mantém 60 FPS. Multithreading, às vezes chamado de Luau Paralelo, também pode ajudar.
Use o método RBXScriptConnection:Disconnect() para parar funções de serem chamadas desnecessariamente na próxima vez que um evento for disparado.
Não chame o mesmo método toda vez que precisar de um valor. Chame o método uma vez, armazene o valor e então sobrescreva-o mais tarde conforme necessário.
Não armazene tudo em ReplicatedStorage. O cliente carrega tudo que está neste contêiner. Em vez disso, use ServerStorage para qualquer coisa à qual o cliente não precise ter acesso.