2016-03-20 15 views
1

Я все еще работаю над своей видеоигрой и своим собственным движком игры, и я делаю хороший прогресс. В этот уик-энд я хотел потратить некоторое время, чтобы улучшить производительность своей игры и проверить наличие утечек памяти и так далее. В то время как большинство вещей выглядят хорошо, у меня невероятная высокая загрузка процессора около 45% (на Intel i5 с четырьмя ядрами). Во-первых, я думал, что у меня был очень плохой дизайн в одном из моих модулей, но даже после удаления всех частей из процесса рендеринга у меня все еще была загрузка процессора около 40%!Чрезвычайно высокая загрузка процессора в цикле визуализации

Это был мой циклом рендеринга после удаления всех моих модулей делают звонки:

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

Так что, как вы можете увидеть почти ничего не происходит, и я до сих пор есть, что 40% нагрузка на процессор. Я проверил, если что-то работает в фоновом режиме, распечатывая текущую трассировку стека каждые 5 секунд. В этом процессе ничего не было, после того как я отключил все модули своего игрового движка.

Тогда я вспомнил, что у меня была аналогичная проблема много лет назад во время учебы, когда поток вычислений был в бесконечном цикле. Поскольку цикл не замедлился, он был выполнен как можно быстрее, что вызвало высокую загрузку процессора. Вспомнив об этом, я добавил уродливую линию в конце моего рендеринга петли выше:

System.Threading.Thread.Sleep(10); 

вуаля, моя загрузка процессора снижается до примерно 10%, даже с включенными всеми модулями моей игры двигатель.

Однако это не приемлемое окончательное решение для моего игрового движка. Я потратил некоторое время на поиски онлайн-приложений для примеров цикла SharpDX, но я не смог понять, как другие люди справляются с этой проблемой.

Есть ли способ избежать высокой загрузки процессора без замедления цикла рендеринга с помощью thread sleep?

Буду признателен за советы и помощь от вас! :-)

+3

Если вы используете какую-либо технику для ограничения частоты кадров, у вас будет 100% -ный процессор и максимальный 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

Вот и все! Большое спасибо! Я посмотрел образцы со вчерашнего дня, и у них этот параметр был установлен на один или два. Я пропустил эту деталь: - / – Endgegner85

 Смежные вопросы

  • Нет связанных вопросов^_^