Performances de rendu pour les jeux Flash


11

Je lisais sur SO à propos du rendu flash natif par rapport à la création d'un BitmapDatatampon de trame personnalisé et certaines des réponses étaient un peu contradictoires, alors je me demandais:

  1. Est-il généralement recommandé d'utiliser la route de tampon Bitmap personnalisée ou est-il préférable de laisser le rendu au moteur flash?
  2. Si vous utilisez des animations vectorielles MovieClippar opposition aux sprites, cela change-t-il la réponse à ce qui précède?
  3. Dans l'affirmative, est-il préférable d'utiliser des animations basées sur les sprites?

(Je cible Flash 10 si cela fait une différence)

Réponses:


14

1. Il n'y a pas de meilleure pratique générale.

Si vous avez beaucoup d'éléments (de forme complexe), de particules, etc. dans votre jeu, l'approche du tampon bitmap sera beaucoup plus rapide. Le tampon bitmap évoluera également mieux avec la complexité croissante de vos sprites. Le vecteur moteur de rendu sera devenu plus lent avec des animations plus des formes complexes ou tween (interpolation de forme), il a d'autres avantages cependant:

  • Vous pouvez librement adapter vos ressources ou même zoomer sur la scène sans perte de qualité.
  • La rotation ou d'autres transformations telles que l'inclinaison seront beaucoup plus faciles à effectuer sur les graphiques vectoriels

Donc, en conclusion, cela se résume au type de jeu que vous créez.

2. Utiliser MovieClips au lieu de feuilles de sprites bitmap

Je suppose que vous vouliez dire "feuilles de sprites bitmap" et non la classe Sprite AS3 ?

Cela ne fait vraiment aucune différence. Vous pouvez toujours transformer vos animations basées sur MovieClip en images bitmap animées. Soit manuellement, en exportant le film vers des images et en les transformant en feuille de sprite , soit dynamiquement, en rendant une feuille de sprite à partir de votre MovieClip lors de l'exécution. Voici comment je procéderais:

  1. Créez une instance du MovieClip et stop()il.
  2. Créez un new BitmapDataobjet avec la même largeur et la même hauteur que le Movieclip.
  3. Utilisez la méthode draw () pour rendre le MovieClip en BitmapData.
  4. Stockez l'objet BitmapData dans un tableau ou un vecteur.
  5. Passez à l'image suivante de votre MovieClip et répétez les étapes 2 à 4, jusqu'à ce que vous ayez atteint la dernière image de votre MovieClip. C'est également une bonne idée de mettre à jour deux variables avec la largeur maximale et la hauteur maximale de vos images MovieClip (car celles-ci peuvent changer d'une image à l'autre).
  6. Vous pouvez maintenant combiner tous les objets BitmapData stockés dans une feuille Sprite (utilisez BitmapData.copyPixels () )

3. Animations basées sur les sprites

Comme mentionné dans la réponse à votre première question, il n'y a pas de réponse définitive à cela. Si vous devez effectuer de nombreuses transformations avec vos objets, par exemple. la mise à l'échelle et la rotation sont probablement plus avantageuses en utilisant le rendu natif flash. Si vous avez des animations prédéfinies qui peuvent être intégrées aux feuilles de sprites (manuellement ou dynamiquement), et si vous devez afficher des centaines de sprites en même temps, optez pour un moteur de rendu bitmap.


Lorsque (si?) Flash commence à utiliser l'accélération matérielle pour son rendu, un rendu copyPixel sera probablement plus lent que le rendu natif.
Bart van Heukelom du

6

Je dirais que si vous construisez un jeu basé sur un raster à l'aide de sprites, optez pour la création d'une solution de rendu personnalisée à l'aide de BitmapData. Si vous créez un jeu vectoriel, utilisez les mécanismes d'animation intégrés à l'aide de MovieClips.

Si vous envisagez de créer une solution de rendu personnalisée, vous vous dissociez pratiquement de Flash en utilisant ActionScript seul pour accomplir ce dont vous avez besoin. Le moteur flixel utilise cette méthode et c'est assez sympa. Je préfère écrire mon propre moteur à partir de zéro, mais vous avez l'idée.

L'utilisation des mécanismes d'animation Flash intégrés fonctionne mieux pour les jeux vectoriels, car vous pouvez facilement créer vos actifs de bibliothèque sous forme de MovieClips que vous pouvez ensuite instancier dans ActionScript à la demande. Vous utilisez la chronologie fournie avec les clips pour gérer l'animation et déplacer l'emplacement du sprite en conséquence. Tous les BattleOn! des jeux comme Adventure Quest Worlds utilisent cette méthode. C'est joli aussi.

Je suppose que votre dernière question fait référence à l'utilisation de la classe Sprite au lieu de la classe MovieClip pour les animations vectorielles. Un Sprite est un MovieClip sans chronologie, vous perdriez donc la commodité de gérer les animations pour vous.


3

Même s'il est communément admis que le blitting est plus rapide, je n'ai vu aucun repère le prouver. Certains développeurs préfèrent simplement le blitting car cela leur permet de traiter Flash comme une machine virtuelle générique et de contrôler eux-mêmes le rendu. Cependant, si vous aimez la liste d'affichage intégrée (ce que je fais), Flash peut heureusement déplacer, mettre à l'échelle, faire pivoter et appliquer de beaux effets à des centaines d'objets d'affichage à l'écran (par exemple MovieClips, Sprites, Bitmaps) à des fréquences d'images élevées, donc du moment qu'ils sont assez petits, par exemple moins de 200x200 pixels chacun. Vous pouvez utiliser MovieClips sans utiliser de vecteurs. La plupart des jeux utilisent des ressources bitmap quel que soit le système qu'ils utilisent. Mais il est parfois utile de mettre en page et d'animer des ressources bitmap sur la chronologie, surtout si vous travaillez avec un concepteur spécialisé dans Flash plutôt qu'avec un artiste pixel. En définissant la qualité de la scène sur BAS, vous obtiendrez de bien meilleures performances au détriment des transformations les plus laides. Flash ne rendra aucun objet hors écran, il ne vous ralentira donc pas.

Là où Flash peut ralentir, c'est le déplacement et la transformation de très grandes images bitmap - par exemple si vous avez un très grand niveau de défilement ou beaucoup de couches de parallaxe. Une approche hybride consistant à utiliser MovieClips pour vos objets de jeu tout en masquant l'arrière-plan à partir d'un tampon hors écran peut être plus rapide et vous permettra d'avoir des niveaux infiniment grands, tout en permettant la facilité d'utilisation des Sprites et MovieClips standard.


Les formes vectorielles complexes peuvent également avoir un impact significatif sur les performances. Si vous avez des MovieClips animés avec beaucoup de dégradés, et si vous ne faites pas attention au niveau de détail de vos formes vectorielles, cela dessinera beaucoup plus lentement qu'un bitmap.
bummzack

Vous pouvez utiliser MovieClips sans utiliser de vecteurs. La plupart des jeux utilisent des ressources bitmap quel que soit le système qu'ils utilisent. Mais il est parfois utile de mettre en page et d'animer des ressources bitmap sur la chronologie, surtout si vous travaillez avec un concepteur spécialisé dans Flash plutôt qu'avec un artiste pixel.
Iain

Ouais pour les jeux flash, je recommande de ne pas utiliser de dégradés pour tout ce qui va être vectoriel et rendu par flash chaque image, à part quelques éléments sur le HUD et le sprite du joueur. Les dégradés mangent rapidement les performances.
AttackingHobo

Quelques repères de rendu et de mise à jour: 8bitrocket.com/2007/12/23/…
Max Dohme
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.