Frame quoi ?
Avant de parler de Frame rate, il est important d’expliquer ce qu’est une frame en développement de jeux vidéo, que ce soit en XNA ou autre. Par défaut, XNA va effacer l’écran et redessiner la scène grâce à sa fonction Draw. Chaque scène appelée par cette méthode est nommée Frame. L’exemple le plus parlant, lorsque l’on évoque les frames, est celui des bandes dessinées. Chaque case représente une frame. La vitesse où vont s’enchainer les scènes va représenter le frame rate ou images par seconde dans la langue de Molière. Toutes les 16 Millisecondes, l’animation est rafraichie ce qui équivaut à 60 images / secondes. Pour les écrans d’ordinateurs, les cadences les plus souvent employées sont de 30, 60 et 100 images par secondes.
A noter que les frames rate à la télévision sont différents en fonction des normes utilisées. La norme européenne PAL (secam pour la France) réglemente la cadence à 25 fps (frame per seconde) alors qu’aux États-Unis et au Japon (norme NTSC), elle est de 30 fps.
Maintenant que nous avons vu ce qu’était le frame rate, vous allez peut être vous demander à quoi cela pourrait servir de le changer si il est adapté. J’aurai tendance à vous dire que vous avez raison mais il arrive que dans certains projets l’on veuille adapter la cadence d’affichage à son jeu pour un effet plus rapide ou plus lent par exemple.
Imaginons que vous vouliez afficher une sphère qui tourne (par exemple la terre), la vitesse de rotation ne vous ira peut-être pas avec le Framerate par défaut, il est donc intéressant de pouvoir le changer.
La Classe Game a une propriété appelée TargetElapsedTime qui définit combien de temps il faut attendre entre les appelles de la méthode Update. En grande partie, cette méthode représente le temps entre chaque scène à dessiner. Par défaut, la valeur est de 1/60 de seconde, c'est-à-dire 60 images par seconde.
Voyons donc comment changer le frame rate en XNA, insérez la ligne suivante au niveau du constructeur de la classe Game1 :
TargetElapsedTime = new TimeSpan(0, 0, 0, 0, 50);
La classe TimeSpan peut prendre jusqu’à cinq paramètres : jours, heures, minutes, secondes et millisecondes. Dans notre exemple, nous souhaitons donc appeler la fonction Update toutes les 50 millisecondes ce qui correspond à 20 images par secondes. Avec un frame rate bas, l’animation sera beaucoup moins rapide et fluide mais avoir un frame rate trop important pourra avoir des conséquences néfaste sur les performances du jeu puisqu’il deviendra gourmant en ressources pour votre processeur.
Heureusement, il est possible de savoir si votre jeu souffre de performances trop élevées par rapport à l’ordinateur sur lequel il tourne. L’objet GameTime, qui est passé en paramètre aux fonctions Draw et Update, a une propriété IsRunningSlowly. Si cette valeur est à true, cela veut dire que XNA n’arrive pas à suivre le Framerate que vous lui avez donné.
La vitesse d’animation
Changer le frame rate c’est bien, mais comment faire lorsque l’on souhaite changer la vitesse d’affichage de certains éléments et non de la scène entière ?
Reprenons l’exemple d’un jeu faisans tourner une sphère et, pour rajouter un peu de piment à ce jeu pourtant révolutionnaire, nous pourrions afficher, par exemple, un petit personnage qui marche (vraiment révolutionnaire). Avoir un Framerate unique pour toute la scène peut alors devenir problématique et changer la vitesse d’animation de chaque objet peut être plus adapté.
Nous allons donc changer la vitesse d’animation et ainsi pouvoir l’adapter à chaque objet de la scène. Supprimez d’abord la ligne précédente qui permettait de changer le frame rate.
Déclarez ensuite deux variables, une première permettra de savoir depuis quand la dernière frame a été chargée, la deuxième va permettre de définir le frame rate en millisecondes.
int tpsDerniereFrame = 0;
int milliParFrame = 50;
Maintenant, dans la méthode Update, avant les instructions qui permettent de mettre à jour les différentes instructions du jeu comme la position des objets, les scores, etc., insérez ceci :
protected override void Update(GameTime gameTime)
{
tpsDerniereFrame += gameTime.ElapsedGameTime.Milliseconds;
if(tpsDerniereFrame > milliParFrame)
{
tpsDerniereFrame -= milliParFrame;
La propriété gameTime.ElapsedGameTime permet de savoir depuis combien de temps la dernière frame s’est chargée.
On test ensuite si cette variable est supérieure au frame rate que l’on a fixé au début et alors on y soustrait la valeur de milliParFrame
Vous pouvez compiler et tester votre nouveau frame rate sur, par exemple, plusieurs images qui se succèdent, changer la cadence et ainsi voir les conséquences d’un frame rate plus ou moins haut.
Affichage du Framerate dans son jeu
Nous allons maintenant créer une classe très simple qui va permettre d’afficher le Framerate dans la scène de votre jeu vidéo. Commencez par faire un clic droit sur Content, puis ajouter et nouvel objet. Dans la fenêtre qui vient de s’ouvrir, choisissez Sprite Font puis renommez-le en maPolice.spriteFont par exemple. Cela va permettre de rajouter du texte dans notre scène. Ensuite, Rajoutez au début de votre classe Game1 :
SpriteFont font;
Ajoutez ensuite, au niveau de la classe LoadContent
protected override void LoadContent()
{
font = Content.Load<SpriteFont>("maPolice");
}
Une fois ceci fait, créez la classe EcrireTexte :
private void EcrireTexte()
{
spriteBatch.DrawString(font, “Framerate : “ + milliParFrame.ToString(), new Vector2(100, 100), Color.Black);
}
Dans cette classe, nous appelons la fonction spriteBatch.DrawString qui va permettre d’afficher le framerate dans notre cas. On lui passe en paramètre la police, le texte à afficher, l’emplacement grâce à un vecteur et pour finir la couleur.
Pour finir, appelez la fonction EcrireTexte que vous venez de créer dans la classe Draw().
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.White);
spriteBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.FrontToBack, SaveStateMode.None);
DrawText();
spriteBatch.End();
base.Draw(gameTime);
}
Bibliographie :
Article très intéressant sur le Framerate : http://www.nofrag.com/2003/nov/24/8629/
d1d5e161-7a68-4bbc-a1fc-c11c23629ab4|0|.0
C#, XNA
xna, framerate, c#, animation, frame, jeux, jeu, jeux video, vitesse d'animation