[RESOLU][XNA]Ralentissements inexpliqués

Salut la zone,

Je me suis enfin decidé à tripoter tranquilement XNA, et pour jouer avec le machin, je me suis mis en tête de reprendre un shoot’em up que j’avais devellopé sous Flash.

Histoire de me faire la main, j’ai commencé simple, un scrolling infini de tiles bouclées.
J’ai fait ça à la maison, sur une machine plutôt puissante ( e6600 et X1900GT ) et cela tourne à merveille.

J’ai executé le meme code sur mon portable de travail et là, c’est la fete à la saccade. Dubitatif, je fais quelques tests en limitant grandement le nombre de calcul, mais meme avec tres tres peu de sprite, ça rame vraiment trop.
Idem sur le poste d’un collègue… Et pour rajouter une couche de bizarrerie par dessus, le meme collegue recompile le projet le lendemain, et là tout tourne normalement. Le phénomene s’est reproduit avec un autre projet chopé sur le net: Ultra lent la veille, et satisfaisant aujourd’hui. Evidemment, la meme operation chez moi se solde par un echec, sinon ça ne serait pas drôle.
Ah et une autre precision, le meme collegue avait testé le premier “sample” de code de GloP ( avec la soucoupe ) et ca tournait tres mal.
Nos portables de taf ne sont pas des foudre de guerre, mais normalement amplement suffisant ( P4 2ghz, 1Go de ram et carte graphique X300 ).

Un autre point, quand on execute tout ça en mode fenetré, l’utilisation de la souris autour de la fenetre XNA provoque des ralentissements.

Une idée ? un conseil ? un GloP ?

Voilà, sinon c’est vraiment du bon ce petit framework, ça me plait bien !

PS: je pourrais mettre le code, mais je pense pas qu’il soit vraiment incriminé, je soupçonne plutot l’environnement.

RESOLU : Bon en fait, un programme tournait en tache de fond et faisait ramer la machine ( pour info, il s’agit de Rainmeter ).
Il tourne aussi sur mon fixe perso et ne gene en rien XNA, mais là sur le portable pro, ca veut pas.

J’ai exactement le même problème sur mes ordis.

Les premiers lancements des apps XNA sont lents, puis les lancements successifs les font tourner à vitesse normale.

Par contre, j’ai pas trouvé la feinte, donc soumet un petit bug aux forums.

Si ça ne rame qu’au premier lancement, j’aurais presque tendance à dire que c’est normal. Il ne faut pas oublier en .NET que l’exe n’est compilé en langage machine qu’au premier appel, d’où quelques lenteurs. Bon évidemment, ce n’est qu’une intuition, je peux me planter B)

Oui tu te plantes, ca a rien a voir B)
En fenetre il faut que la souris soit dans l’app XNA je pense pour que la message pump ait pas de surprise, sinon je vois pas, il faut avoir une repro sous la main pour enqueter. Sinon essayes les forums officiels aussi et si ca marche pas ouvre un bug precis avec le code qui rame et la config materielle et logicielle sur connect (voir forums pour comment).

Allez je me fens du code, au moins on en aura le coeur .net (ho ho ho) sur mon code pourri:

Classe Game1.cs:

[code]using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Components;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;

namespace TestScroll
{
///


/// This is the main type for your game
///

partial class Game1 : Microsoft.Xna.Framework.Game
{
private Background background;
private Background background2;

	public Game1()
	{
		InitializeComponent();
		graphics.BackBufferFormat = SurfaceFormat.Color;

		graphics.BackBufferHeight = 800;
		graphics.BackBufferWidth = 600;
		graphics.IsFullScreen = false;
		graphics.SynchronizeWithVerticalRetrace = true;
		graphics.AllowMultiSampling = true;
		graphics.ApplyChanges();
		this.Starting += new EventHandler<GameEventArgs>(this.GameLoading);

	}

	protected override void Update()
	{
		// The time since Update was called last
		float elapsed = (float)ElapsedTime.TotalSeconds;

		// TODO: Add your game logic here
		this.background.update(elapsed);
		this.background2.update(elapsed);

		// Let the GameComponents update
		UpdateComponents();
	}

	protected override void Draw()
	{
		// Make sure we have a valid device
		if (!graphics.EnsureDevice())
			return;

		graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
		graphics.GraphicsDevice.BeginScene();

		// TODO: Add your drawing code here
		this.background.Draw();
		this.background2.Draw();
   
		// Let the GameComponents draw
		DrawComponents();

		graphics.GraphicsDevice.EndScene();
		graphics.GraphicsDevice.Present();
	}

	private void GameLoading(object sender, GameEventArgs e)
	{
		this.background = new Background(graphics, "tileWater.png");
		this.background.setSpeed(300);
		this.background2 = new Background(graphics, "tileWater.png");
		this.background2.setSpeed(100);
	   
	}
}

}[/code]

Classe Background.cs:

[code]using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Components;
using Microsoft.Xna.Framework;

namespace TestScroll
{
class Background
{
private Texture2D backgroundTexture;
private SpriteBatch backgroundBatch;
private int xTile;//nombre de tuiles horizontales
private int yTile;//nombre de tuiles verticales
private float speed;
private float yPos;

	public void setSpeed(float s){ this.speed=s;}

	public Background(GraphicsComponent graphics, String texture)
	{
		this.backgroundBatch = new SpriteBatch(graphics.GraphicsDevice);
		backgroundTexture = Texture2D.FromFile(graphics.GraphicsDevice, texture);
		this.xTile =  (int)Math.Floor((Double)(graphics.BackBufferWidth / backgroundTexture.Width));
		this.yTile =  (int)Math.Floor((Double)(graphics.BackBufferHeight / backgroundTexture.Height));
		this.yPos = 0;
	}

	public void Draw()
	{
		backgroundBatch.Begin(SpriteBlendMode.AlphaBlend);
		for (int y = 0; y < this.yTile+2; y++)
			for (int x = 0;x< this.xTile+1; x++)
				backgroundBatch.Draw(backgroundTexture, new Vector2(backgroundTexture.Width * x, backgroundTexture.Height * (y-1)+yPos), Color.White);

		backgroundBatch.End();
	}

	public void update(float elapsed)
	{
		yPos += speed * elapsed;
		if (yPos > backgroundTexture.Height)
			yPos = yPos - backgroundTexture.Height;
	}


}

}[/code]

Et pour le fichier tileWater.png, vous pouvez mettre ce que vous voulez!

Pas ici, sur les forums officiels. Moi chui encore en vacances B)

En tout cas, sur mon piti PC (P4 3GHz, 1Go de RAM, ATI 9800), ça marche impec (okok, xna game studio s’est quand même crashé 4 fois ce soir, c’était pas un grand jour ^^)

Salaud ! ( Bonnes vacances )