Fursan al-Aqsa Dev Blog # 12 - Otimização de desempenho para consoles
Neste artigo, explico as novas alterações que eu fiz na Unreal Engine 3 para corrigir o streaming de texturas nos consoles e fazer o jogo rodar e renderizar corretamente no PS3 e Xbox360.
Depois de uma semana intensa de trabalho, dores de cabeça, e estresse e quase jogar tudo (meu PC e meus consoles) pela janela , finalmente consegui fazer o último mapa, o Camp Filon, rodar lisinho nos consoles, como você pode ver neste vídeo abaixo. Não capturei no Xbox360 pq é a mesma coisa:
Até agora, todos os recursos de jogabilidade que eu implementei no meu jogo, como Knife Kills, interface do usuário, menu de pausa, tela de game over, contador de headshots e assim por diante, se você percebeu, eu testei em mapas debug, mapas vazios, apenas blocos, sem textura, partículas ou qualquer outro efeito. Quero dizer, esses mapas não representavam como o jogo final iria rodar. Então, assim que eu compilei o último mapa, Camp Filon, para rodar no PS3 e Xbox360, eu descobri outro bug, que eu não havia observado antes. Todas as texturas no mapa estavam borradas a tal ponto que o visual do game ficou horrível !!!
Eu sei que os consoles têm menos memória RAM do que o PC, e especificamente PS3 e Xbox360, em termos não técnicos, eles têm 256 MB e 512 MB de RAM, respectivamente. O que estava me deixando louco é o fato de o mapa estava rodando perfeito no PC. Nos consoles, as texturas ficaram extremamente borradas. Após pesquisar nos fóruns antigos da UDK Engine (https://forums.epicgames.com/udk) e na UDN Network (https://docs.unrealengine.com/udk/Three/WebHome.html), comecei a aprender mais sobre a Unreal Engine 3 nos consoles. O bom de desenvolver um jogo sozinho é que ele pode ser uma verdadeira sala de aula. Eu mesmo, aprendi MUITO neste projeto. Quando comecei a desenvolver este jogo, não sabia muito sobre a linguagem Unreal Script. Agora, aprendi MUITO, e sou capaz de fazer muitas coisas que não podia fazer antes.
Voltando à minha jornada, descobri sobre o Texture Pool na Unreal Engine 3, que, em termos gerais, é tipo um espaço de memória fixa usado para carregar (streaming) as texturas na tela. Pelo que entendi (posso estar errado, mas o que importa aqui é que agora está funcionando), a Unreal Engine 3 joga todas as texturas atualmente carregadas (que podem ser vistas pela câmera do jogador) dentro desse pool de textura e, em seguida, ele carrega o mipmap dessas texturas conforme necessário. Os mipmaps aqui são versões diferentes da mesma textura em diferentes resoluções, para serem carregadas de acordo com a distância da câmera, por exemplo, quanto mais próxima a câmera de uma textura, maior será a resolução da textura, e quanto mais afastada, ele carregará uma versão de resolução mais baixa da textura. Isso é essencial para o desempenho do game.
Então o que estava acontecendo? O texture pool nos consoles estava cheio, portanto, ele carregava apenas a resolução mais baixa de cada textura (16x16). O tamanho padrão do texture pool na UE3 é de 140 MB, então eu aumentei para 200 MB e pronto! Problema resolvido! Ainda não...
Mais uma vez eu compilei o mapa e rodei no PS3 e Xbox360. Ele rodou lindo e sem problemas, com as texturas na resolução máxima e os mipmaps sendo carregados corretamente. Porém, outro problema aconteceu, assim que eu adicionei os inimigos no mapa, ele simplesmente deu crash nos consoles com o erro OUT_OF_MEMORY.
Eu já estava entrando em desespero com esse problema, mas a minha última tentativa foi comprimir todas as texturas TGA deste mapa no photoshop usando o algoritmo RLE. Criei um pequeno script do photoshop para compactar em lote todas as 465 texturas TGA (diffuse, normal e especular) e consegui reduzir em quase metade do tamanho total das texturas. Antes da compactação, elas somavam o tamanho total de 576MB e, depois de comprimir ficou 278MB !!!
Então, essa compactação de texturas compensou o aumento no tamanho do texture pool, permitindo a execução do jogo, sem travamentos, e com os mipmaps funcionando perfeitamente, como você viu no vídeo acima.
Finalizando, agora posso usar esse novo mapa como um template sempre que montar os meus outros mapas, porque agora sei que preciso otimizar os mapas o máximo possível e manter o tamanho dos mapas pequeno, por uma questão de desempenho e jogabilidade.
Valeu!
Neste artigo, explico as novas alterações que eu fiz na Unreal Engine 3 para corrigir o streaming de texturas nos consoles e fazer o jogo rodar e renderizar corretamente no PS3 e Xbox360.
Depois de uma semana intensa de trabalho, dores de cabeça, e estresse e quase jogar tudo (meu PC e meus consoles) pela janela , finalmente consegui fazer o último mapa, o Camp Filon, rodar lisinho nos consoles, como você pode ver neste vídeo abaixo. Não capturei no Xbox360 pq é a mesma coisa:
28- Fursan al-Aqsa - Performance Test PS3 video
Here on this video I showcase a Performance-Stress Test on PS3, after a LOT of optimization, and mainly changing the texture streaming of Unreal Engine 3 on consoles. I did not capture on Xbox360, because it is basically the same thing. Soon I will do...
www.indiedb.com
Até agora, todos os recursos de jogabilidade que eu implementei no meu jogo, como Knife Kills, interface do usuário, menu de pausa, tela de game over, contador de headshots e assim por diante, se você percebeu, eu testei em mapas debug, mapas vazios, apenas blocos, sem textura, partículas ou qualquer outro efeito. Quero dizer, esses mapas não representavam como o jogo final iria rodar. Então, assim que eu compilei o último mapa, Camp Filon, para rodar no PS3 e Xbox360, eu descobri outro bug, que eu não havia observado antes. Todas as texturas no mapa estavam borradas a tal ponto que o visual do game ficou horrível !!!
Eu sei que os consoles têm menos memória RAM do que o PC, e especificamente PS3 e Xbox360, em termos não técnicos, eles têm 256 MB e 512 MB de RAM, respectivamente. O que estava me deixando louco é o fato de o mapa estava rodando perfeito no PC. Nos consoles, as texturas ficaram extremamente borradas. Após pesquisar nos fóruns antigos da UDK Engine (https://forums.epicgames.com/udk) e na UDN Network (https://docs.unrealengine.com/udk/Three/WebHome.html), comecei a aprender mais sobre a Unreal Engine 3 nos consoles. O bom de desenvolver um jogo sozinho é que ele pode ser uma verdadeira sala de aula. Eu mesmo, aprendi MUITO neste projeto. Quando comecei a desenvolver este jogo, não sabia muito sobre a linguagem Unreal Script. Agora, aprendi MUITO, e sou capaz de fazer muitas coisas que não podia fazer antes.
Voltando à minha jornada, descobri sobre o Texture Pool na Unreal Engine 3, que, em termos gerais, é tipo um espaço de memória fixa usado para carregar (streaming) as texturas na tela. Pelo que entendi (posso estar errado, mas o que importa aqui é que agora está funcionando), a Unreal Engine 3 joga todas as texturas atualmente carregadas (que podem ser vistas pela câmera do jogador) dentro desse pool de textura e, em seguida, ele carrega o mipmap dessas texturas conforme necessário. Os mipmaps aqui são versões diferentes da mesma textura em diferentes resoluções, para serem carregadas de acordo com a distância da câmera, por exemplo, quanto mais próxima a câmera de uma textura, maior será a resolução da textura, e quanto mais afastada, ele carregará uma versão de resolução mais baixa da textura. Isso é essencial para o desempenho do game.
Então o que estava acontecendo? O texture pool nos consoles estava cheio, portanto, ele carregava apenas a resolução mais baixa de cada textura (16x16). O tamanho padrão do texture pool na UE3 é de 140 MB, então eu aumentei para 200 MB e pronto! Problema resolvido! Ainda não...
Mais uma vez eu compilei o mapa e rodei no PS3 e Xbox360. Ele rodou lindo e sem problemas, com as texturas na resolução máxima e os mipmaps sendo carregados corretamente. Porém, outro problema aconteceu, assim que eu adicionei os inimigos no mapa, ele simplesmente deu crash nos consoles com o erro OUT_OF_MEMORY.
Eu já estava entrando em desespero com esse problema, mas a minha última tentativa foi comprimir todas as texturas TGA deste mapa no photoshop usando o algoritmo RLE. Criei um pequeno script do photoshop para compactar em lote todas as 465 texturas TGA (diffuse, normal e especular) e consegui reduzir em quase metade do tamanho total das texturas. Antes da compactação, elas somavam o tamanho total de 576MB e, depois de comprimir ficou 278MB !!!
Então, essa compactação de texturas compensou o aumento no tamanho do texture pool, permitindo a execução do jogo, sem travamentos, e com os mipmaps funcionando perfeitamente, como você viu no vídeo acima.
Finalizando, agora posso usar esse novo mapa como um template sempre que montar os meus outros mapas, porque agora sei que preciso otimizar os mapas o máximo possível e manter o tamanho dos mapas pequeno, por uma questão de desempenho e jogabilidade.
Valeu!