Considerações de Performance para o Windows Phone 7

Kris Gray
Traduzido por Diego Blanco
Janeiro 2011

Tecnologias: Windows Phone 7

 

Sumário: Neste artigo você aprenderá técnicas para alocação de memória que reduzem ou eliminam garbage collection e ferramentas que ajudem a identificar gargalos de memória em aplicações e jogos para Windows Phone 7.

Conteúdo

arrow_down.gifIntrodução
arrow_down.gifConsiderações de Performance do Windows Phone 7
arrow_down.gifCarregamento de Conteúdo
arrow_down.gifGerenciamento de Memória
arrow_down.gifMedindo a performance
arrow_down.gifConclusão

Introdução

Esse artigo vai descrever como reduzir memória, técnicas para alocação de memória que reduzem ou eliminam garbage collection e ferramentas que ajudem a identificar gargalos de memória. Isso é resultado de experiências práticas adquiridas pelo Advanced Technology Group da Microsoft, quando analizam e fazem assistência a clientes e parceiros com jogos do Windows Phone 7.

Considerações de performance do Windows Phone 7

O XNA Game Studio 4.0 suporta o desenvolvimento multiplataforma, utilizando a linguagem C#. O código gerado pelo Game Studio, roda com pouca ou nenhuma mudança em três plataformas: Windows Phone 7, Windows e Xbox 360. Oportunidades para ajustes de desempenho existem, mesmo no Windows Phone.

Windows Phone 7 não utiliza o mesmo poder de processamento de um PC com Windows ou de um Xbox 360. Por que não? Porque para um telefone:

  • A CPU é mais lenta;
  • Existe menos RAM;
  • A GPU é menos poderosa;
  • A tela é menor;
  • Requisitos rigorosos sobre a alimentação existem, já que o dispositivo contém sua própria bateria.

Se você possui um background em desenvolvimento de jogos em C++, vai precisar pensar diferente sobre a administração de memória para um jogo desenvolvido com C# com código gerenciado.

Um jogo desenvolvido em código gerenciado usando Game Studio, roda em tempo de execução no .NET Compact Framework. O Framework executa o garbage collection automaticamente, uma poderosa técnica para limpar objetos que estão na memória, sem serem utilizados. Muitos desenvolvedores de C++ podem estar desacostumados com essa abordagem para gerenciamento de memória. Enquanto o garbage collection simplifica o processo de recuperação de memória não utilizada, há abordagens em C# que fazem o garbage collection no Windows Phone, mais eficiente.

Esse artigo identifica duas áreas aonde você pode aumentar a performance:

  • Carregamento de Conteúdo – Carrega os assets de um jogo de forma mais eficiente;
  • Gerenciamento de memória – Ajusta seu estilo de codificação, para evitar com que o lixo seja gerado e coletado (garbage collection).

Carregamento de conteúdo

Conteúdo rico e detalhado é importante para o gameplay do seu jogo. Carregar, processar e renderizar texturas e modelos detalhados, além de carregar e processar os efeitos sonoros, afetam a performance. Aqui estão algumas dicas para usar o conteúdo do game para aumentar a performance.

  • Carregar somente o conteúdo necessário pelo jogo. Quanto menor o conteúdo, mais rápido o carregamento acontece. Geralmente, a taxa de acesso a dados (velocidade do barramento da memória em oposição à velocidade da CPU), dificulta o desempenho e cria gargalo.
  • Reduzir o tamanho das texturas. A resolução de um grande telefone é normalmente 800x480. Por somente um certo nível de detalhes ser visto nessa resolução, considere a redução das texturas. Compressões de texturas DXT devem ser dimensionadas para uma potência de 2, então combine texturas comprimidas em uma sprite sheet para conservar espaço, que caso contrário, pode ser desperdiçado.
  • Use DXT para comprimir texturas. Conteúdo encodado ou comprimido é menor, algumas vezes drasticamente menor. Isso reduz tempo de carregamento.
  • Carregue o que conseguir no ínicio (startup). No startup, um jogo normalmente apresenta uma tela de início. Como a tela é carregada, outros conteúdos podem ser carregados ou dados processados, para que o gameplay não seja impactado.
  • Use um processo personalizado para carregar texturas. Converter texturas para o formato nativo de 32-bit RGBA, usado pelo Game Studio, melhora o processo de salvar e carregar das texturas. Em tempo de design, use um processo personalizado para converter as texturas existentes. (Para mais sobre Content Pipeline, acesse: https://msdn.microsoft.com/en-us/library/bb447745.aspx)
  • Tire proveito do tempo ocioso da CPU. Muitas vezes a CPU é subutilizada, enquanto seu jogo espera por uma entrada (input) do usuário. Tire vantagem desse tempo ocioso para carregar conteúdo.

Gerenciamento de Memória

Gerenciamento de memória normalmente se refere ao uso inteligente da memória disponível. Esse uso inteligente depende de muitas coisas, incluindo como a memória é alocada para novos objetos ou como ela é recuperada, com objetos que não estão em uso. A intenção do bom gerenciamento de memória é usar o mínimo de memória possível e evitar a fragmentação. Em geral, quanto menos memória você usar, menor a chance do seu jogo ter problemas causados por gerenciamento de memória.

O Garbage Collection automático é uma forma de gerenciamento de memória. Garbage Collection:

  • Tenta recuperar memória ocupada por objetos que não são mais usados pelo programa;
  • Trabalha em objetos como texturas, buffers e referências de variáveis criadas pelo seu jogo;
  • Não gerencia outros recursos como network sockets, manipulação de bancos de dados, janelas de interação do usuário e descritivos de arquivos e dispositivos.

A performance do jogo pode ser impactada pelo garbage collection automático, caso esse ocorra em um momento inconveniente, como durante o jogo. Aqui estão algumas sugestões para projetar o seu jogo de forma a minimizar a necessidade de garbage collection automática.

  • Reduzir a memória necessária. Reduzir o número ou tamanho de objetos. Talvez você não possa ver os detalhes ou muitos objetos no celular que – numa tela maior – parecem ótimos. Reduza o tamanho das texturas para níveis de detalhe necessários para a resolução do dispositivo.
  • Alocar memória para objetos reutilizáveis. Alocar um conjunto de objetos reutilizáveis e reinicializá-los quando necessário. Objetos reutilizáveis nunca precisam ser liberados e reduzem o número de alocações adicionais. Isso faz o garbage colection ser menos frequente ou desnecessário. Tenha cuidado ao usar objetos reutilizáveis, alocar memória para objetos pré-alocados ou não utilizados, gasta memória.
  • Use mais value type e menos reference type. Value types não são coletados, use um value type para dados complexos ao invés de utilizar reference type. Dados de colisão, por exemplo, normalmente são armazenados em uma árvore de reference types. Essa árvore pode ser drasticamente otimizada, transformando-a em um array de value types, codificando a estrutura de árvore como um índices de inteiros. Tenha cuidado ao otimizar os value types, otimização demais pode causar problemas de sobrecarregar a pilha com alocações excessivas.
  • Alocar memória em pedaços menores que 1MB. O garbage collector no Windows Phone 7 commom language runtime (CLR) é “não-geracional”. Ele usa um algoritmo “mark-and-sweep” que ocorre quando alocações forem superiores a 1MB. Isso significa que o garbage collector roda cada vez que você bater a marca de 1MB. Durante o garbage collection, todas as outras threds param.
  • Reduzir a complexidade das estruturas de dados. Considere o agrupamento de tipos de dados baseados na sua frequência de atualização. Agrupamento melhora a probabilidade de que o seu acesso a dados seja mais eficiente.
  • Use um array de value types para garantir que objetos estejam localizados perto um dos outros. Um array de value types é sempre um bloco contíguo de memória. Por outro lado, um array de reference types contém uma série de ponteiros para as localizalização real na memória alocada. Além disso, memória alocada em um lote, não é garantia de ser contígua, porque a compactação da pilha pode mover objetos durante a vida do processo.
  • Manualmente chamar GC.Collect() quando for o momento certo. Existem momentos – como durante a tela de carregamento de um nível – que você pode rodar o garbage collection sem que isso afete o seu jogo. Isso reseta o limite de alocação de 1MB.

Medindo a Performance

Diversas ferramentas estão disponíves para analisar o garbage collection do .NET. Uma ferarmenta disponibilizada pela Microsoft, é o CLR Profiler. A ferramenta é gratuita e recomendada para análise da memória. Está disponível em https://www.microsoft.com/downloads/en/details.aspx?FamilyId=A362781C-3870-43BE-8926-862B40AA0CD0&displaylang=en

Para executar o profiler

  1. Baixe o CLR Profiler e extraia os arquivos;
  2. Navegue até CLRProfiler\Binaries\x86 (or x64), e rode o arquivo CLRProfiler.exe.
  3. Clique Start Application e então selecione sua aplicação ou jogo.

O profiler gera um gráfico que exibe informações sobre todos os objetos na pilha do garbage collection, e a hierarquia de referências relacionadas a essas estruturas.

O CLR Profiler não roda no Windows Phone 7, então você deve criar uma versão Windows do seu jogo. Utilizando a ferramenta Game Studio, isso é uma tarefa simples.

Para criar um profile

  1. Abra o Visual Studio Express.
  2. Na solução, adicione um novo projeto para Windows (New Project for Windows).
  3. Adicione o código do game e então compile.

Fazer essa análise no Windows, mostra a mesma atividade de analisar o Windows Phone 7. Se você tem questões sobre o assunto, uma boa forma de conseguir respostas é através dos fóruns de XNA. Para ir a um fórum basta acessar: https://social.msdn.microsoft.com/Forums/pt-br/category/devgamespt

Como uma forma alternativa ao gratuito CLR Profiler, algumas versões do Visual Studio 2010 (como a Premium e a Ultimate) incluem um built-in profiler. O grupo “Advanced Technology Group” da Microsoft, recomenda usar esse profiler, porque ele gera reports contendo maiores detalhes, como o código do jogo que mais produz alocações e o processo do jogo que mais aloca memória.

Para maiores informações sobre profiling, nas versões do Visual Studio 2010 como a Premium e a Ultimate, visite: http://www.nachmore.com/2010/profiling-silverlight-4-with-visual-studio-2010/ e https://blogs.msdn.com/b/oren/archive/2010/06/03/profile-silverlight-4-from-the-vs-2010-ui-premium-amp-ultimate-only.aspx

Conclusão

Usando um profiler é a única maneira para medir a performance. A melhor performance para os jogos de Windows Phone 7 é alcançada seguindo duas práticas essências:

  • Manter o uso de memória abaixo de 90MB.
  • Minimizar ou eliminar o garbage collection.

Artigo original: https://create.msdn.com/en-US/education/catalog/article/performance_wp7_games

Traduzido por: Diego Blanco – Technical Audience Team