[XNA] Problème de perfs avec base.Draw()

J’ai une question essentiellement pour GloP (mais si quelqu’un d’autre sait, je suis preneur). J’ai pratiquement fini d’implémenter un terrain en GeoClipmapping (screen there: http://enemyterritory.ath.cx/temp/thegrid.jpg) pour remplacer mon terrain en ChunkedLOD pour mon MMORTS.

Actuellement, mon geoclipmap est implémenté en utilisant un chainage de DrawableGameComponent, chaque élement se chargeant d’afficher la grille (avec un trou au milieu s’il n’est pas le dernier élément de la chaine) puis d’appeller la méthode Draw() de son enfant. Seul le noeud root est lié à Game (Components.Add n’ajoute que le premier élément) et est seul le premier élément fait appel à base.Draw().

Durant ma phase d’optimisation, je me suis rendu compte qu’appeller base.Draw(gameTime) dans mon Draw(gameTime) de mon DrawableGameComponent me faisait chuter mes (de 70 FPS - fréquence de rafraichissement de mon écran - à 62-63 FPS) si je l’appellais pour chaque grille de mon GeoClipmap; je ne l’appelle donc plus que pour le noeud root (je n’ai pas constaté de changement massif dans le comportement de mon GeoClipMap). J’aurais aimé savoir si l’appel de cette méthode parente était obligatoire (et dans quel cas elle est obligatoire), et dans le cas où elle est obligatoire, quelle est son utilité?

Salut PereCil,

J’avais remarqué la même chose de mon coté.

Pour ma part je ne code qu’en 2D, et le rendu se fait par l’intermediaire d’un spritebatch unique appelé par le drawableGameComponent principal ( genre Game1.cs ).
Ca limite l’appel à base.draw à un seul appel. J’ai donc résolu le problème à ma façon.

Ce post n’a donc aucune utilité, si ce n’est de dire que j’avais remarqué la meme chose et que globalement les appels des methodes de base sont assez floues.

PereCil> utilises le reflector (pour voir ce que fait le base.draw (mon avis est qu’il ne fait a peu pres rien)), et un profiler, pour savoir ce qui te pompe tes precieux FPS (Perso, j’utilises ANTS Profiler, qui rox bien, mais il existe aussi des solutions gatuites).

Perso, aucun souci rencontré, mais je ne fait peut etre pas autant d’appels que toi, et j’ai peut etre simplement pas fait gaffe.

Bah disons que j’ai un nombre d’FPS assez grand donc dès qu’un truc est un poil moins performant, ca se ressent de suite. J’avais fait la boulette d’instancier un BasicEffect dans mon Draw, j’étais passé de “ca va très vite ca mets mon refresh rate CRT au taquet” à “j’ai 15 FPS”. Mais bon la j’ai droppé l’appel à base.Draw() et j’ai remarqué aucune différence (à part le gain en FPS).

Bizarre, en tout cas, je te confirme que le DGC.Draw ne fait rien du tout, et qu’a moins que tu aies une classe intermediaire qui surcharge ca, le compilo doit carrement le faire passer a la trappe.