Error Unity Vulkan - Out of memory! (allocating memory for image)

Pessoal, não estou conseguindo encontrar nada que ajude, pois tudo que achei até agora não resolve nada. Alguém pode me ajudar?

Estou rodando o Jogo com o Android Logcat aberto e aparece esse erro:

Error Unity Vulkan - Out of memory! (allocating memory for image)

Depois desse erro aparece mais, mas tipo, estou entendendo que os outros erros acontecem por causa desse primeiro aí em cima.

O Celular na hora de abrir a Scene do jogo trava e aparece esses erros no Android Logcat.

Estou usando a Versão 2021.3.15f1 da Unity.

Toda e qualquer ajuda será mt bem vinda! Obg.

Isso ocorre em todo e qualquer projeto? Consegue testar em um projeto “vazio” (só a câmera e um cubo, por exemplo). O projeto dá problema ao rodar no computador, ou só no celular?

Seu projeto usa imagens/texturas muito grandes? Pode ser o caso de testar com imagens menores (em termos de resolução) pra ver se isso está causando o problema.

Pode também mudar o projeto para OpenGL, em vez de Vulkan, e ver se isso resolve. Veja como em: Unity - Manual: Graphics API support .

Por fim, pode testar com outras versões da Unity (2022, 2023), atualizando o projeto. Não é incomum algumas das versões da Unity terem bugs que só são corrigidos na próxima versão.

Abraço.

Obrigada pela resposta! Desculpe a demora. Vamos lá:

Isso ocorre em todo e qualquer projeto?

Só tenho esse!

Consegue testar em um projeto “vazio” (só a câmera e um cubo, por exemplo).

Sim. Nas Scenes em que só há o Canvas por exemplo. Funcionam normalmente, apesar de demorar uns 2 a 3 segundos pra carregar a scene. Estou achando que sejam os textos TMPro, mas enfim. A bronca mesmo é essa do Vulkan, pois é ela que não está deixando a scene do jogo ser aberta.

O projeto dá problema ao rodar no computador, ou só no celular?

No PC ele demora um tempo e depois abre. Mas no Celular quando chega na Scene do Jogo ele trata, fica com a tela preta e fecha o jogo.

Seu projeto usa imagens/texturas muito grandes? Pode ser o caso de testar com imagens menores (em termos de resolução) pra ver se isso está causando o problema.

Então. No começo do projeto enquanto eu estava aprendendo e implementado as coisas, coloquei imagens grandes sem nem saber que a Unity tem um limite no tamanho das imagens. Quando vi isso, reduzi o tamanho delas (diminuiu bastante), mas mesmo assim quando chega na scene do jogo que até então contem essas imagens, mesmo com os tamanhos pequenos, ele trava.
Até então eu não sabia que esse problema do Vulkan era as imagens, daí fiz um teste, fui nos scripts que contem as imagens nos atributos e passei uma imagem com o tamanho muito pequeno em todos eles, e o jogo abriu! Enfim descobri o que era essa parada do Vulkan. As imagens pelo visto ainda assim estão grandes, se não é isso, não sei oq é. Elas estão com o tamanho muito abaixo do limite máximo que uma imagem pode ter, que são 2M. As imagens maiores estão com o tamanho menor que 1M!
Daí pra tentar de outra forma, fiz um script só com as imagens, coloquei ele num objeto com uma TAG, coloquei um script nesse objeto para que ele não seja destruído ao mudar de uma scene para outra e coloquei ele na scene de carregamento do jogo. Essa scene é rodada antes da scene do jogo. Na scene do jogo eu pego esse objeto que contem o script que contem as imagens, pego ele pela TAG. Uso esse script em vários outros scripts na scene do jogo. Fiz isso no intuito de carregar as imagens antes do jogo, para quando entrar no jogo elas já estarem carregadas, mas dá no mesmo. Ele que antes tratava o jogo, agora está travando no carregamento. Com isso eu já sei que não são os scripts do jogo, mas este que contem as imagens. Quando as imagens estavam na scene do jogo ele dava muitos erros antes e depois da linha Vulkan - Out of memory! (allocating memory for image), mas agora que está na scene do carregamento, não está mais aparecendo essa linha, mas os outros erros que vinha junto estão aparecendo.

Pode também mudar o projeto para OpenGL, em vez de Vulkan, e ver se isso resolve. Veja como em: Unity - Manual: Graphics API support .

Já mudei. Não resolve.

Por fim, pode testar com outras versões da Unity (2022, 2023), atualizando o projeto. Não é incomum algumas das versões da Unity terem bugs que só são corrigidos na próxima versão.

Tentei a 2022, ainda não instalei a 2023. Estou com a 2021 por ser LTS, mas se não me engano quando eu mudei pra 2022 aconteceu o mesmo erro também. Vou tentar a 2022 novamente e vou tentar a 2023 também. A questão é que esse problema, quando rodo o jogo no pc, ele consome muita CPU no 1º frame pra depois abrir. Depois de aberto se o jogador voltar do jogo para a scene antes da scene do carregamento e ir pro jogo novamente, não demora mais. Mas no celular ele já trava de primeira, então nem dá pra saber se ele faria isso no celular. No celular trava pq está passando do limite da memória do celular, é isso que estou entendendo. Acredito que usando outras versões vai dar na mesma, pois o problema desse vazamento de memória não foi resolvido.

Como resolver essa parada?

Crie um novo projeto, vá adicionando os mesmos elementos do outro projeto um por um, e veja onde o erro começa a acontecer. Deixe os scripts por último.

O projeto demorar um pouco pra abrir é normal, não dá pra concluir muito por aí. O problema é mesmo não funcionar no celular.

A não ser que você precise de todas as imagens em todas as Scenes, não acho que seja uma boa ideia pré carregar tudo. Opte por carregar por demanda (quando precisa), mesmo que cada Scene demore um pouco pra carregar. Também use prefabs para os assets repetidos, evitando criar várias instâncias únicas. Dê uma pesquisada em tutoriais de otimização para mobile.

Infelizmente, é meio difícil de ajudar com projetos Unity, pois tem muitos detalhes, o tipo do projeto (2d/3D), pacotes carregados, etc. O erro aponta para um problema com o tamanho da imagem, mas não explica muito bem o que está realmente causando (a não ser que tenha mais informações nos seus logs). E estou meio enferrujado pra entrar nos detalhes específicos.

Note que os limites de cada textura são independentes da memória total do aparelho. Por exemplo: mesmo que o aparelho tenha 4/8GB de ram, por algum motivo, as texturas podem estar limitadas à 4MB cada, limitando bastante quão grande cada uma pode ser. Embora eu duvide que seja esse um problema em um aparelho razoavelmente moderno (lançado nos últimos 4 anos).

Eu criei um projeto simples 2D configurado para mobile, com algumas imagens grandes, texturas e botões. Veja se roda normal pra você.

Consegui rodar tranquilo em um Moto G4, um aparelho já bem antigo. Levou uns 2 minutos pra compilar e instalar. Então não acho que seja simplesmente o tamanho das imagens, mas a forma como você as carrega (e a quantidade, se forem muitas).

Abraço.

Crie um novo projeto, vá adicionando os mesmos elementos do outro projeto um por um, e veja onde o erro começa a acontecer. Deixe os scripts por último.

Vou fazer isso agora!

O projeto demorar um pouco pra abrir é normal, não dá pra concluir muito por aí. O problema é mesmo não funcionar no celular.

Então, fui no Profiler e lá eu vi que esse vazamento de memória (no pc) acontece por que a cpu vai lá pra cima, depois ela baixa e a coisa normaliza. Mas a ram do celular é diferente do pc. É como se ela não consegue ter memória pra carregar as imagens e com isso trava. Isso acontece assim que a scene que contem as imagens é carregada. Ela chega a nem abrir essa scene.

A não ser que você precise de todas as imagens em todas as Scenes, não acho que seja uma boa ideia pré carregar tudo. Opte por carregar por demanda (quando precisa), mesmo que cada Scene demore um pouco pra carregar. Também use prefabs para os assets repetidos, evitando criar várias instâncias únicas. Dê uma pesquisada em tutoriais de otimização para mobile.

Sim, eu preciso de todas essas imagens para a scene do jogo. Vou fazer isso que vc falou, no caso eu tô pensando em nisso mesmo que vc falou, carregar por demanda, no meu caso seria começar a carregar elas desde a 1º scene, a introdutória, carregaria algumas, já na Tela Inicial carregaria outra, na Tela Offline carrega mais outras, no carregamento mais outras e enfim no jogo as últimas. Essa é a sequência das scenes até chegar na scene do jogo.

Infelizmente, é meio difícil de ajudar com projetos Unity, pois tem muitos detalhes, o tipo do projeto (2d/3D), pacotes carregados, etc. O erro aponta para um problema com o tamanho da imagem, mas não explica muito bem o que está realmente causando (a não ser que tenha mais informações nos seus logs). E estou meio enferrujado pra entrar nos detalhes específicos.

O tipo do meu projeto é 3D. no caso é como eu falei do consumo da cpu tanto no pc quanto no celular. O pc aguenta por que tem memória pra isso, mas o celular não, por isso trava e fecha o jogo.

Note que os limites de cada textura são independentes da memória total do aparelho. Por exemplo: mesmo que o aparelho tenha 4/8GB de ram, por algum motivo, as texturas podem estar limitadas à 4MB cada, limitando bastante quão grande cada uma pode ser. Embora eu duvide que seja esse um problema em um aparelho razoavelmente moderno (lançado nos últimos 4 anos).

Meu celular é um Moto G6 Play e foi até bom ver que acontece esse erro nele, pois corrigindo já não vai acontecer com outros aparelhos semelhantes. Infelizmente só tenho meu celular mesmo, pra rodar o jogo.

Eu criei um projeto simples 2D configurado para mobile, com algumas imagens grandes, texturas e botões. Veja se roda normal pra você.

teste2d.zip - Google Drive

Consegui rodar tranquilo em um Moto G4, um aparelho já bem antigo. Levou uns 2 minutos pra compilar e instalar. Então não acho que seja simplesmente o tamanho das imagens, mas a forma como você as carrega (e a quantidade, se forem muitas).

Isso. forma que estou carregando as imagens é o seguinte:

  • Criei um script com o nome SpritesUsados;
  • Criei um script com o nome NaoDestroi_SpritesUsados;
  • Coloquei esses 2 scripts em um objeto na scene, no caso a do Carregamento. O NaoDestroi_SpritesUsados é para que ele não seja destruído na mudança de scene até chegar na scene do jogo, e se manter lá;
  • No script SpritesUsados só há os Atributos. São esses atributos que são justamente os sprites das imagens que estou carregando;
  • Na scene do jogo eu pego esse objeto que contem o script pela TAG. Depois de pego esse objeto, pego o script que está nele, e depois disso começo a usar os scripts normalmente. um exemplo desse uso seria:
    Image img;// nos atributos
    img.sprite = spTeste;// dentro de um método

Enfim, vou fazer os testes que vc falou. Quando terminar te dou retorno. Obg!

Voltei! A demora foi por que eu comprimi TODAS as imagens usadas no jogo, todas. Funcionou! Eu já tinha diminuído, mas ainda estavam grandes. Levei elas para o Photoshop e reduzi o tamanho da Imagem e ao comprimi-las na internet, elas ficavam pequenas e com qualidade. Funcionou, graças a Deus, tô muito feliz! (^.^)

O seu projeto não rodou, mesmo eu tendo colocado ele na Versão que tenho aqui no meu PC. Daí fiz um outro só pra isso, coloquei as imagens nele e rodou sem erro nenhum. Daí quando rodei o jogo também funcionou sem erros.

Obg pela ajuda!

1 curtida