2016-03-20 19 views
1

Hala video oyunum ve kendi oyun motorum üzerinde çalışıyorum ve iyi bir ilerleme kaydediyorum. Bu hafta sonu, oyunumun performansını artırmak ve herhangi bir bellek sızıntısı olup olmadığını kontrol etmek için biraz zaman ayırmak istedim. Çoğu şey iyi görünmekle birlikte, yaklaşık% 45'lik bir inanılmaz yüksek CPU yüküne sahibim (dört çekirdekli Intel i5'de). İlk olarak, modüllerimden birinde çok kötü bir tasarım olduğunu düşündüm, ancak tüm parçaları render işleminden çıkardıktan sonra bile% 40 civarında bir CPU yükü vardı! Eğer hemen hemen hiçbir şey gördüğünüz gibi olur, Yaniİşleme döngüsünde son derece yüksek CPU yükü

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

ve hala% 40 CPU yükü var ki:

Bu

tüm modülleri çıkardıktan sonra benim hale döngü oldu çağrıları işlemek. Geçerli yığın izi her 5 saniyede bir basılarak arka planda herhangi bir şey çalışıyorsa kontrol ettim. Tüm oyun motorunun modüllerini devre dışı bıraktıktan sonra bu süreçte hiçbir şey koşmuyordu.

Daha sonra, bir hesaplama ipliği sonsuz bir döngüde olduğunda, yıllar önce yaptığım çalışmalarda benzer bir sorun yaşadığımı hatırlıyorum. Döngü yavaşlatılmadığından, yüksek CPU yüküne neden olan en hızlı şekilde gerçekleştirilmiştir. Tüm oyun motorunun modülleri devreye bile, benim CPU yükü% 10 civarında iner,

System.Threading.Thread.Sleep(10); 

Et voilà: Bu anımsama, ben yukarıda benim işlemek döngünün sonunda çirkin çizgi eklendi. Bununla birlikte, bu benim oyun motorum için kabul edilebilir bir nihai çözüm değildir. SharpDX render döngü örneklerine çevrimiçi bakmaya biraz zaman ayırdım, ancak diğer insanların bu sorunu nasıl çözdüğünü anlayamadım.

iş parçacığı uykusu ile uyku döngüsünü yavaşlatmadan yüksek CPU yükünü önlemek için herhangi bir yol var mı?

Sizden herhangi bir ipucu ve yardım için teşekkür ederiz! :-)

+3

Fps'i sınırlamak için bazı teknikler kullanmıyorsanız,% 100 CPU ve maksimum fps'ye sahip olursunuz. Bakınız örn. http://gamedev.stackexchange.com/q/68126 veya http://gamedev.stackexchange.com/q/51545. – GSerg

cevap

3

Basitçe değiştirin: _swapChain.Present(0, SharpDX.DXGI.PresentFlags.None);

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

tarafından MSDN'nda Swapchain:Present doc belirtildiği gibi:

  • 0 - sunum eşitleme yoktur, hemen olur .
  • 1'den 4'e kadar - Sunumu nth dikey boşluğundan sonra senkronize edin.
+0

İşte bu! Çok teşekkür ederim! Dünkü örnekleri inceledim ve bu parametre bir veya ikiye ayarlandı. Bu detayı kaçırdım: - / – Endgegner85

İlgili konular