Belleğin doğru işlenip işlenmediğini nasıl bilebilirim?


12

Bir doku yüklediğimde (2D) oyunumun bellek ayak izi artıyor gibi görünüyor, örneğin oyunuma başladığımda ~ 367mb arka plan dosyasını aktardıktan sonra 30 mb özel RAM kullanıyor, bu yüzden bir noktada RAM'da, 54 mb özel RAM.

Aynı şey, aynı mesafeye gittikten sonra tekrar tekrar iki nokta arasında gidip geldikten sonra olur.

Ancak, benim okumaları programın dokuları ekrandan gittikten yaklaşık bir saniye sonra glDeleteTextures doğru çağırıyor gösteriyor; ve valgrind hiçbir sızıntı bulamıyor.

Bu konuda endişelenmem gerekip gerekmediğini veya işletim sistemi sayfalarının belleğinin nasıl tuhaf olduğunu nasıl anlarım?


1
Uygulamanızın RAM kullanımını nasıl belirlediniz? Bir profiler mi kullanıyorsunuz (hangisi?) Veya işletim sisteminizin (hangisini) görev yöneticisine güveniyor musunuz?
Philipp

1
KuBuntu'daki görev yöneticisi, hata ayıklayıcımdaki profiler bana veri beklediğini söylüyor, sonra hiçbir şey göstermiyor.
Patrick Jeeves

1
Bu arada: Linux'ta bellek tüketimini kontrol ederken, sadece oyun süreci tarafından tüketilen belleğe bakmayı unutmayın. Bir keresinde çok platformlu bir oyun üzerinde çalıştım, grafik API'mizin Linux sürümünün X11 sürecindeki tüm dokular için görünüşte bellek ayırdığını fark edene kadar, Windows sürümünün neden Linux sürümünden çok daha fazla koç tükettiğini merak ettik.
Philipp

2
GlDeleteTextures'ın aslında belleği boşaltması konusunda hiçbir beklentiniz olmamalı: gamedev.stackexchange.com/questions/136883/…
Maximus Minimus

Yanıtlar:


21

Sanal bellek, büyük parçalarda işletim sisteminden ayrılır; bu büyük yığında bir bayt bile kullanılmaya devam ettiğinde, işletim sistemine geri bırakılamaz.

Kullanıcı alanındaki ayırma kütüphaneleri de, işletim sisteminden sürekli olarak çok fazla talep ve bellek bırakmayı önlemek için yeniden kullanım için belirli bir miktarda tutar.

Örneğin, bir doku tahsis edersiniz, OpenGL sürücüsü 32 doku yuvasından oluşan bir tablo ayırır, dokuları ayırmaya devam edersiniz, daha sonra sürücünün 1024 doku yuvasından daha büyük bir tablo tahsis etmesi gerekir, bu yeni tablo artık büyük RAM yığınında yer kaplıyor, Tüm dokuları serbest bırakın, sürücü oyunun / uygulamanızın daha sonradan çok sayıda doku kullanması gerektiği beklentisiyle bu tabloyu küçültmez veya yeniden tahsis etmez, böylece büyük RAM yığını işletim sistemine geri gönderilemez.

Bu tamamen normaldir ve istenir. Kullanılmayan RAM sonunda uygulamanız tarafından yeniden kullanılacaktır.


1
Oyun sırasında kullanım artmaya devam ederse, ancak kaçak dedektörleri hala bir şey bulamazsa, aşırı bellek parçalanmasından muzdarip olabilirsiniz. Stackoverflow.com/questions/150753/… 'de açıklanan böyle bir sorunu çözme yaklaşımları da oyun geliştirme için faydalı olacaktır.
Jules
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.