domingo, 5 de março de 2017

Jogo fechando sozinho no Android? O sistema é f...

Post meio técnico, a título de curiosidade...

Bom, não sou de desistir fácil, por mais irritado que possa ficar às vezes rs

Ainda não tenho a solução definitiva, mas um dos motivos do jogo fechar sozinho, pelo menos, parece que identifiquei... Suspeito do "lixo" que vai ficando acumulado na memória pelo uso de strings, foreach e algumas outras coisas que geram garbage. Eu já passava o GC.Collect de tempos em tempos, mas vou revisar esse intervalo. Sem ficar passando ele, o uso de memória do app vai subindo... Eu preciso reprogramar totalmente a função de mostrar coisas na tela e resolver outros pontos que criam esse garbage (vendo pelo Profiler na Unity). Alguns vários KB por frame vão juntando e somando alguns MB, e algum tempo depois o Android acaba matando o processo do jogo porque não consegue - ou não quer - alocar mais RAM.

Vi também que alguns métodos causavam o fechamento mesmo do ônibus invisível sem nada, só com um cubo. Aparentemente era o código do letreiro, já que no cubo não tinha o destino, ele tentava trocar o que não existia... Mas não imaginei que isso seria motivo pro jogo fechar sozinho (no PC e dentro do editor da Unity não acontece, o código estava usando try... catch justamente para evitar isso!)

Vou fazer mais uns testes e colocar uma opção meio técnica na entrada: de quantos em quantos segundos você quer passar o garbage collector. Não posso fixar de 5 em 5, ou 10 em 10, porque ele afeta um pouco o desempenho. Vai ter que testar um valor dependendo de cada aparelho. Em aparelhos com mais memória RAM (vários da Samsung com 1.5 GB ou os de 2 GB) dá para deixar de 30 em 30 segundos, pelo que percebi, ou até mais (não tenho esses aparelhos por aqui pra testar agora)... Já em aparelhos com menos memória é necessário reduzir esse tempo. Mas se reduzir muito, tipo de 1 em 1 segundo, acaba caindo os FPS pois o processo do GC.Collect() é meio "pesado". Aí cada jogador terá que escolher um ponto de equilíbrio... Mas só praqueles onde o jogo ficar saindo sozinho. Se o jogo não ficar fechando, nem precisará se preocupar com essa opção.

No começo do ano, em janeiro, eu mudei bastante a programação dos carros e pedestres. Em vez de instanciar/destruir um por um, a todo momento em que apareciam/sumiam, passei a usar um pool de objetos. Isso já melhorou 90% do jogo, senão não daria pra trazer ele pro celular.

Ainda há um problema louco que tenho que resolver: ao carregar o ônibus leve (um cubo sem nada) no mapa leve (um plano sem nada), o jogo fecha poucos segundos depois... Preciso rever todo o meu códgo em busca de possíveis coisas que causam exceções - provavelmente alteração de materiais, instanciamento, etc.

Fazer um jogo não é fácil... Não é só sair jogando objetos na cena nem modelando, grande parte do tempo é quebrando a cabeça mesmo e caçando os malditos bugs nos lugares mais imprevisíveis possíveis. Bom que tudo vira um aprendizado. Aos poucos a experiência permitirá ao game melhorar, e os próximos saírem melhores ainda. Toda essa bagagem será aproveitada na versão PC do jogo, em alguns meses volto a mexer nela! :D Boa parte do código é compartilhado entre os dois projetos, mas são independentes - os testes de um não afetam o outro.

O logcat e outras coisas não têm ajudado muito a identificar os erros, tenho que reler todo meu código e ir buscando tudo o que potencialmente pode causar alguma zica... E isso não é nada agradável.

Se depois de eu eliminar meus foreach e melhorar meus códigos que alteram coisas dinâmicas o game continuar fechando aqui no Moto G 1... Aí provavelmente vou dar um tempo, comprar um aparelho com 2 GB de RAM e bloquear a instalação nos modelos de 1 GB, porque vou ficando exausto de pouco em pouco.

É frustrante demais ver o jogo carregar, funcionar, e alguns segundos depois fechar sozinho... Tanto como jogador, como desenvolvedor. Eu não vou desistir, mas nessas horas dá vontade.

E tipo... Não adianta também eu varrer para baixo do tapete e focar em aparelhos de 2 GB se ainda tiver problemas estruturais no código. Se ele fecha depois de 5 minutos num aparelho de 1 GB, nos de 2 GB é só questão de tempo (talvez algumas horas). Seja lá o que for, que é frustrante, é, e muuuito! :(

Nenhum comentário:

Postar um comentário