100 lerce megabyte boş belleğiniz olduğu halde altı üstü 5 mb için “new” - “malloc” dediğinizde “bad_alloc” aykırı durumu (exception) alıyorsanız anlaşılan o ki belleğiniz sorumsuz bellek yönetiminiz yüzünden kevgire dönmüş ve size peşi sıra dizilmiş 5mb’lık boş bir yer ayarlayamıyor!
ışte geçtiğimiz Cuma başıma gelen tam da buydu. Aslında her oyun geliştirme kitabında bu konuyla ilgili bir bölüm olur. Zaten gigabytlar dolusu yeri ben nasıl doldurayım deyip çok sallamadan geçerdim. Ama gel gör ki başa geldi, başa gelince atladığım yerleri tekrardan bir üzerinden geçtim =) bir musibet bin nasihat hesabı.
Hemen neler olup bittiğini daha iyi anlamak için bir araç aradım ve VMMap’i buldum. Gerçekten çok başarılı bir araç, bellek sorununuz olsun olmasın programınızın neler çevirdiğini daha iyi anlamanız için her zaman kullanılabilecek bir araç. (Daha detaylısı için bkz. WinDbg)
VMMap’ten “free memory” ‘yi seçip, büyüklüğe göre sıraladığınızda kullanabileceğiniz boş bellek bloklarını görebilirsiniz. Tüm boş bellek blokları toplamı yüzlerce MB edebilir ama bir seferde alabileceğiniz en büyük miktar ordaki en büyük blok kadardır (ben öyle anladım). Benim durumumda 3, 5 MB’lardan oluşan yaklaşık 200 MB’lık bir alanım vardı ama 5 MB’dan büyük bir .tga yüklerken göçüyordu sistem.

Ekran görüntüsünde “Free Space” seçilmiş “Size”’a göre sıralanmış ve en büyük bellek parçasının 2048 byte olduğu görülüyor ama toplamda 61 MB boş yerimiz var. ışte bu gibi durumlarda 3 MB’lık bir texture yükleme bizi cortlatıyor. Aslında görev yöneticisinden bakarsak daha bir kaç GB daha sanal belleğimiz (virtual memory) var ama bizim uygulamamız için ayrılan maksimum sınır 2GB olduğu için bizim şimdilik 61 MB’ımız var görünüyor.
Kullandığımız oyun motoru kör topal da olsa çalışan ve epey bir yıldır kullanılan bir sistem. (Image Space Corp. tarafından yazılmış). Çok mecbur kalmadıkça motoru değiştirmememiz gerekiyor, bu yüzden kitaplarda bahsi geçen yöntemleri uygulamam pek mümkün değildi. Aslında motorun kendi bellek yöneticisi var ama aktif değildi, ilk deneme olarak onu aktifleştirdim. Yorum satırlarının yalancısıyım, dediğine göre talep edilenden biraz daha büyük bellek blokları alıp, yeri gelince kaydırma yapıp bu parçalanma sorunlarını azaltıyormuş. Dediği gibi de yaptı ama durum daha kötüye gitti nerdeyse hiç boş yer kalmadı, görev yöneticisinden bakarsak daha yerimiz var ama VMMap öyle demiyordu. Tek bir ipucu vardı, her seferinde 2GB civarına bir üst limite takılıyorduk, peki neden 2GB? Bu soru üzerine google’dan gelen ilk sonuçlar dikkat çekiciydi...
Devam edecek...