Boa noite!
Pessoal, meu jogo está lento, travando e cortando as Animações renderizadas. Isso é normal? Se sim, tem alguma outra forma de renderizar objetos 3d para o Canvas?
Eu renderizo com câmera como nesse Vídeo.
Desde já mt obg!
Boa noite!
Pessoal, meu jogo está lento, travando e cortando as Animações renderizadas. Isso é normal? Se sim, tem alguma outra forma de renderizar objetos 3d para o Canvas?
Eu renderizo com câmera como nesse Vídeo.
Desde já mt obg!
Quanto de FPS está obtendo? Se seu computador tem os requisitos para rodar a Unity e jogos 3D (ou seja, tem uma placa de vídeo dedicada e decente), em teoria não deveria travar ao rodar um projeto simples. Mas pode ter algo no seu projeto causando lentidão e travamentos.
Se você remove essa parte de renderizar para o Canvas, o projeto roda normal? Se sim, então o método está causando a lentidão.
Notei que o vídeo é para a Unity 5.6, que já é bem antiga. É a mesma versão que você está usando? Se não, chegou a procurar um tutorial para uma versão mais recente?
Abraço.
Quanto de FPS está obtendo?
- Printei a Tela, segue nas imagens.
1:
2:
3:
4:
Se seu computador tem os requisitos para rodar a Unity e jogos 3D (ou seja, tem uma placa de vídeo dedicada e decente), em teoria não deveria travar ao rodar um projeto simples. Mas pode ter algo no seu projeto causando lentidão e travamentos.
- Essa lentidão e travamento é no celular, no pc ele roda normalmente.
Se você remove essa parte de renderizar para o Canvas, o projeto roda normal?
- Nunca fiz isso, eu realmente preciso dessas renderizações. Elas são as animações dos Poderes do Jogo. Por isso perguntei se tem outra forma de renderizar diferente da do vídeo que mostrei. Pois se for isso e tiver outra forma de renderizar que não faça isso, vou nela!
Notei que o vídeo é para a Unity 5.6, que já é bem antiga. É a mesma versão que você está usando?
- Minha versão é a “2021.3.33f1”
Se não, chegou a procurar um tutorial para uma versão mais recente?
- Sim, procurei. Só semelhantes, como este https://www.youtube.com/watch?v=qXQxBwTujnA e ele tem apenas 5 meses. Por isso que fiz o tópico, pois não achei coisa diferente, nem em inglês.
Jogos para celular tem requisitos diferentes dos jogos no computador (seja rodando na Unity ou não). Só por que algo funciona bem no PC, não quer dizer que vai rodar bem no celular. Sempre considere isso quando estiver desenvolvendo pra celular, especialmente se seu celular não é muito potente.
Você realmente precisa dessas animações, ou é algo que “seria legal ter mas aceito alternativas” ? Por que precisa de uma animação 3D no canto da tela? Uma imagem estática ou animação 2D simples (sequência de imagens) pode ser mais simples, e você pode usar componentes de UI normais, em vez de uma segunda câmera e todo esse processo pra renderizar um objeto 3D (que sempre é mais custoso em termos de processamento). Algo como mostrado em https://www.youtube.com/watch?v=87cF8jqVpBA , mas para UI em vez do espaço 3D. Procure por algo como “unity UI 2D image sequence” ou “unity sprite animation” .
Abraço.
Pois é, eu sei disso, mas mandei os prints pra vc ter uma noção de como está no meu pc pelo Profiler, justamente por que não dá pra ver quantos frames está rodando no celular, só no pc. O máximo que posso fazer eh debugar com o AndroidLocat com o celular plugado no pc. Nele eu posso ver as causas dos erros que estejam acontecendo. Mas mesmo pelo Profiler não dá pra ver os frame no celular. Não dá nem pra dizer que o que aparece no Profiler no pc é a mesma coisa que no celuar. Se for, os prints são válidos para o ceular, mas acho que não…
Veja, eu preciso das animações. A questão é que renderização pelo “modo tradicional” deixa essa lentidão. Pelo vídeo vc viu como é feita, tem vídeos de uns 5 meses que mostra a mesma forma de renderizar. A turma não mudou nada! Não que eu saiba.
Falando brevemente, renderização é nada mais, nada menos, que pegar objetos 3D de uma scene 3D e converter para uma imagem 2D para ser exibido no Canvas, a antiga UI. Isso é feito quando vc aponta uma Câmera para esses objetos e, por meio do renderer texture, é criado/gerado/linkado uma imagem 2D que vc pode colocar no RawImage no Canvas e vc vê esses objetos 3D numa imagem 2D.
Foi isso que eu fiz, só que do “modo tradicional”. Minha questão é:
Não, elas não são mostradas no canto da tela. Elas não são mostradas de forma constante. Eu só “ligo/rodo” elas para aparecerem na tela, quando o Jogador clica no botão que abre uma janela (ela é ativada) com as animações e os textos dizendo o que cada uma delas faz. Isso pra mim no meu jogo é imprescindível. Quando o jogador fecha a janela, as animações são “desligadas”, deixam de rodar e a janela fica Desativada. Essa forma de tratar, ligando/Desligado, Ativando/Desativando, não deveria ter essa lentidão, já que as coisas só são Ativadas/Desativadas no evento do Botão clicado pelo jogador. Também tenho a Loja. Nela sim as Animações são constantes, pois estão no painel que são exibidas junto com botões para que o jogador clique e compre poderes. também há a loja das moedas. Na Loja das moedas não fica tão lento. Pode ser que isso é por que só é um objeto 3d só que aparece nos RawImages, que no caso é apenas um moeda girando, não sei… Digo isso por que na loja dos poderes são as animações dos poderes, e elas são diferentes, e também tem bem mais coisas que são renderizadas, pois cada poder é único. Mas acho que não é isso, renderização é renderização. Suspeito das Câmeras… Eu sinceramente não sei oq seja, por isso que criei o tópico, pra descobrir oq é e resolver!
No caso, meus objetos são 3d. Só renderizando mesmo. Agora se isso que vc falou é possível com imagens 3D, irei me aprofundar!
Vi o Vídeo, seria mt bom se fosse possível, diante do material que tenho. Esse conteúdo que vc está sugerindo são para sprites em sequência. No meu caso são personagens, torres, correntes, bolas de ferro, escudos, efeitos sobre esses objetos, texturas que são ativadas/desativadas no meio das animações… Se eu fosse fazer essa sugestão, eu iria printar cada frame de cada animação pra fazer sprites pra rodar um após o outro pra gerar uma animação 2D, sendo que dá pra fazer nesse “modo tradicional” sem problemas, e é o mais adequado pra o material que estou trabalhando. Detalhe: no decorrer das atualizações do jogo, posso querer mudar detalhes que fazem total diferença, coisas de jogo msm. Lá vai eu fazer o mesmo procedimento pra pegar esse detalhe no frame certo. Vey, não vale a pena! Até por que investi mt tempo criando essas animações! Estão mt boas e esse procedimento do “modo tradicional” é que é mais indicada a ser feito! Se vc me permitir, posso mostrar ele rodando no Discord pra vc. Deixa eu terminar umas pendências e corrigir alguns bugs que te mostro. A questão é que tá tão corrido pra mim aqui, mas assim que eu puder, te mostrarei! Pode ser? Obg!
Você pode exibir o FPS em um UI Text na tela do aparelho. Pode procurar por Unity show FPS, vai encontrar vários exemplos.
Eu entendi o processo. Minha recomendação foi mais no sentido de levar em consideração que celulares e computadores tem capacidades diferentes. Só por que algo funciona bem no PC, não quer dizer que vai funcionar bem no celular. Você sempre precisa levar em conta o hardware mais fraco, e adaptar seu projeto sempre que necessário.
Quando perguntei se você realmente precisa dessas animações, foi mais no sentido de possivelmente otimizar o processo usando sprites e sequências de imagens para as animações 3D (não são imagens 3D, são spritesheets), que normalmente são mais baratos de renderizar que animações 3D.
Mas, deixando isso de lado, eu fiz um projeto simples de FPS (sem controle, só movendo a câmera pra frente), e usei um desses tutoriais de animação pra exibir no RenderTexture. No meu PC, roda em torno de 120FPS. No meu celular (Moto G 32, um aparelho mediano/fraco), roda a 30 fps, que é o esperado. Print do celular:
Projeto (Unity 2021.2.7) : testefps.zip - Google Drive
Pelo que entendo, o método em si não tem nenhum problema. Acho que você vai ter de investigar um pouco mais. Os gráficos do profiler que você mostrou tem uns picos estranhos, não acho que seja só esse método do RenderTexture que esteja causando isso.
Você está carregando tudo isso de uma vez ou sob demanda? Está tudo isso na memória, e você só vai desabilitando e habilitando conforme necessita?
Como era o desempenho antes de você tentar usar esse método pra exibir objetos?
Quantos objetos são? Quão complexos eles são? Tem muitos vértices? As texturas são grandes (2k/4K)? Mudar as texturas causa alguma diferença ? (ex: pra um objeto pequeno no canto da tela, 512px deve ser suficiente). Nota alguma diferença se usar objetos estáticos (sem animações) ?
Não vai rolar, até porque estou enferrujado na Unity e olhar seu projeto pode tomar mais tempo do que eu estou disposto no momento.
Abraço.
Menino, que besteira minha! Vou fazer isso! Não fiz antes por que estava mt preocupada com todo o trabalho de fazer a lógica do jogo mais pesada. Obg pela dica, tão simples, mas que não pensei nisso rsrs…
Pois é. Essa investigação vai ser um pouco demorda…
Mais ou menos. Estou usando Coroutines. Então, por exemplo, a 1ª é carregada depois de 1s. A 2ª depois de 5s e assim vai. Controlo elas por variáveis do tipo bool pra que elas não fiquem soltas no Update(). Nas Cotourines estão os tratamentos dos objetos. Cada Coroutine trat de uma coisa. A sequencia das Coroutines faz as Animações acontecerem nos tempos certos. Também uso Eventos.
Sim.
Já fiz um teste de carregar uma Scene só com os objetos que são animados. Tudo rodou em 1s e não estava lendo, isso no celular também. Mas quando fui implementando as coisas, os scripts form crescendo e só agora que estou testando essa lentidão. É realmente a questão da investigação que vc falou…
São muitos. Por exemplo, fui no Blender e modelei um cubo no formato de uma torre e desfragmentei ele para simular as pedras da torre. Daí cada pedaço é um objeto. sem falar nos personagens, nas bolas de ferro que tem correntes. Cada parte daa corrente é um objeto, e assim vai. Não são complexo não, só não são poucos. Quanto aos Vétices, testei 100 personagens lowpole e 100 dos que tem muitos vértices, se comparado com os lowpole. Mesma coisa, ambos abriram a scene em 1s, no máximo 2s. E se não me engano, os lowpole demoraram alguns sentésimos a mais do que os outros personagens. Mas calma, não são 100 personagens no meu jogo. Só 16! Sem os scripts eles não pesam nada. Mas com o decorrer do tempo, os scripts foram crescendo e só agora que estou tratando dessa lentidão. Não entendo por que seriam os scripts, pois as Coroutines das Animações não estão soltas no Update(), sem falar no Eventos.
Não. Tenho vários sprites, de fato. Mas a Maioria estão em torno de 10k a 50k, mas tem uma grande minoria que está com mais ou menos 120k. Elas não as Texturas dos Personagens (Bottom, Hair, Shoes, Top) e, como disse, só eles sendo carregados não pesa em nada, é 1s ou no máximo 2s. Vi que a Unity tem uma tolerância de 2M por scene. Daí pequei todos os sprites, meteriais e colors e coloquei em Scripts separados para serem carregados por diferentes scenes. Daí eles não ficam soltos e quando carrega, a Scene já fica leve.
Olha, estou trabalhando com Images no Canvas tendo seus Sprites setados por essas imagens que adminitro nesses Scripts que falei. Textura mesmo eu só tenho nos personagens, as quais não pesam quase nada, pois os 100 personagens abriram a scene em 1s! É um mistério, sinceramente não sei oq é.
Não. Os objetos em sí são a mesma coisa. Vou fazer essa investigação e volto pra dizer oq foi. Vai ajudar mt gente que esteja com o mesmo problema.
Sem problemas! Mt obg pela atenção e um outro abraço!
Acabei editando aqui, pra não confundir quem acompanhar o tópido, nem vc, pois deu errado o que eu fiz no começo, mas corrigi e está dando certo!
Criei o Script “VerFpsNoCelular” e coloquei na Scene “VerFpsNoCelular” e adicionei ela às Scenes no meu Script que Gerenciona as Scenes do Jogo depois de todas as Scenes que são adicionadas à Atual.
Rapaz… o FPS está lá em baixo! No PC nas telas ele fica entre 18 e 45, mas no Celular chegou a 6, 7, 8 FPS! Putz…
Usei esse Script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class VerFpsNoCelular : MonoBehaviour {
float pollingTime = 1f, time, frameCount;
int frameRate;
public TMP_Text txtFps;
void Update() {
time += Time.deltaTime;
frameCount++;
if(time >= pollingTime) {
frameRate = Mathf.RoundToInt(frameCount/ time);
txtFps.text = frameRate.ToString() + " FPS";
time -= pollingTime;
frameCount = 0;
}
}
}
Rapaz… cheguei a pensar em usar vídeos, em vez das animações, mas eu lembro que fiz isso logo no começo do projeto e ficou a mesma coisa que agora com as Animações, se brincar ficou pior! Ele demora pra carregar o vídeo.
Na Scene principal do Jogo deu 15, 39 FPS no PC. Já no Celular deu 9, 8, 10 FPS! misericórdia! Mesmo assim, dá pra jogar, só fica um pouco lento. Vou ter que corrigir isso urgente! Qualquer ajuda é bem vinda!
Não estendendo muito, só adicionando algumas observações.
Primeiro, deu uma olhada no exemplo que postei? Ele usa o método de exibir o objeto em uma segunda câmera, e é simples, mas mostra que, a princípio, não tem nenhum problema com esse método isoladamente (mas pode ter quando são muitos objetos e combinados com outras coisas). Tem também um texto simples exibindo o fps. Link: testefps.zip - Google Drive
Acho que você está tendo um acúmulo de coisas que, combinadas, causam lentidão. É algo que ocorre facilmente se você não ficar de olho. Um ou dois objetos com scripts e animações raramente são problemas, mas quando você começa a ter dezenas ou centenas destes, animados e usando layers e outros recursos, o peso naturalmente fica maior.
Só estou com a impressão de que você está fazendo muitas coisas via script, carregando e descarregando coisas, habilitando e desabilitando objetos. Pode ser o caso de simplificá-los, dar uma olhada no desempenho deles, e ver se tem algum gargalo ou operação mais custosa.
Eu perguntei das texturas (imagens), não dos modelos. Uma textura 1k se refere à uma imagem 1024x1024 pixels, 2k se refere à 2048x2048, 4k se refere à 4096x4096, etc. Pra diferentes alvos (PC vs mobile), é comum usar qualidades de textura diferentes. Se você está usando texturas muito grandes (2k, 4k) vai logo começar a ter problemas, especialmente em celulares.
Se essa é a contagem de vértices no Blender, acho que seus modelos estão um pouco grandes, mesmo para modelos mais detalhados, e mesmo para um jogo de PC. Pode ser o caso de simplificá-los também, e usar shaders/materiais para adicionar detalhes (usando normal maps, por exemplo).
Para comparação, esse modelo da Lightning (de FF 13, pra XBox 360) tem cerca de 7500 vértices. 50k vértices é mais do que muitos chefes em Dark Souls 3 (exemplo, 26k vértices).
Pois é, como comentei antes, acho que você está tendo problemas com a complexidade do projeto como um todo, e só agora está começando a ficar notável. Vai precisar dar uma boa revisada pra tentar achar onde melhorar.
Abraço.
Sim, vi o seu Projeto. Cara, vc fez a mesma coisa que eu quanto à Renderização: Colocou um objeto 3D na Scene, a Suzane, colocou uma câmera apontando pra ela, que tem o nome “TextureCamera”, nela vc passa o RenderTexture de nome “UIRenderTexture” e este mesmo RenderTexture vc passa para o RawImage no Canvas. É EXATAMENTE assim que estou tratando minhas renderizações. A diferença do seu para o meu é que no seu vc pega a Câmare principal e filma os objetos e exibe isso na Tela. O meu, nas Scenes Abertura, TelaIntrodutoria, TelaInicial, TelaOffline, Créditos e Lojas, não filmo nada com a Câmera principal, eu uso apenas o Canvas. Tudo que eu quero que apareça na Tela vai estar em Images e RawImages, alguns com Buttons. Só na Scene Principal do Jogo é que eu uso a Câmera Main para filmar o Jogo e ainda assim tem esses Componentes no Canvas.
Nas Scenes que falei, o jogador faz coisas como ligar/desligar a música, ver as regras do Jogo, selecionar o idioma, ir nas configurações, abrir a Janela dos Poderes (aqui tem as Animações dos Poderes) e é aqui que pode estar esse vazamento, pois testei a ausência dos Sprites e a ausência das Animações pra ver quem era. Pequei todas as Imagens que são convertidas em Sprites, fui no Paint e apaguei tudo, deixei todas elas com o tamanho de no máximo 4k, e vi que os Sprites não alterou praticamente nada nos FPS. Já com as Animações, comentei as Coroutines, e o FPS subiu de 6 pra 18. Então boa parte são as Animações dos Poderes, pois 18 ainda está baixo. Quero saber quem mais está sugando os FPS.
Se for isso mesmo, vou acabar não usando mais Coroutines e usar só Events, uma Animação chamando outra e fazendo um Ciclo entre elas. Vou ver como manter esse Ciclo por meio apenas de Events. Se for realmente isso, acretido que os Events eliminará esse “vazamentos”.
Me deixe esclarecer uma coisa. Uma coisa é um Objeto Animado, outra coisa são as “Animações dos Poderes”, que é o conjungo das Animações dos objetos Animados. Tipo, um dos Poderes é o “DestroiTorreInimiga”. A Animação desse Poder é o Conjunto de Animações de uma Torre e de 4 Personagens que estão nela.
A Torre eu fiz no Blender. Ela é um Cubo que foi desfragmentado com o AddOn Cell Fracture para simular os pedaços da Torre quando ela é Destruída. Na Torre coloquei osbjetos que baixei. Alguns deles também tem Animações. Eles são as 4 Bolas de Ferro com Correntes, uma Haste com uma Bandeira, 2 Barras de Ferro e os ParticleSystens da Fumaça e das Caveiras. Os Personagens fiz no Fuse, riguei e Animei no Mixamo, comprimi as Texturas deles (Body, Top, Hair, Shoes, Bottoms) pra não ficarem mt grande. Fiz 3 ShapeKeys no rosto do Personagem (a Avatar) no Blender e Animei elas na Unity.
A 1ª Animação são as Bolas de Ferro com Correntes dessa Torre. Elas descerem e destroem a Torre. Os Fragmentos são espalhados e logo depois destruídos. Até então só tem a Animação das Bolas de Ferro com Correntes. Os Fragmentos só são espalhados. Daí vem akela parada que falei de Ativar/Destivar um objeto. Ativo os Fragmentos quando quero que a Torre apareça. Desativo os Fragmentos quando ela é totalmente Destruída. Por isso eu estava usando Coroutines, pra nesse tempo Destruir os Fragmentos. Durante a destriuição da Torre, os Personagens fazem a Animação levantando os braços com as Animações nos rostos deles. Quando as Bolas de Ferro toca nos Fragmentos e os espalham, Desativo os Personagens. Nessa hora aparece uma fumaça com a Cor da Equipes destes Personagens junto com 4 caveiras, são os ParticleSystens. Então tudo é Destruído e com o Ciclo se mantendo, tudo se repete. Quando o Jogador fecha a Janela dos Poderes, as Animações dos Poderes são “Desligadas”, ou seja, Torre Desativada, Personagens Desativados e StopAllCoroutines. Essa é a Animação de 1 Poder. São 10 Poderes. Se isso são “um acúmulo de coisas que, combinadas, causam lentidão”, me ferrei kkk por que quero essas Animações no meu Jogo. Por isso tô disposta pra rever todas elas e trabalhar com Events pra ver se resolve isso, pois tô achando que isso é na verdade por causa das Coroutines que chamam esssa ações. Mas se tu me disser que não é isso, desisto dos Events.
A questão é que não são só as Animações, pois pra vc ver, na Scene da Abertura, só tem 1 Image, somente 1. E nele está o Sprite do Ícone do Jogo, uma imagem relativamente pequena, ela tem 298k, nem chega perto do limite da Unity de 2M. E em vez dele rodar com os FPS lá em cima, ele fica com 30 FPS. Mt estranho. Animei esse Image pra ele aparecer na Tela e depois sumir. Quando ele some, chama no Event o Método que vai pra Scene TelaIntrodutoria. Não sei se tem que configurar alguma coisa na Unity para que essa coisa não aconteça… não sei. Mesmo vendo essa subida dos FPS sem as Animações dos Poderes, tenho essa suspeita. Na Scene Principal do Jogo com as Animações “Desligadas” ainda fica pesado como se tivesse as Animações nas Scenes das Telas.
Pois é. Tratarei de todas as imagens, se possível, deixando elas com 1k, mt obg por esta!
Não, eu estava me referindo às imagens que a gente converte para Sprites para usar nos Images na Unity. Eu passei um tempo tentando corrigir o erro do “Vulkan” passei um bom tempo, até descobri que não era nada mais nada menos que o tamanho das imagens. O limite da Unity é de 2M e só uma tinha mais de 1M, daí travava tudo, o jogo nem abria. Tive que levar elas pro Photosop pra reduzir a resolução e comprimir nos sites que comprimem imagens. Daí resolveu, o Jogo abriu e rodou de boa. Aí me vem as Animações, putz…
Quanto aos Vértices, os Persongens são feitos no Fuse, não sei se vc já trabalhou com ele, os Personagens ficam com uma aparêna mt boa, quase real. Daí pensei “Nossa tem mts vértices, deve ser isso”, e fui testar. Criei um Scene vazia e coloquei 100 desse do Fuse e depois 100 de um Lowpole dos Assets da Unity. Mesma coisa. Abriram a Scene em 1seg. Na verdade o Lowpole custou nesse 1seg. Daí optei pelo do Fuse, claro. Bem melhor! Mesma coisa para a Torre e demais objetos.
Quando os Scripts ficavam grandes, eu dividia eles em outros. Isso também deixou o Jogo menos pesado. Ajudou neh. Já tinham me falado isso também. Os Scripts e as Imagens.
Pois é, terei que fazer essa revisada como vc falou.
Abraço!
Terra, desculpa a ignorância, mas esse Tamanho da Textura que vc falou é o “Max Size” que tem no “Override For Android” no Inspector da Imagem clicada/selecionada onde a gente deixa ela com o “Texture Type” Sprite na Unity?
Ou Isso é outra coisa e é configurado fora da Unity?
Rapaz, se for na Unity, vi uns tópicos nos sites a galera dizendo pra não otimizar o código no tocante a isso, que vai desmantelar o projeto…
É isso msm? As minhas na Unity estão com o Default de 2048 no “Max Size”.
Eu estou falando das dimensões em pixels dos arquivos de imagem do seu projeto, não sobre alguma configuração dentro da Unity.
Sabe quando você baixa uma imagem ou textura da internet e vem um arquivo com extensão png ou jpeg (ou outra qualquer), e ele tem dimensões específicas (ex: 512x512 pixels, 320x180 pixels etc)? É a isso que me refiro.
Quanto maior as dimensões das imagens, maior o peso delas, e isso pode afetar o uso de memória e processamento do seu jogo, consequentemente afetando o desempenho. É comum evitar imagens muito grandes em projetos voltados para celulares.
Imagens com dimensões de 1024x1024 pixels são comumente conhecidas como 1K, imagens com dimensões de 2048x2048 pixels são comumente conhecidas como 2K, e imagens de 4096x4096 pixels são conhecidas como 4K
(e não, esse 4K não tem nada a ver com o termo 4K que usamos quando nos referimos à telas, televisões e monitores).
Abraço.
Ok, obg pela resposta! Qual ferramenta vc usa pra ajustar as Dimensões?
Praticamente qualquer programa de edição de imagens moderno serve pra isso. Alguns inclusive permitem fazer isso em lote, como o XnView e o Irfanview.
Mas vou reiterar que você não precisa sair mudando as imagens só por causa do que o que eu eu comentei: sempre considere a necessidade, e faça testes. O tamanho das imagens é algo pra você ter em mente, não sair aplicando como se fosse uma solução pra tudo. Pelo que conversamos em mensagens, você parece ter bem mais problemas que o tamanho das imagens.
Abraço.
Blz, mt obg pela resposta!