2016-03-20 17 views
1

Ich arbeite immer noch an meinem Videospiel und meiner eigenen Spiel-Engine und ich mache gute Fortschritte. An diesem Wochenende wollte ich mir etwas Zeit nehmen, um die Leistung meines Spiels zu verbessern und nach Speicherlecks und so weiter zu suchen. Während die meisten Dinge gut aussehen, habe ich eine unglaublich hohe CPU-Last von etwa 45% (auf einem Intel i5 mit vier Kernen). Zuerst dachte ich, ich hätte ein sehr schlechtes Design in einem meiner Module, aber selbst nachdem ich alle Teile aus dem Renderprozess entfernt hatte, hatte ich immer noch eine CPU-Last von etwa 40%!Extrem hohe CPU-Last in Render-Schleife

Diese Schleife meine machen war, nachdem alle meine Module zu entfernen Anrufe machen:

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

So, wie Sie geschieht fast nichts sehen kann, und ich habe immer noch, dass 40% CPU-Last. Ich habe überprüft, ob irgendetwas im Hintergrund läuft, indem ich die aktuelle Stapelverfolgung alle 5 Sekunden drucke. Nichts lief in diesem Prozess, nachdem ich alle Module meiner Game Engine deaktiviert hatte.

Dann erinnerte ich mich, dass ich vor vielen Jahren während meines Studiums ein ähnliches Problem hatte, als sich ein Berechnungsthread in einer Endlosschleife befand. Da die Schleife nicht verlangsamt wurde, wurde sie so schnell wie möglich ausgeführt, was eine hohe CPU-Last verursachte. In Erinnerung an diesem, fügte ich eine hässliche Zeile am Ende meiner Render-Schleife oben:

System.Threading.Thread.Sleep(10); 

Et voilà, meine CPU-Last auf rund 10% untergeht, auch mit all meiner Spiel-Engine Module aktiviert.

Dies ist jedoch keine akzeptable endgültige Lösung für meine Game Engine. Ich habe einige Zeit gebraucht, um online nach SharpDX-Render-Loop-Beispielen zu suchen, aber ich konnte nicht herausfinden, wie andere Leute mit diesem Problem umgehen.

Gibt es eine Möglichkeit, die hohe CPU-Last zu vermeiden, ohne die Render-Schleife mit Thread Schlaf zu verlangsamen?

Ich würde mich über Hinweise und Hilfe von Ihnen freuen!

:-)
+3

Wenn Sie keine Technik zur Begrenzung von fps verwenden, werden Sie 100% CPU und maximale fps haben. Siehe z.B. http://gamedev.stackexchange.com/q/68126 oder http://gamedev.stackexchange.com/q/51545. – GSerg

Antwort

3

einfach ersetzen: _swapChain.Present(0, SharpDX.DXGI.PresentFlags.None);

von

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

Wie in MSDN Swapchain:Present doc erklärte:

  • 0 - Die Präsentation erfolgt sofort gibt es keine Synchronisation .
  • 1 bis 4 - Synchronisieren Sie die Präsentation nach der n-ten vertikalen Leerstelle.
+0

Das war's! Vielen Dank! Ich habe die Samples von gestern nachgeschlagen und sie hatten diesen Parameter auf eins oder zwei gesetzt. Ich habe dieses Detail vermisst: - / – Endgegner85