Geçenlerde, mevcut UI framework'lerinin (WPF, WinForms) bana yetmediği bir kontrol yapmam gerekti. "Hadi canım," dedim, "ben DirectX ile kendi render motorumu yazar, istediğim gibi bir grafik kontrolü oluştururum. Ne kadar zor olabilir ki?" Kafayı yiyecektim.
Sıfırdan pencere oluşturma, Direct3D11 device'ı başlatma, swap chain ayarları derken, daha kontrolün tek bir pikselini çizemeden 2 saat geçmişti. Framework'lerin arka planda sessiz sedasız hallettiği onlarca işlemle yüzleştim. Şaka gibi ama, basit bir dikdörtgen çizmek için yazdığım shader kodu, asıl iş mantığımdan daha uzundu.
C#:
// Sadece bir kare çizmek için... Bu kadar mı?
PixelShader = device.CreatePixelShader(File.ReadAllBytes("SolidColorPS.cso"));
Render pipeline'ı bir şekilde oturttum diyelim. Sonra mouse tıklamasını yakalamam, koordinatı doğru hesaplayıp bir "click event" fırlatmam gerekti. Framework'lerde tek satırla hallolacak şey için Win32 API mesaj döngülerine daldım. "WM_LBUTTONDOWN", "WM_MOUSEMOVE"... Meğerse WPF'nin o süslü "MouseDown" event'ı arka planda ne mucizeler çeviriyormuş.
Fareyi sürüklerken çizim yapacaktım. Kendi yazdığım event sistemimde bir yerde state karıştı, fare bırakıldığı halde sürükleme modunda kaldı. Kontrol, fareyi bırakmamı bir türlü anlamadı. StackOverflow'da bile bulamadığım bir hataydı. Meğerse sorun, pencere kaybı (window loss) durumunda event state'ini sıfırlamamış olmamdaymış.
Bu macera, modern UI framework'lerinin aslında ne kadar devasa birer mühendislik harikası olduğunu somut olarak gösterdi. Onlar sadece buton, textbox koyduğumuz araçlar değil; grafik render'ı, input yönetimi, layout sistemi, veri binding, styling, erişilebilirlik gibi onlarca karmaşık sorunu çözmüş, test edilmiş, optimize edilmiş devasa kütüphaneler.
OpenGL veya Vulkan ile de durum aynı. Özelleştirilmiş, yüksek performanslı bir görselleştirme aracı yapmıyorsanız, tekerleği yeniden icat etmenin anlamı yok. Hatta çoğu zaman, framework'ün sunduğu custom render hook'ları (WPF'de WriteableBitmap, WinForms'ta Owner Draw) işi fazlasıyla görüyor.
Sonuç olarak, bir daha framework'lerin değerini hafife almayacağım. Onlara küfrederken bile, aslında ne büyük bir işi üstlendiklerini anladım. Siz de böyle "ben yaparım" diyip derin sulara daldığınız, sonunda hazır araçların kıymetini anladığınız anlar oldu mu? DirectX/OpenGL ile UI yapmanın daha makul bir yolu var mı, yoksa bu işlere bulaşmamak mı lazım?