2017-07-23 208 views
0

我正在製作使用SlimDX(DirectX 9)的2D遊戲引擎,但是Im面臨着兩個鏈接在一起的問題,波動的幀速率(儘管幀速率相當高)和高CPU用法。幀速率基本上是所有動畫運行的遊戲計時器。 CPU使用率也是通過頂端(20%),我想限制SlimDX爲了降低CPU使用率而畫幀的速度,並且爲了穩定動畫和遊戲速度,我怎麼能這樣做呢?SlimDX:限制幀速率以降低CPU使用率

p.s我相信有一個更好的方法來製作一個遊戲「計時器」,是從幀​​率分開,任何信息將不勝感激。

環和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 
     }); 

回答

0

NVM我有這樣的工作的想法,因爲我想60 fps的,這將意味着每一幀之間約16毫秒,所以我衡量它需要渲染一幀的時間,然後線程。休眠16 - 渲染時間(如果大於0),現在CPU使用率爲零,如果引擎花費的時間超過16毫秒繪製一幀,那麼它將直接繪製下一幀。

  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); 
     } 
    });