@ cypheon'un cevabı sayesinde, BuGLe'ye baktım. Bu harika, ama yararlı profil çıktısı almak için biraz zaman harcamak zorunda kaldım. Bu cevabı bir yorum olarak eklemek istedim, ancak tam kod örneklerini yapıştırmam gerekiyor, bu yüzden yeni bir cevap vermeye başladım.
Önerildiği gibi, stats_calltimes filtresi, profilleme için iyidir - ideal değil (çağrı yığını bilgisini göstermediği için), ancak biraz çalışma ile, her bir GL işlevi için toplam düz zaman gösterebilir çerçeve başına.
Hem ~/.bugle/filters
ve ~/.bugle/statistics
dosyalarını düzenlemeniz gerekir.
chain showcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset showstats
{
show "average time per call"
}
}
Şimdi komutla programı çalıştırın:: Birincisi, filters
sonuna bu zinciri eklemek
BUGLE_CHAIN=showcalltimes LD_PRELOAD=libbugle.so <your-program>
Bu kare başına her GL işlevinde geçirdi ortalama zaman yazdırılır. Bu, kendi başına çok yararlı değildir, çünkü çerçeve başına binlerce kez çağrılan, glVertex
gibi bir çağrı için, kümülatif zaman oldukça önemli olsa da, muhtemelen 0,00 ms olarak görünecektir. Yani statistics
için yeni bir girdi ekleyin: hiç çağrılmadı herhangi bir işlev için bir üçe-sıfıra hatayı neden d("calls:*")
ile çarpın bölün:
"total time per call" = d("calls:*")/d("calls:*") * d("calltimes:*")/d("frames") * 1000
{
precision 3
label "* (ms)"
}
Ben aynı "çağrıları kare başına" istatistik olarak numara kullanılmaktadır Tüm alakasız işlevler için 0.00 göstermekten kaçınmak için.
Şimdi, geri biz filters
eklenen showcalltimes
zinciri gidin ve değiştirmek "average time per call"
"total time per call"
için:
chain showcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset showstats
{
show "total time per call"
#key_accumulate "A"
#key_noaccumulate "I"
}
}
Ve şimdi kare başına, her işlevinde harcanan toplam zamanın kullanışlı bir stat göreceksiniz. Bu istatistikleri bir çok karede ortalamak istiyorsanız, yukarıdaki key_accumulate
satırını kaldırın ve daha sonra biriktirmeye başlamak için "A" tuşuna basabilir (veya seçtiğiniz bir tuşa basarak). Zamanla, istatistiklerin pek çok kareyi ortaladıkları kadar etrafta zıplayarak durduğunu göreceksiniz.
Ayrıca bu zinciri ile bir çıkış dosyasına bu istatistikleri giriş yapabilirsiniz:
chain logcalltimes
{
filterset stats_calls
filterset stats_calltimes
filterset log
{
filename "bugle.log"
}
filterset logstats
{
show "total time per call"
}
}
Bu basitçe birbiri ardına her çerçeve tek bireysel istatistikleri koyar, çünkü okumak oldukça zordur ve ben cenneti Zamanla onları ortalamalamanın bir yolunu buldum. Bu yüzden, istatistik okumak için tercih ettiğim yöntem, akümülatörün açık olduğu showcalltimes
zinciridir.
+1! Gerçekten ihtiyacım olan şey değil ama bu kullanışlı görünüyor. Gelecekte uygun profilleme desteğini de içerebileceğini umuyoruz. – Staffan
Bahşiş için teşekkürler. BuGLe denedim ve fantastik (özgür ve açık kaynak olmanın yanı sıra). Ancak, bazı yararlı profil çıktısı almak için biraz uğraştım, bu yüzden iyi bir profil çıktısı elde ettiğimi ayrıntılı olarak anlatan bir [yeni cevap] (http://stackoverflow.com/a/8859325/368821) ekledim. – mgiuca