2012-06-22 16 views
5
Harcanan

[[DÜZENLEME 2x] benim özgün soru yanlış ifadeli düşünüyorum, bu yüzden aşağıda aşağı scooted ve ben gelecek okuyucular için en almaya çalışıyorum tam olarak ne yazdım var. ]Takip Zaman Debugger'daki

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~
[Yeni, Parlak, Daha iyi üslup ile net Soru]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~

Ben bir simülasyon/oyun çerçevesi için çalışan bir döngü var. Bu döngünün içinde, gerçekte - ne kadar zaman geçtiğinin - bu özel yerlerdeki - özellikle de Rendering ve Updating - - doğru çalışabilmesi için - ne kadar zaman geçtiğini anlaması gereken birkaç yer vardır. Sabit Zaman Adımı Olma seçeneğine (unfixed[update/render] yanlıştır) sahip olup olmamalıdır.

Uygulamada herhangi bir noktada Kesme Noktası Tabanlı Hata Ayıklama yapıldığı zaman sorun ortaya çıkar, çünkü gerçek zamanın ne kadar geçtiğini anlamak için bir kronometre kullanır (gerçekçi bir hızda hareket eden, fizik ve animasyon amacıyla) Bilgisayarın kaç kare açabileceğine bağlı olarak).

while (RunningTheSimulation) { 
    /* ... Events and other fun awesome stuff */ 

    TimeSpan updatedifference = new TimeSpan(updatestopwatch.ElapsedTicks); 

    if (unfixedupdate || updatedifference > updateinterval) { 

     Time = new GameTime(updatedifference, 
            new TimeSpan(gamestopwatch.ElapsedTicks)); 
     Update(Time); 
     ++updatecount; 
     updatestopwatch.Reset(); 
     updatestopwatch.Start(); 
    } 

    TimeSpan renderdifference = new TimeSpan(renderstopwatch.ElapsedTicks); 

    if (unfixedrender || renderdifference > renderinterval) { 

     Time = new GameTime(renderdifference, 
           new TimeSpan(gamestopwatch.ElapsedTicks)); 
     Render(Time); 
     ++rendercount; 
     renderstopwatch.Reset(); 
     renderstopwatch.Start(); 

    } 
} 
:

O 'parçası' geçti ne kadar zaman bilmesi gereken uygulama döngünün her 'parçası' için birden fazla stopwatches kullanarak, şöyle (kabaca) bakar son oluştu

değişkenleri hakkında bazı bilgiler:

updatestopwatch Güncelleme() fonksiyonunun dışında geçirilen süre için Stopwatch olduğunu

renderstopwatch oluşturulma() işlev dışında harcanan zaman için bir Stopwatch ve

gamestopwatch simülasyonu/oyunun kendisi geçen toplam süre için Stopwatch olup. Her yerde uygulamada hata ayıklama

sorun

doğar. kronometrelerini gerçek zamanlı ölçüm Çünkü Uygulamayı ayıklama ediyorum olsun veya olmasın kronometreler, zaman sayma devam edecektir, çünkü, Simülasyon tamamen Kırılma Noktası tabanlı ayıklama her türlü nedeniyle sapma olacaktır. Performansı ölçmek için Kronometreleri kullanmıyorum: Güncelleme, Render ve yukarıda gösterilenler gibi diğer olayların tekrarları arasında zaman tutmak için bunları kullanıyorum. Ben Render() zamanı yani tamamen simülasyon sonuçlarının herhangi bir görüntüleme vengefully yüzüne tekme olduğu kapalı sonra çalışma noktasının ve analiz etmek ve Güncellemesi() bir hatayı düzeltmek değil, bu son derece sinir bozucu oluyor.

Bu, hata ayıklamayı tamamen durdurduğumda açıkça bir sorun değil, ancak çok fazla geliştirme işim var ve ben uzun süre hata ayıklamaya gidiyorum, bu sadece bu durumun uygunsuz olduğunu iddia ediyor maalesef işe yaramayacak. = [

Performans Sayaçlarına baktım, ama yapmaya çalıştığım şeyin bağlamında çalışmasını sağlamak için kafamı saracak gibi görünmüyorum: Render ve Güncelleştirme herhangi bir sayıda keyfi içerebilir kod Ben sürekli döngü her bileşeninin bir PerformanceCounter.Increment() yapamaz demektir (bu while döngü üstünde çalıştığı ne olursa olsun simülasyon özgü konum).

System.Diagnostics ve diğer .NET ad alanlarını dolaşmaya devam edeceğim, ancak şu ana kadar ekli Debugger'da harcanan süreyi "yok saymaya" başlayacağım ...

Herhangi bir fikri veya anlayışı olan var mı?

[[EDITS 5x] Düzeltilen yazım hataları düzeltildi ve her şeyin biçimlendirmesinin doğru olduğundan emin olun. Bunun için üzgünüm. ]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Orijinal, daha az net soru]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

I sürekli bir döngü bir C# uygulamasında çalışan sahip olan I her zaman hata ayıkla. Şu anda bir Kronometre kullanıyorum, ancak geçen zamanı izlemek için başka herhangi bir mekanizmayı kullanabilirim. Bir yerde tipik while (true) { ... } içine bu döngü (sırasında kullanım KRİTERE gibi şeyler benim problem başlar:

if (unfixedupdate || updatedifference > updateinterval) 
{ 
    Time = new GameTime(updatedifference, 
         new TimeSpan(gamestopwatch.ElapsedTicks)); 
    Update(Time); 
    ++updatecount; 
    updatestopwatch.Reset(); 
    updatestopwatch.Start(); 
} 

zaman önlemlerini kendisi güzel, ama gerçek gerçek zamanlı ölçer - Ben hata ayıklama geçirdi herhangi süresi dahil olmak üzere. Yani, eğer updatestopwatch.Reset()'dan sonra 17 saniye boyunca etrafta dolanırsam, bu benim döngümün üzerine yoğunlaşır ve - bu döngünün en az 1 tekrarı için - tüm hesaplamalarıma gerçek zamanlı olarak harcadığım fazladan zamanla uğraşmak zorundayım

Uygulamanın donma zamanını öğrenmek için hata ayıklayıcıya bağlanabileceğim herhangi bir yol var mı? zamanı ölçün ve buna göre çıkartın mı? Etiketlendiği gibi, bunun için .NET ve C# kullanıyorum, ama Visual Studio ile ilgili bir şey de doğru yönde gitmeme yardımcı olabilir.

[EDIT] Daha fazla bilgi için birkaç kronometre kullanıyorum (güncelleme, oluşturma ve farklı bir ileti sırasındaki diğer birkaç olay için). Güncelleştirme() içinde veya uygulamanın herhangi bir bölümünde bir kesme noktası belirlerseniz, kronometreler bunlar arasında harcanan Gerçek Zamanı doğru bir şekilde ölçecektir. Bu, uyguladığım uygulamanın tamamen birbiriyle ilgisi olmayan çeşitli bileşenlerini Update() veya Render() veya Render() veya Input() vb. Gibi hata ayıklamalarında harcadığım zamanı da içerir. Açıktır ki simülasyonun Zamanlaması (GameTime parametresi tarafından kontrol edilen Üst Düzey Güncelleme, Render vb. Işlevlerine göre kontrol edilir) CPU, güncelleme işlevini bitirmek için sadece 13 ms sürdüyse bile düzgün çalışırsa, hata ayıklaması için 13 ekstra saniye harcadım (değişkenlere bakmak ve sonra simülasyonla devam et); diğer kronometrelerin görebileceği problem, aniden 13 ek saniyelik bir süreyi hesaplıyor. Eğer hala mantıklı olmazsa, tekrar arayacağım.

+0

Bu performans verileriyle ne yapmayı umduğunuzu açıklar mısınız? Hata ayıklama ek yükü, performans ölçümlerini sadece Kronometreli örneklere UI bekleme süresini eklemekten daha ince yöntemlerle bozabilir. Bu döngüyü optimize etmeye çalışıyorsanız, ölçümlerinizi yaparken hata ayıklayıcısını kullanmamanız daha iyi olur. –

+0

Güncelleştirme() 'den sonra ama updatestopwatch.Reset() çağrıları başlamadan önce kesme noktanız yok mu? – davenewza

+0

Sadece Güncelleme döngüsünden daha fazlasına sahibim; Bir Render Loop ve yakalanan ve kullanılan diğer olaylar var. Böylece, Breakpoint'i başka bir yere koymak gerçekten bir çözüm değildir. –

cevap

2

Bunun yerine performans sayaçlarını kullanın. İşlem CPU zamanı iyi bir gösterge (gerçek zamanlı kronometre kadar doğru değil) vermeli ve hata ayıklama işlemine müdahale etmemelidir.

+0

Performans Sayaçlarını hiç bilmiyordum. Onları deneyecek ve geri dönüp ti işe yarayacaksa bir cevap vereceğim. Yardımın için teşekkürler. –

+0

@ ThePhD: Diğer bir avantaj ise, sistemin geri kalanı yük altında olsa bile gerçek işlemci zamanını almasıdır. Gerçek zamanlar bu durumlarda gerçekten çok fazla bir şey ifade etmiyor :) – leppie

+1

@ThePhD: Bazı örnek kodları burada görebilirsiniz: https://github.com/leppie/IronScheme/blob/master/IronScheme/IronScheme/Runtime/Builtins.cs#L519 – leppie

0

Bunun olası bir çözümü, yerlilerinizi (veya hata ayıklamaya çalıştığınız her türlü veriyi) Debug.WriteLine() kullanarak çıktıya yazmak olabilir.

+0

Bu, hayal kırıklığına uğrayıp uğramadığım veya yapmamam iyi bir şey ve bunu yapıyorum.Sadece, üzerine ek hata ayıklama süresi olmadan Güncelleme (veya Render veya Ana döngüsünün diğer bileşenlerinden herhangi biri) gibi şeyler yapmanın ne kadar zaman harcadığını bilmek zorundayım. –