English: Article to be translated. In the mean time an online translator should work 🙂 Those are general tips to optimize your BGE applications.

É engraçado que com o passar do tempo a gente esquece que estas coisas muitas vezes são mal-documentadas e acabam escapando do conhecimento da maioria das pessoas. Então, como resposta a um email de um amigo, resolvi escrever esta pequena lista de dicas para melhorar a performance de seus jogos com a Blender Game Engine.

Display List:

Artista: faz seu jogo ficar mais rápido. Só funciona para objetos não animados. Não funcionava no Blender 2.47 (!). Talvez esta seja uma das razões de muita gente não entender suas vantagens.

Técnico: Display List (ou D.L.) é uma forma de passar um objeto para a placa de vídeo apenas uma vez. Esta lista de polígonos é compilada uma única vez e cada vez que seu objeto precisa ser chamado a lista é executada. É bem rápido. Bem mais do que Vertex Arrays (a tecnologia anterior). É tecnologia antiga, atualmente substituída por VBO (Vertex Buffer Object). Apesar do Blender 2.5beta ter suporte à VBO o mesmo não se extende à Blender Game Engine. Mas não adianta manter as expectativas altas, VBO não é mais rápido que Display Lists. Ele é mais eficiente no manejo de memória (ou seja, usa menos RAM). Além disso ele é meio caminho andado para se implementar Hardware Skinning na BGE. Existe um patch quase completo para a BGE suportar VBO. Nos meus testes realmente não notei nenhuma melhora considerativa de performance (mesmo em modelos bem pesados).

Dimensão das texturas:

Artista: use sempre potências de 2 (ex. 512×512, 1024×512, 256×256, …). A textura não precisa ser quadrada, mas suas dimensões devem seguir esta regra – nem um pixel a mais, nem um pixel a menos.

Técnico – muitas placas de vídeo modernas (se não todas) suportam texturas que fujam desta regra. Ainda assim o processamento será mais rápido se você utilizar potências de 2. Para garantir compatibilidade com computadores antigos o Blender manualmente expande a sua textura em uma maior com as dimensões da potência de 2 mais próxima.

O que botar em cada textura:

Artista: a regra de ouro é que a textura de uma face seja mais ou menos uns 80% do tamanho final em que ela será vista. A segunda é, ponha na mesma textura o máximo de elementos possíveis (com algum cuidado para que as UVs não se sobreponhem) mas evite botar elementos de objetos que raramente compartilham o mesmo momento do jogo (ex.: a textura de um chefe da primeira fase não deveria ficar junto com o chefe da última – senão dá briga).

Técnico: O Blender usa uma interpolação bem rápida e simples (GL_LINEAR) tanto para imagens menores do que a textura (GL_TEXTURE_MIN_FILTER) quanto para maiores (GL_TEXTURE_MAX_FILTER). Logo é importante que a textura tenha a definição necessária mas sem exageros. Para entender a segunda regra é mais simples. Uma textura só é carregada quando algum objeto estiver solicitando ela. Se vários objetos compartilham o mesmo arquivo (por mais que usando partes diferentes do mesmo) a textura vai sempre estar carregada, mesmo que você só utilize uma pequena parte dela. Por outro lado quanto menos texturas carregadas melhor, assim objetos relacionados podem (devem?) ser agrupados sempre que possível.

MipMap:

Artista: se as suas texturas estão sempre muito nítidas e aguçadas você provavelmente está com problema nos mipmaps. Talvez você já tenha reparado que em casos como esse você tem que rodar a BGE duas vezes para que as texturas fiquem suaves e a performance fique razoável. Isso não vai funcionar no BlenderPlayer … Neste caso um truque que funciona é carregar as texturas em uma cena anterior para que as texturas na cena principal tenha mipmap. De novo, lembre de testar no BlenderPlayer, é lá que problemas de MipMap costumam aparecer. Se as texturas estão todas suaves, missão cumprida e performance garantida.

Técnico: there is no easy way to say that: Blender has bugs ! Este foi em inglês pra fingir que não fui eu que falei. Mas enfim, fique atento a isso. Para quem não sabe Mip Maps são versões reduzidas da textura que são usadas quando os objetos estão muito distante da câmera (ou seja, pequenos). Ao usar a versão reduzida da imagem a placa de vídeo naturalmente funciona mais rápido.

Formato das texturas:

Artista: use DDS (principalmente se você for exportar pra outra engine), TGA ou PNG. Não use jpg (a não ser que esteja com sérios problemas do tamanho final dos seus arquivos).

Técnico:  Jpg é bom porque é compactado, certo? ERRADO ! Toda imagem no momento que chega na placa de vídeo ocupa seu tamanho máximo. Então por mais que jpg poupe seu HD de alguns Kbs a mais, do ponto de vista de performance o consumo é o mesmo de uma mesma imagem não comprimida. E ainda há o trabalho do programa/placa de vídeo de descompactar a imagem para visualizá-la (não sei se isso chega a contar, mas enfim).
O DDS é um formato interessante porque ele já armazena a imagem compactada no formato que a placa de vídeo a usa. Assim o carregamento de imagens na placa de vídeo é muito rápido. Infelizmente o Blender suporta DDS mas não faz uso de sua arquitetura. Ou seja, mesmo usando DDS o Blender manualmente descomprime o DDS fazendo com que a placa de vídeo tenha que re-comprimir o arquivo. O tipo de compactação do DDS vai depender da natureza de sua textura (ex.: se tem ou não alpha).

Física:

Artista: Só ative física (Bullet) se você realmente for usar interações físicas. Caso contrário vá no World Panel e mude física para None. Se você for usar Bullet certifique-se de que as únicas faces que tem colisão são as que você precisa para interagir com outros objetos ou que você precise detectar com funções de Ray em algum script (para mudar isso vá no painel Texture Face). Para facilitar sua vida o Blender tem uma opção para visualizar as interações físicas. Use e abuse dela (está no menu Game). Use proxies (objetos invisíveis com uma geometria simplificada) para colisões sempre que possível.

E agora José?

Outras coisas que são um pouco mais avançadas e vou deixar pra explicar em um outro momento. Ao contrário das dicas apresentadas acima, estes parâmetros vão depender do gargalo do seu jogo (a parte mais crítica em termos de performance) e são um pouco mais complicadas de explicar. Não sei nem se existe já documentação oficial para elas:

  • DBVT culling
  • All Frames
  • Ciclos máximo de lógica e física (setMaxPhisicsFrame, setMaxLogicFrame – ou pela interface no painel de World).

Acho que é isso. Estas são regras e informações bem gerais. Existem claro técnicas específicas de acordo com os módulos/recursos que você for usar. Mas de forma geral não é nada que muitos testes e benchmarks não resolva. 🙂

Eu confesso que tem horas que  eu ignoro isso tudo e acabo usando um jpg de 600×130 só pra quebrar um galho. Mas é importante ter isso em mente (e compartilhar isso com sua equipe) o mais cedo possível. Até porque redimensionar texturas e ficar ajustando UVs … ninguém merece.

Por fim, repare que a divisão artista/técnico representa simplesmente duas maneiras de entender o problema. Na área de 3D é muito comum a figura do artista técnico (technical artist) e é inclusive uma carreira na indústria. Então aconselho a todos a ampliar suas possibilidades de dialógo e estudar tudo sem preconceitos.

E francamente, me dá nos nervos “artistas” se referirem a “programadores” como uma coisa à parte e dissociada do processo criativo. Ou pior como situações mutulamente exclusivas. Não faltam exemplos de profissionais impressionantes e inspiradores que passeiam pelos dois campos sem embaraços. Pronto, desabafei 😉

Um grande abraço,
Dalai

Extra Extra:

Gostou das explicações técnicas? Então aproveite: de 10 a 12 de outubro em Fortaleza acontecerá a quarta edição da BlenderPRO.

Este é o maior encontro de Blender  no Brasil (e um dos mais importantes do mundo). Para esta edição o evento finalmente está do tamanho que todos esperavam. Entre palestras e workshops terá mostra de trabalhos, um convidado internacional, e muita, muita troca de experiência entre todos os participantes.

Se tudo ocorrer bem eu vou dar uma palestra sobre o uso profissional da Blender Game Engine  e um workshop sobre desenvolvimento da mesma. Pois se você tem interesse em entender mais sobre o funcionamento interno da BGE, sobre como funciona o dia-a-dia de seu ciclo de desenvolvimento e como os desenvolvedores trabalham (ferramentas, workflow, …) não perca tempo e participe do workshop.

Os custos dos workshops infelizmente não cobrem os custos reais do evento. Assim dependo de resposta de possível patrocínio para comparecer. Mas quanto mais pessoas inscritas maiores são as chances de que aconteça !

Espero vê-los lá.

2 Thoughts on “Dicas para otimizar seu jogo na Blender Game Engine

  1. Pingback: Blender & CIA – Dicas para otimizar seu jogo na Blender Game Engine « Mango Jambo

  2. Martinho on November 19, 2010 at 4:29 am said:

    Bem dito,suas dicas são bem úteis! Tem mais algumas relacionadas com a programação, gestão de objectos, numero de objectos, cenas, scripts activos ao mesmo tempo? jogos Multiplayer, que agora começam a ficar populares?

Leave a Reply

Your email address will not be published. Required fields are marked *

Post Navigation