Plazma sayı 3, sayfa 76

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 76

Compiler Firewall Yöntemi

Bu gibi header dosyalarının işlenme sürelerinin azaltılması için zaten çok bilindik yöntemler mevcut. Bunların en temeli compiler firewall adı verilen ön derleme (preprocessing) komutları. Bunların amacı aynı kaynak kodunu derlerken bir header dosyasının birden çok kez işlenmemesi. Bunun için, ilk işleme ile bir makro tanımlayıp sadece bu makro tanımlı iken headerı işlemek bir yöntem, “#pragma once” satırı bir başka yöntem.

Ama bunlar windows.h gibi dosyalarda zaten var (bendekinde ilk yöntem kullanılıyor). Bu ancak kendi headerlarınız için kullanabileceğiniz (ve kullanmanız gereken) ve çok ufak çapta hızlandırmalar sağlayan bir yöntem. Zaten sorunumuz bu headerların tüm kaynak dosyalarınız için tekrar tekrar işlenmesi idi.

Bir kaynak dosyasının windows.h’ın yeniden işlememesinin tek bir yolu var: windows.h’ı eklememesi! Ama nasıl olur? Onu kullanarak bellek yönetimi yapıyoruz, zamanlama yapıyoruz, DirectX hatta ve hatta OpenGL kullanıyoruz. Bir çırpıda nasıl atarız? Bir çırpıda atamayacağız zaten. Bunun için DirectX, OpenGL, WinAPI gibi dev kütüphanelerin sadece kullanacağınız kısımlarını ayırıp bir bir wrap etmeniz gerekiyor.

SubAPI Yöntemi

OpenGL ile bir demo yaptığınızı ele alalım. Demonuzun her yerinde üçgenlerden oluşan objeler çiziyor, etrafta çizgiler uçuşturuyor, dikdörtgenler basarak resimler gösteriyorsunuz. Gayet iyi, gayet hoş. Lakin OpenGL, Bézier eğrileri de hesaplayabiliyor, ufak çapta görüntü işleme de yapabiliyor, isterseniz ekranda çizilen cisimlerin çetelesini de tutuyor. Çok daha kötüsü OpenGL, Windows altında windows.h’ı ekliyor!

Her kaynak dosyanızda gl.h eklemek, her kaynak dosyası için birkaç saniye beklemeniz demek. 30 kaynak dosyalı bir projede, 30 kaynak dosyanızın da kullandığı ve gl.h’ı çağıran bir headerı sürekli değiştirmenizin gerekmesi demek, yakında çıldıracaksınız demek. Bu yüzden OpenGL gibi dev bir kütüphanenin tüm proje çapında görülmemesi lazım.

Bunu engellemek için OpenGL’in kullandığımız kısımlarını projenin kalan kısmına sunan ufak çaplı bir API (application programming interface) hazırlayabilirsiniz. Bu API, örneğin C++’ta Renderer adı verilen bir namespace altındaki ya da C’de render öneki ile başlayan global fonksiyonlardan ibaret olabilir.

Renderer::DrawSprite2D /* ya da renderDrawSprite2D */ float left, float right, float top, float bottom

Klavyeyle gezinmek için ← ve → tuşları.