2017-07-23 5 views
0

Je crée un moteur de jeu 2D utilisant SlimDX (DirectX 9), mais je suis confronté à deux problèmes liés, des fréquences d'images fluctuantes (taux de trame assez élevé) et un processeur élevé usage. La fréquence d'images est essentiellement la minuterie de jeu que toutes les animations se déroulent. L'utilisation du processeur est également à travers le toit (20%), je voudrais limiter à quelle vitesse SlimDX dessine des cadres pour une utilisation plus faible du processeur, et pour stabiliser l'animation et la vitesse de jeu, comment pourrais-je faire cela?SlimDX: limiter la fréquence d'images pour une utilisation plus faible du processeur

p.s Je suis sûr qu'il y a une meilleure façon de faire une "minuterie" de jeu séparée de la fréquence d'images, toute information serait appréciée.

boucle

et inizialization:

  var form = new RenderForm(World.WindowTitle); 
     form.ClientSize = new Size(World.WindowWidth, World.WindowHeight); 
     var device = new Device(new Direct3D(), 0, DeviceType.Hardware, form.Handle, CreateFlags.HardwareVertexProcessing, new PresentParameters() 
     { 
      BackBufferWidth = form.ClientSize.Width, 
      BackBufferHeight = form.ClientSize.Height 
     }); 
     //Some stuff here, irrelevant to DirectX 
     MessagePump.Run(form,() => 
     { 
      device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); 
      device.BeginScene(); 
      sprite.Begin(SlimDX.Direct3D9.SpriteFlags.AlphaBlend); 
      //Stuff here 
      sprite.End(); 
      device.EndScene(); 
      device.Present(); 
      //Thread.Sleep(1); <-- this didnt work using 0 or 1, it actually increased cpu ussage 
     }); 

Répondre

0

NVM j'ai eu une idée qui a travaillé, parce que je veux 60 images par seconde que cela signifierait au sujet 16ms entre chaque image, donc je mesurer le temps qu'il faut pour rendre un cadre puis enfilez .Sleep pour 16 - temps de rendu (si au-dessus de 0), maintenant l'utilisation du processeur est zéro et si le moteur prend plus de 16ms pour dessiner une image, alors il va dessiner l'image suivante directement après.

  var form = new RenderForm(World.WindowTitle); 
    form.ClientSize = new Size(World.WindowWidth, World.WindowHeight); 
    var device = new Device(new Direct3D(), 0, DeviceType.Hardware, form.Handle, CreateFlags.HardwareVertexProcessing, new PresentParameters() 
    { 
     BackBufferWidth = form.ClientSize.Width, 
     BackBufferHeight = form.ClientSize.Height 
    }); 
    //Some stuff here, irrelevant to DirectX 
    MessagePump.Run(form,() => 
    { 
     Stopwatch stopwatch = Stopwatch.StartNew(); 
     device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0); 
     device.BeginScene(); 
     sprite.Begin(SlimDX.Direct3D9.SpriteFlags.AlphaBlend); 
     //Stuff here 
     sprite.End(); 
     device.EndScene(); 
     device.Present(); 
     stopwatch.Stop(); 
     int ms = 16 - (int)(stopwatch.ElapsedMilliseconds); 
     if (ms > 0) 
     { 
      Thread.Sleep(ms); 
     } 
    });