Endereçáveis: Planejamento e práticas recomendadas

Atualmente, os jogos estão maiores do que nunca. À medida que continuam a explorar os limites do hardware dos dispositivos modernos, torna-se cada vez mais crítico para os desenvolvedores gerenciar o conteúdo de forma eficiente em tempo de execução. E, à medida que os editores procuram otimizar as métricas de retenção e monetização de seus jogos, um pequeno cliente de jogo e atualizações dinâmicas de conteúdo over-the-air tornaram-se requisitos básicos para muitos jogos de sucesso.
O Unity fornece um pipeline completo para ajudar os desenvolvedores e editores a terem sucesso no mercado atual de jogos. Esse pipeline começa e termina com o Addressables, um pacote Unity que foi lançado em 2019 e agora alimenta milhares de jogos ao vivo bem-sucedidos e dezenas de milhares de outros em desenvolvimento.
O pacote Addressables fornece uma interface de usuário (UI) e uma API para organizar assets do Unity a serem incorporados em AssetBundles e carregados e descarregados dinamicamente em tempo de execução. Independentemente de os AssetBundles serem enviados com o seu jogo básico ou hospedados e entregues a partir de uma rede de distribuição de conteúdo (CDN) remota, como o Cloud Content Delivery, o Addressables ajuda você a carregar os ativos de que precisa, somente quando precisar deles.
Embora o sistema Addressables possa simplificar muitos aspectos do gerenciamento de conteúdo, ele não é um recurso do tipo "configure e esqueça". As escolhas que você faz sobre como organizar, criar, carregar e descarregar ativos endereçáveis têm implicações significativas no tamanho e no desempenho do seu jogo.
Este guia explora alguns dos fatores mais importantes a serem considerados para que você possa tirar o máximo proveito do sistema Addressables. No final deste blog, você encontrará "folhas de dicas" úteis que fornecem configurações gerais e recomendações de estratégia com base em casos de uso comuns de Addressables.
Obviamente, a melhor estratégia dependerá do jogo que você está criando e de seus objetivos. Trate este guia como uma referência a ser usada em conjunto com os materiais do Unity Learn, a documentação do Manual do Unity e o fórum da comunidade para Addressables.
Em sua essência, o Addressables é uma ferramenta para criar e trabalhar com AssetBundles. Antes de mergulhar na interface do usuário e na API do Addressables, é importante se familiarizar com o formato de arquivo AssetBundles e algumas das implicações do tempo de execução.
Você pode pensar nos AssetBundles como contêineres - eles são arquivos criados para suas plataformas de destino que podem conter assets como modelos, texturas, prefabs, ScriptableObjects, clipes de áudio e até mesmo cenas inteiras que o Unity pode carregar em tempo de execução.
Um recurso importante dos AssetBundles é que eles podem expressar dependências entre si. Por exemplo, o AssetBundle 1 pode conter um pré-fabricado que depende de uma textura no AssetBundle 2. Quando você usar o Addressables para carregar o prefab em tempo de execução, o sistema Addressables carregará automaticamente o AssetBundle 2 e a textura dependente na memória. E, se o AssetBundle 1 tiver outro ativo que dependa de um ativo no AssetBundle 3, o AssetBundle 3 também será carregado na memória, e assim por diante.

Quando o jogo está em execução, o sistema Addressables rastreia as referências ativas de todos os recursos, inclusive os recursos dependentes, como a textura discutida acima, para determinar quais precisam estar na memória. Um ativo carregado de um AssetBundle não pode ser liberado da memória até que sua contagem de referência e todas as outras contagens de referência de ativos no mesmo AssetBundle estejam em 0. O AssetBundle em si pode ser liberado da memória somente quando todas as contagens de referência de ativos no AssetBundle estiverem em 0.
Tendo em mente essa relação estreita entre Addressables e AssetBundles, a regra mais importante ao organizar o conteúdo de Addressables é criar AssetBundles que contenham conjuntos discretos de ativos que você espera que sejam carregados e descarregados juntos.
A decisão mais importante que você provavelmente tomará ao usar o Addressables é como organizar seus ativos em grupos Addressables. Aqui estão algumas perguntas a serem consideradas:
- Você deve criar muitos grupos pequenos ou um número menor de grupos grandes?
- Para cada grupo, quantos AssetBundles você deve tentar gerar (ou seja, você deve empacotar os ativos desse grupo juntos, separadamente ou por rótulo)?
- Você deve usar rótulos?
- Você deve fornecer aos seus grupos caminhos de carga locais ou remotos?
Embora gostaríamos de dar uma única resposta, a melhor estratégia de agrupamento de endereçáveis dependerá de vários fatores específicos do seu jogo.
Lembre-se: Os grupos de endereçáveis fornecem a estrutura organizacional para seus ativos endereçáveis que determina como esses ativos serão incorporados aos AssetBundles. Portanto, a melhor estratégia organizacional será aquela que empacota, carrega e descarrega seus AssetBundles de forma mais eficaz com base na estrutura, nas metas e nas limitações exclusivas do seu jogo.
Antes de começar a organizar o conteúdo dos Addressables, certifique-se de que você tenha uma sólida compreensão do seguinte:
1. A estrutura e o roteiro do seu jogo
2. Os pontos fortes e as limitações da plataforma de seu jogo
3. Seu(s) objetivo(s) principal(is) ao usar Addressables para otimizar o desempenho do seu jogo
Abordaremos cada um desses fatores a seguir.
O primeiro fator a ser considerado é a estrutura e o roteiro do seu jogo.
Por "estrutura", queremos dizer a arquitetura real do seu jogo. O seu jogo é uma jornada linear para um único jogador, em que o jogador progredirá por um conjunto previsível de níveis ou ambientes? É um jogo PvP multiplataforma com milhares de itens de vaidade que podem ser instanciados em momentos imprevisíveis? A estrutura do seu jogo determinará quando você precisará ter ativos carregados e prontos para uso e quando poderá descarregar ativos e AssetBundles da memória.
Lembre-se de tentar criar AssetBundles que contenham apenas os ativos que precisam ser carregados juntos e que podem ser descarregados juntos. Se o seu jogo for uma jornada linear com pontos de parada distintos, considere organizar grupos de Addressables em subconjuntos maiores de conteúdo associados a cada seção do jogo. Dessa forma, esses ativos podem ser carregados e descarregados juntos.
Se o seu jogo não for linear e for mais imprevisível, opte por grupos menores que gerarão AssetBundles menores, permitindo que você carregue e descarregue de forma mais dinâmica. Procure sempre usar nomes lógicos e significativos para seus grupos para ajudá-lo a localizar rapidamente os ativos e otimizar seu layout.
"Roteiro" refere-se a como seu jogo evoluirá ao longo do tempo. Depois que o jogo for lançado para os jogadores, ele permanecerá praticamente inalterado, exceto por correções ocasionais de bugs ou patches de equilíbrio do jogo? Ou você espera adicionar novos conteúdos regularmente sem exigir que seus jogadores instalem uma grande atualização do cliente?
Seu roteiro de conteúdo ajuda a informar sua estratégia de agrupamento. Se o conteúdo do seu jogo for independente e não for atualizado após o lançamento, concentre sua estratégia de agrupamento nas considerações estruturais discutidas acima. Se o seu jogo exigir atualizações frequentes de conteúdo, agrupe o conteúdo de forma que os jogadores possam baixar exatamente o que precisam, quando precisam.
Considere o uso de rótulos para ajudar a identificar o conteúdo de pacotes distintos que serão necessários juntos no tempo de execução, como um conjunto de itens cosméticos que crescerão com o tempo à medida que o jogo amadurece. Você também pode usar o modo de pacote "Pack Together By Label" nas configurações de grupos para subdividir o conteúdo que você agrupou logicamente.
Por exemplo, talvez você planeje lançar um novo evento "Halloween 2023" com alguns itens cosméticos para os jogadores colecionarem. Seu grupo "Halloween 2023 Outfits" pode conter ativos com os rótulos "Hats" (Chapéus), "Shoes" (Sapatos) e "Masks" (Máscaras). Você poderia então adicionar um rótulo "Halloween 2023" a todos os ativos desse grupo. Usar o modo de pacote "Pack Together By Label" para esse grupo criará três AssetBundles no momento da compilação.
Em tempo de execução, você pode carregar todos os recursos endereçáveis com o rótulo "Hats" (Chapéus) na tela de personalização do personagem para garantir que todos os recursos com esse rótulo sejam baixados, carregados na memória e estejam prontos para serem vistos pelos jogadores. Ou você pode carregar todos os ativos endereçáveis com o rótulo "Halloween 2023" na página promocional do seu evento, garantindo que eles estejam prontos para serem exibidos aos jogadores.


Ter uma compreensão profunda da estrutura e do roteiro do seu jogo o ajudará a tomar decisões informadas sobre a organização do conteúdo que serão benéficas durante todo o ciclo de vida do jogo.
Em seguida, abordaremos os pontos fortes e as limitações específicas de suas plataformas e o que elas significam para sua estratégia de conteúdo.
O próximo fator a ser considerado são os pontos fortes e as limitações das plataformas que você está almejando para distribuição. Nesta seção, descrevemos os alvos de plataformas comuns para usuários de Addressables, bem como algumas considerações importantes para cada um deles.
Celular e VR
Para plataformas móveis e de VR, as considerações mais importantes a serem feitas são o tamanho do aplicativo, o tamanho do conteúdo incluído e as velocidades de download.
Para seus grupos, considere os conjuntos de conteúdo de que os jogadores precisarão imediatamente após a instalação (por exemplo, para poder concluir o tutorial). Certifique-se de que esse conteúdo esteja organizado em grupos com caminhos de carregamento locais para que seja incluído em seu jogo base. Organize todos os outros conteúdos em grupos com caminhos de carregamento remotos para que você possa fornecer esse conteúdo por via aérea aos seus jogadores.
Opte por uma estratégia de grupo que criará AssetBundles relativamente pequenos. O equilíbrio exato dependerá de seu jogo. Evite pacotes extremamente grandes que consumirão uma quantidade substancial de memória e serão difíceis de liberar depois de carregados. Da mesma forma, evite um grande número de pequenos pacotes que possam criar um arquivo de catálogo Addressables muito grande que será baixado a cada atualização de conteúdo. Muitos pacotes minúsculos também podem afetar a velocidade com que os jogadores podem fazer o download do conteúdo de que precisam, portanto, esteja atento a esses prós e contras ao determinar o equilíbrio certo para o seu jogo.
Desktop e consoles
Para desktops e consoles, a consideração mais importante é o desempenho. Em comparação com os dispositivos móveis e o hardware de RV sem fio, o hardware de desktop e console normalmente tem menos restrições de memória e armazenamento em disco. Com isso em mente, considere uma configuração de grupo que criará AssetBundles não compactados. Isso proporcionará o tempo de carregamento mais rápido possível e pode até mesmo proporcionar a aplicação eficiente de patches em determinadas plataformas.
Ao desenvolver especificamente para consoles, preste muita atenção às restrições de cache específicas da plataforma que possam ser aplicadas. Embora as plataformas móveis permitam que você aproveite o AssetBundle Cache do Unity para conteúdo baixado, essa funcionalidade é desativada por padrão no nível da engine Unity para determinados consoles e WebGL. Considere atualizar seu jogo básico com o novo conteúdo nessas plataformas em vez de tentar fornecer conteúdo remoto pelo ar. Caso contrário, você precisará criar seu próprio sistema de cache AssetBundle personalizado e determinar se sua solução está em conformidade com os termos de serviço dessas plataformas.
Depois de avaliar os pontos fortes e as limitações de suas plataformas-alvo, identifique um ou dois objetivos principais que você está tentando alcançar usando o sistema Addressables. Por exemplo: O seu objetivo principal é reduzir o tamanho do jogo básico ou você planeja fornecer atualizações de conteúdo over-the-air aos jogadores? Para demonstrar, vamos discutir essas e outras opções em detalhes a seguir.
Minimização do tamanho do jogo base
Se o seu objetivo principal for minimizar o tamanho do jogo básico e você não estiver tão preocupado com limitações de memória ou grandes downloads após a instalação, seu foco principal deverá ser a migração do maior número possível de ativos de cenas e recursos para um ou mais grupos de Addressables com caminhos de carregamento remotos.
Considere a possibilidade de tornar as cenas de seu projeto endereçáveis e determine quais, se houver, devem ser incluídas na compilação do player principal. Para aquelas que podem ser entregues aos jogadores após a instalação, inclua essas cenas em grupos com caminhos de carregamento remotos. Você pode até mesmo criar um jogador com uma cena quase vazia e carregar o restante do jogo dinamicamente a partir dela, conforme explicado neste vídeo do Open Projects Devlog.

Se você tornar qualquer cena endereçável, é melhor tornar todas elas endereçáveis para reduzir a chance e o volume de duplicação desnecessária de ativos.
Para grupos que gerarão AssetBundles a serem hospedados remotamente, certifique-se de ativar o cache de AssetBundle. Essa configuração garantirá que os AssetBundles baixados sejam armazenados em cache nos dispositivos dos jogadores, evitando que eles tenham que baixar novamente a cada sessão.
Embora seja sempre bom ter em mente as implicações de tempo de execução de muitos pacotes pequenos em comparação com poucos pacotes grandes, essas considerações se tornam mais relevantes quando se leva em conta outros objetivos que você possa ter.
Fornecimento eficiente de conteúdo remoto aos jogadores
Se o seu objetivo principal for o fornecimento eficiente de conteúdo remoto, a estrutura do grupo deverá refletir como você pretende dividir o conteúdo entre "local" (ou seja, ativos incluídos na compilação do player) e conteúdo "remoto" (ou seja, ativos hospedados em uma rede externa de fornecimento de conteúdo). Novamente, certifique-se de ativar o AssetBundle Cache para armazenar em cache o conteúdo baixado nos dispositivos dos jogadores.
O tamanho, o número e o Modo de Pacote desses grupos dependerão de quando você espera entregar o conteúdo remoto aos seus jogadores e de quanto tempo você está disposto a deixá-los aguardar a conclusão dos downloads. Por exemplo, se a estrutura do seu jogo permitir a entrega de todo o conteúdo remoto logo após a instalação do jogo básico, você poderá optar por grupos maiores com Pack Together ou Pack Together By Label, o que resultará em um pequeno número de downloads grandes.
Se você espera fornecer conjuntos menores de conteúdo remoto aos jogadores ao longo de suas sessões, o que atrapalhará menos a experiência, poderá optar por grupos menores e/ou uma configuração de Modo de pacote que gerará AssetBundles menores que serão baixados muito mais rapidamente.
Na maioria dos casos, para grupos que contêm conteúdo remoto, considere a opção Enabled, Excluding Cached (Ativado, Excluindo em Cache ) para a opção CRC (Cyclic Redundancy Check) do AssetBundle. Isso fornecerá garantias adicionais da integridade do seu conteúdo remoto, pois ele está sendo armazenado em cache nos dispositivos dos jogadores, evitando a sobrecarga adicional de executar um CRC para carregar o conteúdo que já está nos dispositivos dos jogadores.
Otimização do uso e do desempenho da memória em tempo de execução
Se o seu objetivo principal for otimizar o desempenho do tempo de execução do jogo e o uso da memória, lembre-se da regra mais importante da organização de grupos de endereçáveis: Os ativos que você planeja carregar e descarregar ao mesmo tempo devem ser agrupados.
De modo geral, isso significa criar AssetBundles menores. Você pode conseguir isso de várias maneiras, inclusive criando grupos menores e/ou evitando o modo de pacote "Pack Together" nas configurações de grupo para grupos grandes que contêm ativos que nem sempre serão necessários ao mesmo tempo em seu jogo.
Você também deve ficar de olho no desempenho do tempo de execução para ajudá-lo a identificar possíveis problemas ou áreas de otimização. Aproveite as ferramentas oficiais do Unity, como o Unity Profiler, o pacote Memory Profiler ou o Addressables Event Viewer, que podem ajudar a otimizar o desempenho do seu jogo.
Fique atento ao futuro Addressables Profiler Module, que substituirá o Addressables Event Viewer. Essa nova ferramenta fornecerá informações ainda mais detalhadas sobre como seu código está carregando e descarregando ativos endereçáveis e AssetBundles, incluindo informações detalhadas sobre dependências entre seus ativos e AssetBundles.
Múltiplos objetivos
É claro que a maioria dos projetos terá vários objetivos associados aos Addressables. Nesse caso, não há realmente uma abordagem única para todos os casos. Você precisará avaliar as vantagens e desvantagens descritas acima e encontrar a estrutura e as configurações do grupo que melhor atingirão o sucesso que você definiu.
Recomendamos que você aproveite o Addressables Build Report e o Addressables Profiler Module, disponíveis em breve no Addressables 1.21.3. O Addressables Build Report fornecerá informações detalhadas sobre os AssetBundles que foram gerados a partir de suas compilações do Addressables, incluindo o tamanho do arquivo, possíveis duplicatas e informações detalhadas sobre dependência. O Addressables Profiler Module é uma nova ferramenta de análise de tempo de execução que aproveita esses novos dados de dependência, fornecendo informações precisas sobre o que foi carregado pelo seu código Addressables e por que foi carregado.
Abaixo, fornecemos algumas "folhas de dicas" úteis para nossas configurações e estratégias recomendadas para Addressables com base em alguns dos casos de uso mais comuns. É claro que essas são apenas sugestões - cabe a você determinar se uma sugestão se alinha à estrutura exclusiva do seu projeto e às suas metas específicas.
- Um jogo para celular com atualizações frequentes de conteúdo
- Um jogo autônomo e independente para desktop ou console
- Um jogo de RV criado para o Meta Quest 2
Se você tiver dúvidas ou quiser saber mais sobre o pacote Addressables, visite-nos no fórum Addressables. Você também pode entrar em contato comigo diretamente pelo Twitter em @Unity_Jeff. Fique atento aos novos blogs técnicos de outros desenvolvedores do Unity como parte dasérieTech from the Trenches.