Desempenho de renderização para jogos em Flash

11

Eu estava lendo sobre SO sobre renderização em flash nativo vs construindo um BitmapDatabuffer de quadro personalizado e algumas das respostas eram um pouco conflitantes, então fiquei pensando:

  1. Geralmente, é uma boa prática seguir a rota do buffer de Bitmap personalizado ou é melhor deixar a renderização para o mecanismo flash?
  2. Se você estiver usando animações vetoriais, MovieClipem vez de sprites, isso muda a resposta para o acima?
  3. Em caso afirmativo, é uma prática recomendada usar animações baseadas em sprites?

(Estou direcionando o Flash 10 se isso fizer alguma diferença)

Alconja
fonte

Respostas:

14

1. Não há boas práticas gerais.

Se você tiver muitos elementos (de forma complexa), partículas etc. no seu jogo, a abordagem do buffer de bitmap será muito mais rápida. O buffer de bitmap também será dimensionado melhor com o aumento da complexidade de seus sprites. O renderizador de vetores se tornará mais lento com formas mais complexas ou animações de interpolação (interpolação de formas), mas há outros benefícios:

  • Você pode escalar livremente seus recursos ou até ampliar a cena sem perda de qualidade.
  • A rotação ou outras transformações, como a inclinação, serão muito mais fáceis de executar em gráficos vetoriais

Então, em conclusão, tudo se resume ao tipo de jogo que você está construindo.

2. Usando MovieClips em vez de folhas de sprite de bitmap

Eu acho que você quis dizer "folhas de sprite de bitmap" e não a classe AS3 Sprite ?

Isso não faz diferença, realmente. Você sempre pode transformar suas animações baseadas em MovieClip em bitmaps animados. Manualmente, exportando o filme para quadros e transformá-los em uma folha de sprite , ou dinamicamente, renderizando uma folha de sprite do seu MovieClip em tempo de execução. Aqui está como eu faria isso:

  1. Crie uma instância do MovieClip e stop()ela.
  2. Crie um new BitmapDataobjeto com a mesma largura e altura que o Movieclip.
  3. Use o método draw () para renderizar o MovieClip no BitmapData.
  4. Armazene o objeto BitmapData em uma matriz ou vetor.
  5. Vá para o próximo quadro do seu MovieClip e repita as etapas 2 a 4, faça isso até atingir o último quadro do seu MovieClip. Também é uma boa idéia atualizar duas variáveis ​​com a largura e a altura máximas dos quadros do MovieClip (pois elas podem mudar de quadro para quadro).
  6. Agora você pode combinar todos os objetos BitmapData armazenados em uma planilha de sprite (use BitmapData.copyPixels () )

3. Animações baseadas em Sprite

Como mencionado na resposta à sua primeira pergunta, não há resposta definitiva para isso. Se você precisar realizar muitas transformações com seus objetos, por exemplo. escalando e girando, você provavelmente está melhor usando o renderizador nativo do flash. Se você tiver animações predefinidas que podem ser criadas em folhas de sprite (manualmente ou dinamicamente) e se precisar exibir centenas de sprites ao mesmo tempo, escolha um mecanismo de renderização de bitmap.

bummzack
fonte
Quando (se?) O Flash começa a usar a aceleração de hardware para sua renderização, um renderizador copyPixel provavelmente será mais lento que o renderizador nativo.
Bart van Heukelom 12/08/10
6

Eu diria que, se você estiver criando um jogo baseado em varredura usando sprites, crie uma solução de renderização personalizada usando o BitmapData. Se você estiver construindo um jogo baseado em vetores, use os mecanismos de animação incorporados usando os MovieClips.

Se você cria uma solução de renderização personalizada, desassocia-se do Flash usando o ActionScript sozinho para realizar o que precisa. O mecanismo flixel usa esse método e é bastante agradável. Eu prefiro escrever meu próprio mecanismo a partir do zero, mas você entendeu.

Seguir os mecanismos de animação em Flash incorporados funciona melhor em jogos baseados em vetores, porque você pode criar facilmente os recursos da sua biblioteca como MovieClips, que você pode instanciar no ActionScript sob demanda. Você usa a linha do tempo, desde os clipes de filme, para manipular a animação e mover o local do sprite de acordo. Todo o BattleOn! jogos como Adventure Quest Worlds usam esse método. Parece bom também.

Estou assumindo que sua última pergunta está se referindo ao uso da classe Sprite em vez da classe MovieClip para animações vetoriais. Um Sprite é um MovieClip sem uma linha do tempo, assim você perderia a conveniência de ter as animações gerenciadas por você.

Consty
fonte
3

Embora seja comum acreditar que cegar é mais rápido, não vi nenhum parâmetro que comprove isso. Alguns desenvolvedores preferem cegar porque permite tratar o Flash como uma máquina virtual genérica e controlar a renderização. No entanto, se você gosta da lista de exibição embutida (que eu gosto), o Flash pode mover, dimensionar, girar e aplicar efeitos agradáveis ​​a centenas de DisplayObjects na tela (por exemplo, MovieClips, Sprites, Bitmaps) com altas taxas de quadros, desde que tenham dimensões muito pequenas, por exemplo, menos de 200x200 pixels cada. Você pode usar os MovieClips sem usar vetores. A maioria dos jogos usa ativos de bitmap, independentemente do sistema que eles usam. Às vezes, porém, é útil planejar e animar ativos de bitmap na linha do tempo, especialmente se você estiver trabalhando com um designer especialista em Flash, em vez de um artista de pixel. Ao definir a qualidade do palco como LOW, você obterá um desempenho muito melhor à custa de transformações mais feias. O Flash não renderiza nenhum objeto que esteja fora da tela, para que você não fique lento.

Onde o Flash pode ficar lento, está se movendo e transformando bitmaps muito grandes - por exemplo, se você tiver um nível de rolagem muito grande ou muitas camadas de paralaxe. Uma abordagem híbrida do uso de MovieClips para seus objetos de jogo, ao mesmo tempo em que bloqueia o fundo de um buffer fora da tela, pode ser mais rápida e permitirá que você tenha níveis infinitamente grandes, além de permitir a facilidade de uso de Sprites e MovieClips padrão.

Iain
fonte
Formas vetoriais complexas também podem ter um impacto significativo no desempenho. Se você tiver clipes de filme animados com muitos gradientes e se não prestar atenção ao nível de detalhe de suas formas vetoriais, será muito mais lento que um bitmap.
bummzack
Você pode usar os MovieClips sem usar vetores. A maioria dos jogos usa ativos de bitmap, independentemente do sistema que eles usam. Às vezes, porém, é útil planejar e animar ativos de bitmap na linha do tempo, especialmente se você estiver trabalhando com um designer especialista em Flash, em vez de um artista de pixel.
Iain
Sim, para jogos em flash, eu recomendo não usar gradientes para qualquer coisa que será vetorial e renderizada em flash a cada quadro, exceto algumas coisas no HUD e no sprite do player. Gradientes comem desempenho rapidamente.
AttackingHobo
Alguns benchmarks de renderização e atualização: 8bitrocket.com/2007/12/23/…
Max Dohme