3 votes

Performances du système XNA Particle

J'ai un système de particules utilisant le spritebatch de base, où les particules sont créées et détruites en fonction de la valeur alpha décrémentale jusqu'à 0.

La performance du système est assez faible sur PC, et très faible sur Xbox, avec environ une centaine de particules à l'écran avant un ralentissement significatif des fps, j'ai lu un peu partout comment améliorer la performance mais est-ce que quelqu'un a des conseils sur la façon de les implémenter, par exemple quelle est la meilleure façon de réutiliser les particules plutôt que de les tuer ? La taille de l'image de chaque particule fait-elle une différence ? Si je ne fais pas tourner chaque particule, cela aidera-t-il ?

J'ai joué avec chacune de ces suggestions, mais je n'ai pas obtenu d'amélioration significative. Quelqu'un a-t-il des conseils à donner ? Cela vaut-il la peine d'utiliser un processeur graphique plutôt qu'un processeur central ?

4voto

pbojinov Points 372

D'après mes souvenirs, la destruction et la création de particules ralentissent considérablement les performances. Vous pourriez vouloir réutiliser les particules.

Je ne suis pas sûr que la taille de l'image ou la rotation réduisent radicalement les performances, tant que l'image n'est pas très grande.

J'aurais un tableau où les particules mortes seraient placées à la fin des particules actives, ce qui permettrait de ne traiter que les particules actives.

Par exemple :

Make an array of MAX particles;
When you need a particle grab particle\_array\[count\]; 
Increment count.
When a particle dies, decrement count, swap the particle with particle\_array\[count\];
Update only count particles;

J'espère que cela vous aidera.

1voto

Aranda Points 461

Je suis entièrement d'accord avec la réponse de subsonic, mais je voulais la développer.

Créer une nouvelle particule à chaque fois et détruire (ou laisser partir) les anciennes particules crée BEAUCOUP de déchets. Le mantra pour éviter les déchets en C#, particulièrement sur Xbox (en raison de la mauvaise gestion des déchets du framework compact), est de ne JAMAIS new un type de classe dans votre boucle de mise à jour/d'extraction. Créez TOUJOURS au préalable des pools. Shawn H explique : http://blogs.msdn.com/b/shawnhar/archive/2007/07/02/twin-paths-to-garbage-collector-nirvana.aspx .

Une autre chose à prendre en compte est que l'utilisation de textures multiples peut entraîner un ralentissement du lot de sprites en raison des multiples appels de dessin. Essayez de fusionner plusieurs textures de particules en une seule et d'utiliser le rectangle source. SpriteBatch.Draw paramètre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X