2012-05-22 9 views
5

Nvidia 290.10 64bit sürücülerini kullanan linux tabanlı bir C++ OpenGL uygulaması üzerinde çalışıyorum. Oldukça çok sayıda canlı veriyi kullanması nedeniyle bellek ayak izini azaltmaya çalışıyorum.libGL yığın kullanımı

Yığın kullanımını analiz etmek için valgrind/massif kullanıyorum ve şu anda çeşitli şeyleri optimize etmeme yardımcı olurken, şu an kullanılan yığın belleğin en büyük yığını libGL tarafından tahsis edildi. Eşiği nasıl belirlediğim önemli değil, masif bu tahsislerin nereden geldiğini detaylı olarak görmeme izin vermiyor, sadece libGL. Yoğun zamanlarda, libGL tarafından ayrılan yaklaşık 250MB (toplam 900MB'lık toplam yığın kullanımından) görüyorum. Ekran kartında, VBO'lar ve Tekstiller (benzer şekilde büyük bir 4096 * 4096 doku) gibi benzer miktarda bellek var.

Yani, GPU belleğine yüklediklerim kadar benzer miktarda bellek libGL tarafından yığına ayrılıyormuş gibi görünür. LibGL tahsisleri de VBOs doruklarının hacmi zirveye çıktığında zirveye ulaşır. Bu normal mi? Çok fazla GPU belleğine sahip olmanın avantajlarından biri de RAM'i serbest tutmasıdır diye düşündüm.

+1

VB'de "glBufferData" için hangi kullanımları belirttiniz? – KillianDS

+0

VBO'ların büyük bir kısmı için, GL_STATIC_DRAW. Bir durumda GL_STREAM_DRAW, ancak uygulamanın bu kısmı devre dışı bırakılmış olsa bile davranış aynı. – pholz

+0

@KillianDS fark etmez, çünkü kullanım sadece bir ipucu, zorunlu değil. Ayrıca OpenGL çeşitli nedenlerden dolayı bir kopyasını bulundurmalıdır. – datenwolf

cevap

7

Yaşadığınız şey tamamen normaldir, çünkü bir OpenGL uygulaması, verilerin çeşitli nedenlerle sistem belleğinde bir kopyasını bulundurmalıdır.

OpenGL'de GPU'ya özel erişim yoktur, bu nedenle kullanımına bağlı olarak, verileri değiştirmek (veya yalnızca bazı nesneleri GPU belleğinden serbest bırakmak) gerekli olabilir. Ayrıca GPU'lar çökebilir ve sürücüler daha sonra kullanıcı dikkat etmeden sessizce sıfırlayabilir. Bu da tüm tampon verilerinin tam bir kopyasını gerektirir.

Ve adres alanı tahsisi (Valgrind tarafından bildirilen değerin) ve gerçek bellek kullanımı arasında büyük fark olduğunu unutmayın.

+0

Teşekkürler, böyle bir şey olabileceğinden şüpheleniyordum. Artık RAM dolduğunda, tahsislerin büyük bir kısmı libGL'den geldiği sürece daha az kötü bir şey midir? – pholz

+2

pholz: LibGL, tahsisleri yapan kodun nereden geldiğini, ancak belleğin OpenGL kaynaklarını ayıran işlem tarafından etkin bir şekilde ayrıldığı yerdir. Ve sistem için aralarında bir fark yok. Ayrıca modern işletim sistemleri RAM ve depolama arasında ayrım yapmaz. Onlar için sadece "bellek" var ve RAM sadece başka bir önbellek seviyesi. Modern bellek kullanımına çok iyi bir giriş için bu makaleye bakın https://www.varnish-cache.org/trac/wiki/ArchitectNotes – datenwolf