[[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]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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.
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. –
Güncelleştirme() 'den sonra ama updatestopwatch.Reset() çağrıları başlamadan önce kesme noktanız yok mu? – davenewza
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. –