2016-03-20 14 views
1

私はまだ自分のビデオゲームと自分のゲームエンジンで作業しています。今週末、私はゲームのパフォーマンスを向上させ、メモリリークなどをチェックするために時間をかけたいと思っていました。ほとんどのものはうまく見えますが、CPU負荷は約45%という非常に高いCPU負荷(Intel Core i5と4コア)があります。まず、私のモジュールの中には非常に悪い設計があると思っていましたが、レンダリングプロセスからすべての部品を取り除いた後でも、CPU負荷は約40%でした!あなたは、ほとんど何も起こりませんし、私はまだ40%のCPU負荷ということだ見ることができるように、そうレンダリングループのCPU負荷が非常に高い

public void Run() 
    { 
     _logger.BeginFunction(this.ToString(), "Run"); 

     RenderLoop.Run(Form,() => 
     { 
      _deviceContext.ClearDepthStencilView(_depthView, SharpDX.Direct3D11.DepthStencilClearFlags.Depth, 1.0f, 0); 
      _deviceContext.ClearRenderTargetView(_renderTargetView, Color.Black); 

      _swapChain.Present(0, SharpDX.DXGI.PresentFlags.None); 
     }); 

     OnApplicationClosing(); 

     _logger.EndFunction(); 
    } 

これはすべての私のモジュールは、通話をレンダリング取り除いた後、私のレンダリングループでした。 5秒ごとに現在のスタックトレースを印刷して、何かがバックグラウンドで実行されているかどうかを確認しました。ゲームエンジンのすべてのモジュールを無効にした後、このプロセスでは何も実行されていませんでした。

その後、数年前の私の研究では、計算スレッドが無限ループになっていたのと同じ問題があることを思い出しました。ループが遅くならなかったので、できるだけ高速に実行され、CPU負荷が高くなりました。すべての私のゲームエンジンのモジュールがアクティブにさえして、私のCPU負荷が10%程度まで下がる、

System.Threading.Thread.Sleep(10); 

ほら:これを覚えて、私は上記の私のレンダリングループの最後で醜い行を追加しました。

しかし、これは私のゲームエンジンの最終的な解決策ではありません。 SharpDXのレンダリングループのサンプルをオンラインで探していたのですが、他の人がどのようにこの問題を処理しているかを把握することはできませんでした。

スレッドスリープでレンダリングループを遅くすることなく、高いCPU負荷を回避する方法はありますか?

私はあなたに何かヒントや助けに感謝します! :-)

+3

fpsを制限する技術を使用していない限り、100%CPUと最大fpsが可能です。例えば、 http://gamedev.stackexchange.com/q/68126またはhttp://gamedev.stackexchange.com/q/51545 – GSerg

答えて

3

は、単に置き換える: _swapChain.Present(0, SharpDX.DXGI.PresentFlags.None);

_swapChain.Present(1, SharpDX.DXGI.PresentFlags.None);

でMSDN Swapchain:Presentドキュメントに記載されているように:

  • 0 - プレゼンテーションがすぐに発生し、同期はありません。
  • 1〜4 - n番目の垂直ブランクの後にプレゼンテーションを同期させます。
+0

それだけです!どうもありがとうございました!私は昨日からサンプルを調べて、このパラメータを1〜2に設定しました。私はこの詳細を逃した: - / – Endgegner85

関連する問題