2010-08-20 6 views
2

J'écris un jeu, et même si la performance est bonne la plupart du temps, elle ralentit parfois. Les profileurs normaux n'ont pas aidé à cela, car ils enregistrent tout le temps que mon jeu fonctionne, et les informations importantes dans les portions laggy sont diluées sur toutes les sections lisses. Y a-t-il des outils ou des bibliothèques qui peuvent m'aider à isoler le problème?Profileur "Spike"?

+0

Cela peut être dû à la récupération de place. Créez-vous et libérez-vous beaucoup d'objets? –

+0

En fait, je pense que je suis. J'ai mis en place une vue des performances, et ce qui se passe est que ma mémoire sera constamment utilisée et sera poussée quelques mégaoctets toutes les quelques secondes, et avec le temps la consommation de la mémoire de base va augmenter. – RCIX

Répondre

3

Vous êtes presque certainement touché par la collecte des ordures.

Et oui, il existe un outil pour corriger cela. Vous voulez le CLR Profiler. Cela vous montrera exactement où vous allouez de la mémoire.

Sur Xbox, le garbage collector s'exécute après chaque 1 Mo alloué et il est lent. Le GC de Windows est beaucoup plus tolérant, mais peut encore causer une instabilité de la fréquence d'images. La meilleure façon d'éviter les bégaiements de garbage collection est de ne rien allouer pendant que votre jeu est en cours d'exécution. Faites vos allocations pendant le chargement des écrans où l'utilisateur ne remarquera pas. Je recommande de lire this post et this post sur le blog de Shawn Hargreaves.

+0

Ok, j'ai quelques données du profileur et je l'attends pour charger, mais en attendant y a-t-il d'autres profileurs disponibles qui ne transformeront pas mon jeu en un diaporama littéral? – RCIX

+0

De par sa nature même, le profilage va ralentir votre jeu. Mais même à cela, il ne changera pas votre profil d'allocation ... donc vous pouvez voir où les ordures sont créées –

+0

@Joel: c'est vrai, mais ce n'est pas "un peu": cela va de (au plus de points) 60FPS à 1 image toutes les 3 secondes environ. Très difficile à contrôler pour obtenir une course décente. – RCIX

1

Vous dites que vous passez d'un cadre prenant 16ms à 3000ms. Donc, dans un cadre long, il dépense (3000 - 16)/3000 = 99,5% de son temps à faire quelque chose que vous n'attendiez pas.

Pendant ces 3 secondes, comment pouvez-vous savoir ce qu'il fait? Faites simplement une pause plusieurs fois et vérifiez la pile des appels.

La chance que vous ne voir ce qu'il fait sur chaque pause est de 0,5%

Si elle est dans le garbage collector, cela devrait le confirmer. Si ça fait autre chose, ça vous le dira aussi.

+0

Plus exactement, ce qui se passe est que le jeu ralentit à 2-5 images par seconde, mais mon temps de mise à jour ne s'affiche pas de cette façon. Le diaporama (plusieurs secondes entre les images) est seulement quand je le profil de la mémoire. – RCIX

+0

@RCIX: néanmoins, arrêtez-le quand il est lent, et vous verrez le problème. (5fps = 12x ralentissement, donc la chance de l'attraper à chaque pause est de 92%.) Les gens ne sont pas habitués à ce concept, mais si vous essayez, cela vous semblera naturel. Les raisons pour lesquelles, en détail excrutiating, sont ici: http://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343 –

Questions connexes