C# et DirectX Managed -- pb de FPS --

C# et DirectX Managed -- pb de FPS -- - C#/.NET managed - Programmation

Marsh Posté le 26-10-2005 à 22:09:17    

Bonjour à tous je suis en train de développer un petit moteur 2D pour faire un jeu et j'ai un soucis avec l'affichage. En fait mon FPS est "bloqué" à 40 fps. La structure générale du jeu est une boucle dans laquelle est appelé une méthode game.update() qui gère les inputs et le jeu et une méthode Render() qui effectue l'affichage de la scène 3D. Le Device de Direct3D est dans un formulaire et lorsque j'enlève le Application.DoEvents() je gagne 20 fps (logique puisque l'OS ne s'occupe plus de la fenêtre). Même résultat quand je passe en plein écran (logique aussi). Après avoir placé des timers un peu partout j'ai constaté que la méthode qui "bloque" est le Device.present(). Lorsque la fenêtre contenant le device n'est pas affichée par l'OS (quand elle est masqué par une autre fenêtre) le fps atteint 1200fps, ce qui me semble etre le fps normal non bloqué). enfin, dans les exemples du SDK de DirectX, le fps n'est pas bloqué. J'ai essayé de suivre le code et de comparer avec le mien mais les différences sont trop grande et je m'y perd.
Si quelqu'un a déjà eu mon problème ou sait comment le résoudre, ça m'aiderait beaucoup :)

Reply

Marsh Posté le 26-10-2005 à 22:09:17   

Reply

Marsh Posté le 27-10-2005 à 16:53:51    

Je me sens vachement seul la tout d'un coup :(

Reply

Marsh Posté le 27-10-2005 à 16:57:16    

tu dessines dans le OnPaint() de la fenêtre ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 27-10-2005 à 18:52:55    

Non, dans une méthode Render() que j'ai faite mais ca change rien quand je le met dans le OnPaint().

Reply

Marsh Posté le 27-10-2005 à 18:55:33    

poste donc le code, parce que là, on est aveugles


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 28-10-2005 à 11:12:28    

Je vous mets un bout de code mais je sais pas si ca va vous aider beaucoup.
La boucle principale (dans le main) :

Code :
  1. while (!bQuit)
  2.             {
  3.                 bQuit = m_Game.Update(m_GraphicEngine);
  4.                 if(!bQuit)
  5.                     bQuit = m_GraphicEngine.IsExiting();
  6.                 if (!bQuit)
  7.                     m_GraphicEngine.Screen.Render();
  8.             }


 
La création du device (dans le GraphicForm qui hérité de Windows.Form) :

Code :
  1. this.SuspendLayout();
  2.             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  3.             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  4.             this.AutoSize = true;
  5.             this.ClientSize = new System.Drawing.Size(800, 600);
  6.             this.Name = "Form1";
  7.             this.RightToLeftLayout = true;
  8.             this.Text = "STU 2";
  9.             if(p_bFullScreen)
  10.                 this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
  11.             this.ResumeLayout(false);
  12.             this.SetStyle(ControlStyles.Opaque | ControlStyles.SupportsTransparentBackColor | ControlStyles.UserPaint, true);
  13.             // Initialisation du device
  14.             PresentParameters presentParams = new PresentParameters();
  15.            
  16.             presentParams.SwapEffect = SwapEffect.Discard;
  17.             Format current = Manager.Adapters[0].CurrentDisplayMode.Format;
  18.             if (Manager.CheckDeviceType(0, DeviceType.Hardware, current, current, false))
  19.             {
  20.                 presentParams.Windowed = !p_bFullScreen;
  21.                 presentParams.BackBufferFormat = current;
  22.             }
  23.             else
  24.                 presentParams.Windowed = true;
  25.             m_Device = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
  26.             m_Device.ShowCursor(p_bShowCursor);
  27.             System.Windows.Forms.Cursor.Clip = this.ClientRectangle;
  28.             m_RenderWindow = this;


 
et la méthode Render () :

Code :
  1. public void Render()
  2.         {
  3.             m_Device.Clear(ClearFlags.Target, m_BackgroundColor, 1.0f, 0);
  4.             m_Device.BeginScene();
  5.             m_Sprite.Begin(SpriteFlags.AlphaBlend);
  6.             foreach (cSprite s in m_SpriteList)
  7.             {
  8.                 m_Sprite.Draw(  s.Texture,
  9.                                 s.TextureSize,
  10.                                 s.v3Center,
  11.                                 s.v3Pos,
  12.                                 Color.White);
  13.             }
  14.             m_Sprite.Flush();
  15.             m_Sprite.End();
  16.             foreach (cFont f in m_FontList)
  17.             {
  18.                 foreach (cText t in m_TextList)
  19.                 {
  20.                     f.Font.DrawText(null, t.sText, t.v2Pos.x, t.v2Pos.y, t.cColor);
  21.                 }
  22.             }
  23.             m_Device.EndScene();
  24.             m_Device.Present();
  25.             Application.DoEvents();
  26.         }


 
Certaines partie du code sont encore en test donc tout n'est peut etre pas très bon :)

Reply

Marsh Posté le 28-10-2005 à 13:32:59    

1) le DoEvents ne doit pas être dans le render mais dans la boucle générale.
 
2) tu est à 85Hz ?

Reply

Marsh Posté le 28-10-2005 à 17:12:57    

1) Alors en fait pour le DoEvents(), il était avant dans le main, mais j'ai préféré le mettre dans le Render(). En effet, le jeu et le moteur 2D sont deux projets séparés et le formulaire contenant le device Dx est dans le moteur 2D et donc je préfère mettre le DoEvents() dans le moteur aussi.
 
2) Alors j'étais en 60 Hz, bloqué à 40fps, je me suis mis en 85Hz, le fps est monté entre 50 et 60fps. Plusieurs trucs, d'abord, je comprend pas comment le taux de rafraichissement influe sur le fps, le second truc, c'est qu'à priori ça a pas résolue le pb. Mais c'est peut etre la bonne piste.

Reply

Marsh Posté le 28-10-2005 à 19:56:16    

Lord_SoniK a écrit :


2) Alors j'étais en 60 Hz, bloqué à 40fps, je me suis mis en 85Hz, le fps est monté entre 50 et 60fps. Plusieurs trucs, d'abord, je comprend pas comment le taux de rafraichissement influe sur le fps, le second truc, c'est qu'à priori ça a pas résolue le pb. Mais c'est peut etre la bonne piste.


un moniteur à 85 Hz affiche 85 fps maxi.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 28-10-2005 à 20:53:00    

tes PresentParameters sont par défaut en synchro avec le retour balayage.
 

Reply

Marsh Posté le 28-10-2005 à 20:53:00   

Reply

Marsh Posté le 29-10-2005 à 14:08:11    

D'accord mais je change ça comment alors ?

Reply

Marsh Posté le 29-10-2005 à 15:12:48    

Bon, j'ai modifié le paramètre présentationIntervalle ou un truc dans le style, je l'ai mis à immediate. J'ai maintenant environ 400 de fps sur mon portable. Il faut que je le test sur mon pc de bureau pour voir si je suis bloqué à 400 ou si ca va bien a fond ;) Je vous donne des nouvelles bientôt :) et merci pour tous ces conseils.
PS : Si c'est pas ça qu'il fallait chager prévenez moi :)

Reply

Marsh Posté le 30-10-2005 à 11:34:06    

c'était ça je pense.
 

Reply

Marsh Posté le 30-10-2005 à 20:19:22    

ok ben merci beaucoup alors, vous etes des boss :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed