Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1481 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1231947
Lord_SoniK
Posté le 26-10-2005 à 22:09:17  profilanswer
 

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 :)

mood
Publicité
Posté le 26-10-2005 à 22:09:17  profilanswer
 

n°1232720
Lord_SoniK
Posté le 27-10-2005 à 16:53:51  profilanswer
 

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

n°1232725
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-10-2005 à 16:57:16  profilanswer
 

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


---------------
J'ai un string dans l'array (Paris Hilton)
n°1232856
Lord_SoniK
Posté le 27-10-2005 à 18:52:55  profilanswer
 

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

n°1232858
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-10-2005 à 18:55:33  profilanswer
 

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


---------------
J'ai un string dans l'array (Paris Hilton)
n°1233296
Lord_SoniK
Posté le 28-10-2005 à 11:12:28  profilanswer
 

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 :)

n°1233418
bjone
Insert booze to continue
Posté le 28-10-2005 à 13:32:59  profilanswer
 

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

n°1233731
Lord_SoniK
Posté le 28-10-2005 à 17:12:57  profilanswer
 

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.

n°1233830
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 28-10-2005 à 19:56:16  profilanswer
 

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)
n°1233853
bjone
Insert booze to continue
Posté le 28-10-2005 à 20:53:00  profilanswer
 

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

mood
Publicité
Posté le 28-10-2005 à 20:53:00  profilanswer
 

n°1234081
Lord_SoniK
Posté le 29-10-2005 à 14:08:11  profilanswer
 

D'accord mais je change ça comment alors ?

n°1234102
Lord_SoniK
Posté le 29-10-2005 à 15:12:48  profilanswer
 

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 :)

n°1234392
bjone
Insert booze to continue
Posté le 30-10-2005 à 11:34:06  profilanswer
 

c'était ça je pense.
 

n°1234603
Lord_SoniK
Posté le 30-10-2005 à 20:19:22  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
problème avec directx 9 et visual c++ 6afficher du texte par dessus un jeu directx
=OSD= Affichage par dessus overlay (fenêtre DirectX / OpenGL)DirectX et C#
[VB .Net] Création de controles bloquée par DirectX[DirectX] Info sur D3DXMatrixLookAtLH()
analyse video, graphismes 2D, directX ?Recherche de graphiste(s) pour un RPG VB/DirectX !
DirectX : Tutorial 2Recherche SDK DirectX 8.1 pour VC++
Plus de sujets relatifs à : C# et DirectX Managed -- pb de FPS --


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)