24 Şubat 2015 Salı

InsertCoin

Ara ara yaptığım oyunları derli toplu tutmak ve tek bir yerden paylaşım yapmak için oyun geliştirme blog'u yazmaya karar verdim. Ve merhaba InsertCoin! ... Blog ingilizce olacak ama buraya da (kargasekmez) elimden geldiğince içerik girmeye çalışacağım.

5 Şubat 2015 Perşembe

Bellek Sorunları – Yaşanmış bir olaydan kesitler


Yığın bellek parçalanması – Heap fragmentation
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ü malesef yok, kaybettim. Açıklamaları dikkatli okursanıza ekran görüntüsüne zaten gerek yok]

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...

Windows için bellek sınırları
Burda [http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx] tüm windows sürümleri için görevler (process) için tanımlanan maksimum bellek sınırları belirtilmiş. Ordaki tablo daha iyi özetlemiş ama kısaca tekrar yazarsak. 32 bitlik sistemlerde görevler için verilen sanal bellek sınırı 2 GB. 4-gigabyte tuning denen bir ayar çekme yöntemiyle bu sınırı 3 GB’a kadar öteleyebiliyoruz. Bu ayarı windows’a çekiyoruz, windows’un başlangıç parametrelerine (boot parameters) “/3GB” anahtarını eklememiz kafi. Ben 32-bit Windows 7 için yaptım, boşuna windows’un kurulu olduğu yerde “Boot” dosyasını aramayın, artık öyle ulu orta duran bir dosya değil(miş). Yönetici hakları ile “bcdedit /set IncreaseUserVa 3072” diyerek Boot kütüğüne gerekli parametreyi girmiş oluyoruz. (3072 Byte == 3 GB) . Ama sıkıntımız bitmiyor, windows’tan izin aldık ama programımızın da bundan haberdar olması lazım, yoksa o efendi efendi takılır ve 2 GB kullanmaya devam eder. Çalışan programların “IMAGE_FILE_LARGE_ADDRESS_AWARE” etiketi ayarlı olması lazım. Yani çalışan program windows’a, patron izin varsa daha fazla bellek kullanmak isterim demesi lazım. Bunu programı oluştururken bağlama (linker) parametresi ile yapabilirsiniz. Visual Studio için linker ayarlarından “Linker->System->Enable Large Addresses” ‘tan “Yes (/LARGEADDRESSAWARE)” diyoruz. Zaten derlenmiş bir programsa ve tekrar derleme şansınız yoksa o zaman şu gibi [http://www.ntcore.com/4gb_patch.php] araçlarla programınızı yamalayabilirsiniz.(patch) (her bulduğunuzu kullanmayın, araya keylogger atarsa facebook şifreniz gider yazık olur)

Gelelim 64 bit Windows’lara. Orda işler daha rahat, Windows siz aksini belirtmedikçe daha fazla bellek vermeye niyetli. Yani Windows ayarlarından bir şeyleri değiştirmenize gerek yok. 64 bit Windows’larda hem 32 bit hem 64 bit programlar çalıştırabildiğimiz için durum ikiye ayrılıyor. 64 bit Windows’ta 32 bit programlar için varsayılan ayar gene 2 GB ama programınızı yukarda anlatıldığı şekilde derler yada yamalarsanız 4 GB ’a kadar hakkınız oluyor. (Zaten 32 bit sistemler için fiziksel bellek sınırı). 64 bit Windows’ta 64 bit programların varsayılan olarak 8 TB’a kadar hakkı var. 8 TB teorik olarak bir limit çünkü sunucu olmayan Windows’ların maksimum limiti 192 GB. Ama siz yok o kadar da uçmasın derseniz bu sefer programınızın IMAGE_FILE_LARGE_ADDRESS_AWARE etiketini kapalı duruma getirirseniz programınız 2 GB limitli bellek kullanır. 

Belki zaten bilmiş olduğunuz şeylerin üzerinden belki de yanlışlar yaparak üzerinden şöyle bir geçtim. Benim açımdan böylece bellek sorunu tek satır kod eklemeden çözülmüş oldu. Ekip olarak programı fazla adres kullanmaya izinli olarak derlemeye karar verdik. Artık bad_alloc aykırı durumu almıyoruz, bellek parçalanması da şimdilik ciddi bir tehdit oluşturmuyor yoksa 1 gün boyunca açık bırakılan programın bir yerde eninde sonunda çakılması lazımdı. Zaten bu çözümden sonra gelen garip hata raporları da bıçak gibi kesildi.

Sonrasında gelen ilaç gibi bir hafta sonu ve Battlefield 3 ile otların arasına tüneyip keskin nişancı olmak paha biçilemez :D

30 Ekim 2010 Cumartesi

x86 Intel Assembly ile Matris Çarpımı

Bir arkadaşım okul ödevi olarak assembly ile matris çarpma programı yapmamı istemişti. Geçenlerde göçüp rahvan olan eski hard diskimin kalıntıları arasında dolanırken bu matris çarpıcı programı buldum. Belki birilerinin işine yarar diye buraya koyayım dedim. MASM ile yazılmıştır.

Buyrun: Matris.asm

29 Mart 2010 Pazartesi

C++'da "const" olarak tanımlanmış ifadeleri etkisizleştirme...

Baya karmaşık bir başlık oldu, neyse oldukça basit bir mevzu biraz inceleyince hemen anlaşılıyor. O yüzden okumaya devam edin. Üniversite kütüphanesinde Game Developers dergisinin Mart sayısını kurcalarken kodlama örnekleri bölümünde C++'da const olarak tanımlanmış ifadeleri etkisizleştirme üzerine bir yazı gördüm. Anlatılana göre geliştirici ekip başka bir ekipten hayli büyük miktarda kod almış. Bu yeni ekip güvenli kod yazmaya biraz fazla meraklı olduğundan kodun her tarafı "const" olarak tanımlanmış ifadelerle doluymuş. Bizim geliştirici ekip bu "const" ifadelerle boğuşup sürekli derleme hataları almaktan yorulunca çareyi yazının konusu olan hileyi yaparak bulmuşlar.

"const" tanımlı ifadelerin bela olduğu kod bloğunun başına "#define const" yazarak "const" 'u hiç olarak tanımlamışlar, yani "const"'u etkisizleştirmişler, böylelikle derleyici hatalarından bu ufak hile sayesinde kurtulmuşlar.

Yazı derginin dirty hacks bölümündeydi, o yüzden her zaman başvurulması gereken bir yöntem değil ama uygulaması çok basit. "const"'larla çok fena kavgalı olmuşsanız bu çözüm tam size göre.

25 Ekim 2009 Pazar

Yitik Projeler 2


Hacettepe Bil. Müh. 'teki mezunların ftp hesapları kapatıldı, tabi benim öğrencilik zamanından kalma Yitik Projeler 'de sonsuza dek yitmiş oldu. Haah!? Neyse ki bölümdeki asistan arkadaşlarım sayesinde sonları bu kadar dramatik olmadı, silinmeden önce arşiv halinde tüm dosyalarımı kurtarabildim.

Böylelikle Data Representation Tool v1.0'da projelere eklenmiş oldu. Nası iyi bir isim vermişsem zamanında :) ?

Evet, bu araç sayesinde ikili, sekizli, onlu, onaltılık ve ASCII formatları arasında dönüşüm yapabiliyoruz. Ekranda görüldüğü gibi "test" yazmışız ve karşılığında altındaki çıktıları almışız. Böyle de amaçsız bir program olmuş, neyse belki GUI kısmı yada başka bir yeri birilerinin işine yarar.

Buyrun program ve kod: Data Representation Tool v1.0 (239KB)

20 Şubat 2008 Çarşamba

LG R405'e Windows XP kurmak

Bazı bilgisayarlar Windows XP CD'sinin tanımadığı SATA donanımına sahip olabiliyor. Bunu ilk bir arkadaşımın bilgisayarında görmüştüm. Ama bunun için içinde SATA sürücüsünün olduğu bir disketi vardı ve yüklerken F6'ya basarak bu sürücüyü yüklüyorduk.

Ben de LG laptop'uma XP kurayım derken "no hard disk found" uyarısı alınca bi durdum orda :) ... Bende ne disket var ne birşey. Haydi internetten indirdim driverı ama laptop'un disket sürücüsü yok! ? ...

Neyse ki çareler tükenmiyor, Nlite isimli bir program sayesinde LG'nin sitesinden indirdiğim SATA sürücülerini CD içine gömdüm. Ve böyelikle hazırladığım yeni CD , SATA disklerimi gördü.

Umarım aynı sorundan müzdarip olanlara yol gösterici bir yazı olmuştur.

24 Ekim 2007 Çarşamba

Ubuntu - Kaybolan Grub menüsünü tekrar yükleme...


Bilgisayarımda Windows ve Linux kardeş kardeş çalışıyorken, Windows'u bir sebepten dolayı baştan kurmak durumunda kaldım. Tabi Windows tekrar yüklenince başlangıçta çıkan GRUB menüsünü sildi. Ubuntu yükleme DVD'im ile bilgisayarı açtım, ve ubuntu forumlarından gerekli bilgileri okuyup GRUB menüsünü düzelttim. Yalnız forumlarda yazan bazı bilgiler güncelliğini yitirmiş, özellikle Live CD ile "fake installation" yöntemi yeni Ubuntu sürümlerinde çalışmıyor.

İşte benim izlediğim adımlar:

1. Live CD yada DVD ile bilgisayarı açın.
2. Terminal ekranı açın.
3. "sudo grub" yazın. (root hakları ile grub'u çalıştırmak için başına sudo yazdık, önemli.)
-artık grub programı konsolundasınız -
4. "root" yazın. "(" yazın ve tab'a basın. Grub size yardımcı olacaktır. Bu adımda amacımız MBR olan, yani bootable olan disk bölümünü seçmek. "root" yazdıktan sonra ne yapacağınızı tam bilmiyorsanız 'tab' tuşunu kullanmanızı kesinlikle öneririm.
Örnek kullanım: "root (hd0, 3)"
5. "setup (hd0)" yazın. Burdaki 'hd0', bir önceki adımdaki sabit disk kodu ile aynı olmalıdır.
6. "quit" ile grub'dan çıkın.
7. Baştan başlatın.

İşte bu kadar. Bu adımlardan sonra bilgisayarımı açtığımda, GRUB menüm kaybolmadan önceki hali ile geri geldi. ;-)