2010-07-13 24 views
10

Başlık, sorularımı güzel topluyor: Linux için open source OpenGL profilleyicileri var mı?Open-source Linux için OpenGL profiler

Bulabildiğim tek şey, gDEBugger idi, ancak yalnızca 7 günlük deneme süresiyle geliyor ve çok fazla kapalı kaynak var. Ücretsiz olarak (özgürlükte olduğu gibi) yazılım geliştirme için kullanıyorum, öyleyse ücretli bir seçenek değildir, ancak ücretsiz (birada olduğu gibi) ama kapalı uygulama için cevapları kabul etmeyi düşünebilirim. Açık kaynak sürücülerle çalışırsa bonus puanları (ana bilgisayarım entegre bir Intel grafik kartına sahiptir).

cevap

6

BuGLe'a bakın. Ana hedefi profil oluşturma değildir, ancak her bir OpenGL çağrısında harcanan zamanı gösteren filter vardır.

+0

+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

+1

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

1

Gerçekten bu küçük profiler öneriyoruz: http://silverspaceship.com/src/iprof/, bu opengl profiline bağlı değil, ama çok iyi yapıyor! Ayrıca, profil istatistiklerini görüntülemek için opengl kullanabilir, yani çok portatiftir.

+0

Etkileşimli olmanın yanı sıra, bu nasıl gprof, oprofile, callgrind, vs'den farklıdır? AFACIT, uygun OpenGL profilleme yapmak için herhangi bir yol sağlamaz. – Staffan

+0

@staffan: Sanırım sahip olduğu tek avantaj, profil istatistiklerini fransime göre göstermesidir. Ve her zaman çalıştırabilir, sadece bir damlacık düşüşü yaşarsanız ve dondurmayı hangi profil bloğunun yavaşlattığını görene kadar geriye doğru hareket ettirirseniz dondurun. Statik/loglama profilleme araçlarını kullanırken framedropları bulmak zor. – Greget

1

Öyle ödeyerek özgür yazılım geliştirme için bu kullanmak istiyorsunuz "Ücretsiz" "opensource" anlamına gelmez bir seçenek

değildir.

Bkz. NVPerfKit, NVPerfSDK sizin için uygundur. NVPerfHud'u daha önce DirectX uygulamalarını profillemek için kullandım ve NVPerfKit, PerfGud'un OpenGL için küçük bir işlevini bile sunuyorsa, tam olarak aradığınız şey olacaktır. Ayrıca, NVIdia'nın OpenGL resources sayfasını da kontrol edin.

+0

+1 bu konuyla ilgili olduğundan ve tam olarak neye ihtiyacım olduğu görünüyor. Ne yazık ki NVidia grafik kartım yok. – Staffan

+0

@Staffan: İstediğin şeyin bu olup olmadığını görebiliyordunuz: http://developer.amd.com/gpu/StreamProfiler/Pages/default.aspx. Şahsen ben geliştirme için NVidia kartlarını kullanmayı tercih ediyorum (ve yıllardır ATI kartı kullanmadım), bu yüzden bu "stream profiler" in hedeflerinize uygun olup olmadığını söyleyemem. Ayrıca, başka biri tarafından yapılmış kartınız varsa (ATI olmayanlar, NVidia dışı kartlar), * siz * şanstan kurtulmuş olabilirsiniz. – SigTerm

+0

@Staffan: Başka bir (riskli) seçenek, OpenGL yazılımının bir tür yazılımını kullanmak ve bunu CPU profilleyicileri kullanarak profillemek olabilir. Düşünebildiğim en yakın şey Mesa3D'dir, ancak sertifikalı değildir ve OpenGL ile tamamen uyumlu değildir. Bana göre performans verileri satıcıya bağlı gibi görünüyor, bu yüzden her kart için yararlı olan jenerik bir gpu profiler yoktur. – SigTerm

9

@ 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

Ben de Vogl çok benziyor - ama katil özellikleri çerçeve yakalar, sen tüm tamponları shader değişkenler incelemek ve bu yüzden sadece tarafından edebilirsiniz - Bu profilleme, yakalama, tekrar vardır https://github.com/ValveSoftware/vogl

de bunu kontrol yakalanan durumunuzu tekrar oynatmak.