Claro — aqui está uma versão revisada do texto, com linguagem mais fluida, correções gramaticais e mantendo o tom de dev blog:
Fursan al-Aqsa Dev Blog #12 - Otimização de desempenho para consoles
Neste artigo, explico as alterações que fiz na Unreal Engine 3 para corrigir o streaming de texturas nos consoles e fazer o jogo rodar e renderizar corretamente no PS3 e no Xbox 360.
Depois de uma semana intensa de trabalho, dores de cabeça, estresse e quase jogar tudo pela janela, finalmente consegui fazer o último mapa, Camp Filon, rodar de forma estável nos consoles, como você pode ver no vídeo abaixo. Não gravei no Xbox 360 porque o resultado é o mesmo.
Até agora, todos os recursos de jogabilidade que implementei no jogo, como Knife Kills, interface do usuário, menu de pausa, tela de game over, contador de headshots e outros, foram testados em mapas de debug, mapas vazios, com blocos simples, sem textura, partículas ou qualquer outro efeito. Ou seja, esses cenários não representavam como o jogo final realmente iria rodar. Assim que compilei o mapa Camp Filon para PS3 e Xbox 360, encontrei outro bug que ainda não tinha aparecido: todas as texturas estavam tão borradas que o visual do jogo ficou horrível.
Eu sabia que os consoles têm menos memória RAM do que o PC e, especificamente no caso do PS3 e do Xbox 360, estamos falando de 256 MB e 512 MB de RAM, respectivamente. O que me deixava louco era o fato de o mapa rodar perfeitamente no PC, mas nos consoles as texturas ficavam extremamente borradas. Depois de pesquisar em fóruns antigos da UDK Engine e na UDN Network, comecei a entender melhor como a Unreal Engine 3 funciona nos consoles. O bom de desenvolver um jogo sozinho é que isso vira uma verdadeira sala de aula. Aprendi muito durante esse projeto. Quando comecei, eu não sabia tanto sobre Unreal Script, mas hoje já consigo fazer coisas que antes não eram possíveis para mim.
Foi então que descobri o Texture Pool na Unreal Engine 3. De forma geral, ele funciona como um espaço fixo de memória usado para carregar as texturas visíveis na tela. Pelo que entendi, a engine coloca as texturas atualmente carregadas nesse pool e, em seguida, carrega os mipmaps conforme a necessidade. Os mipmaps são versões da mesma textura em diferentes resoluções, usadas de acordo com a distância da câmera. Quanto mais perto a câmera estiver, maior será a resolução carregada; quanto mais longe, menor será a resolução. Isso é essencial para o desempenho do jogo.
Então, o que estava acontecendo? O texture pool nos consoles estava cheio, e por isso ele carregava apenas a resolução mais baixa de cada textura, em 16x16. O tamanho padrão do texture pool na UE3 é de 140 MB, então aumentei para 200 MB e pronto: problema resolvido. Ou quase isso.
Quando compilei o mapa novamente e rodei no PS3 e no Xbox 360, tudo parecia perfeito. As texturas estavam em alta resolução e os mipmaps eram carregados corretamente. Mas, assim que adicionei os inimigos ao mapa, o jogo simplesmente travou nos consoles com o erro OUT_OF_MEMORY.
Eu já estava entrando em desespero, mas minha última tentativa foi comprimir todas as texturas TGA desse mapa no Photoshop usando o algoritmo RLE. Criei um pequeno script para compactar em lote as 465 texturas TGA, incluindo diffuse, normal e specular, e consegui reduzir quase pela metade o tamanho total. Antes da compactação, elas somavam 576 MB. Depois, passaram para 278 MB.
Essa compactação compensou o aumento no texture pool, permitindo que o jogo rodasse sem travamentos e com os mipmaps funcionando corretamente, como você viu no vídeo acima.
Para finalizar, agora posso usar esse novo mapa como base para montar os próximos, porque ficou claro que preciso otimizar ao máximo cada cenário e manter o tamanho dos mapas o menor possível, tanto por desempenho quanto por jogabilidade.
Valeu!
Por
GG Mestre, · Postado
Tracker brasileiro, com cadastro aberto, Samaritano, Powered By UNIT3D