"bir yazılımcının not defteri.."

27 Ekim 2016 Perşembe

Unreal Engine / C++ ve BluePrint karşılaştırması

Tekrar merhaba,

bugün biraz da Unreal Engine kod yazma ortamından, ve bu ortamın iki yıldızı olan BluePrint ve C++ dan, birbirinden apayrı görünen bu iki harika aracın farklarından, hangi durumda hangisinin avantajlı olduğundan bahsedeceğiz.















































önce biraz nostalji...

konu ile daha evvelden uğraşanlar bilirler; Unreal Engine den önce son kullanıcı için UDK (Unreal Development Kit) vardı. Bu Epic Games in kendi teknolojisini öğrenmek isteyen genç kesime hitap eden (kısmen) ücretsiz bir sürüm idi. UDK, Unreal Engine in biraz daha ufak bir versiyonu olsa da hayli güçlü bir motordu. Ve Kısmet adındaki bir editörde görsel semboller ile programlanabiliyordu. Hedef kitle baz alındığında bu gerekliydi de. Ama ille de program yazmak isteyenler için de Unreal Script adında bir kodlama ortamı da vardı.

Hedef kitle düşünüldüğünde onları C++ zorluğundan kurtarmak, ve daha kolay öğrenilebilen bir kod ortamı sunmak isteyen Epic mühendisleri, evet C++ dan farklı olan, ama bana göre pek o kadar da güzel ve kolay olmayan başka bir dil yaratmışlardı. Buna kaş yapayım derken göz çıkarmak da diyebiliriz. Zaten UDK nin kodlaması kullanılarak ortaya çıkan oyun sayısı o kadar azdı ki, malum garip icadın tutmadığı ve tutmayacağı çok açıktı.

Daha sonra Unity 3D nin hızla yayılışı, piyasadaki Torque 3D gibi motorları dahi sollaması, ücretsiz indirilebiliyor olması, cüzi lisans ücreti gibi endişe verici gelişmelerin ardından Epic, UDK gibi daha küçük versiyonlarını yaratmaya çalışmayı bırakıp büyük kılıcını çekti ve Unreal Engine i altın tepside bizlere sundu.

Ve artık kodlama yapmak için acayip acayip dil / scriptlerle uğraşmak zorunda değiliz. Unreal Engine in doğal kaynak kodu olan, ve en az 30 yıllık aktif kullanım ile kökleşmiş bir dil olan C++ ile kodlama yapmanın haklı gururunda olacağız :D

Öncelikle IDE yani kodun yazıldığı editör olarak eğer windows ortamında iseniz Epic, Microsoft Visual Studio yu öneriyor. Apple ortamında iseniz malum XCode. Tabi ben open source cuyum ve doğrudan kaynak kodundan derlerim diyorsanız kocaaaa Unreal Engine i GitHub dan indirip herhangi bir IDE ortamında derleyip işinize o şekilde devam edebilirsiniz; ki bunu daha çok Linux ile uğraşan arkadaşlar tercih edecektir. (ne kadar gerekli bilmiyorum...)

Madem ki artık kodlama disiplinimiz C++ olacak; biraz ondan bahsetmek vaciptir;
Programcılarının haklı gururu olan C++  1983 den beri kullanılıyor / geliştiriliyor.  Duyduğuma göre 1979 da üstad Bjarne Stroustrup ağabeyimiz kendisini yaratmaya başlamış.


Şimdilerde resimde göründüğünden çok daha yaşı ilerlemiş olan ustamız bence halen oldukça karizmatik :)

Dünya çapında yayılan ve endüstri standardı olan bu dil hemen her işletim sisteminin temelindedir.

Günümüzün en popüler dili olarak görebileceğimiz C# bile C++ baz alınarak üretilmiştir. Ve elbette ki ondan daha modern,
zamanın icaplarına daha uygun,
daha pratik,
daha kolay,
daha...
daha...  
ama bunların hiçbiri C++ ın gönüllerdeki yerini zedelememiş, ve C++ daima saygın bir biçimde " C# ın büyük ağabeyi " hatırlanmıştır...

Yani sözün özü, evet,  C++,  C# a göre biraz eski tarz kaçıyor, ve programlaması daha zor, sytax ı daha karışık. Ancak bundan gocunmayacağımız gibi bu zorluğa gururla dalacağız !

bu arada Unity 'nin programcılar tarafından yoğun bir şekilde tercih edilme sebebi de başta C# ile kodlanıyor olması zaten. Buna bir de Unity motorunun çok daha basit olmasını da eklersek hızla adapte olabiliyorlar. Elbette burada iki oyun motoru arasındaki bariz kalite farkını da gözetmek gerekiyor, yani Unity nin bu basitliğinin bedeli kötü grafik kalitesi ve kalıpvari oyunlar oluyor.

Şimdi tekrar Unreal Engine dönelim ve C++ dilini Unreal motoru ile ele alalım. Bu motorun kaynak kodu tamamen C++ ile yazıldı demiştik. Ve Unreal Engine de bizlere yazdığımız C++ kodunu doğrudan kendi C++ kaynak kodları ile birlikte derleme imkanı sunar ki, bu harika performans getirileri ve motorun tam gücünü kullanma imkanı olarak bizlere döner ! 

Peki bizim UDK daki Kısmet e ne oldu derseniz geliştirildi ve BluePrint adını aldı derim. BluePrint bir scripttir. Derlenmez. Yüksek seviyelidir ve bir tür makro gibi motora bazı hazır komutları vererek çalışır. C++ çilesine göre çok daha kolay ve de görsel olan bu araç Unreal Engine kullanan pek çok geliştiriciyi hızla kendisine çekmektedir.

şimdi yazının asıl konusu olan C++ ile BluePrint in farkları ne ? ve avantajlarından söz edelim;

  1. C++ dildir,  BluePrint scripttir;  C++ derlenir,  BluePrint derlenmez;
    Unreal Engine ürettiğimiz C++ kodunu bir şekilde kendi kaynak kodunun içine gömmeyi başarır, ve kendi kodları ile birlikte bütünsel bir derleme işlemi yapılır. Sonucunda son derece hızlı ve yüksek performanslı oyun çıktıları elde ederiz;  ve de C++ kodu bu yüzden BluePrintten en az (!) 20 kat daha hızlıdır. Bi çok durumda bu hız / performans farkı daha da artabilir.


  2. C++ derleme süreci yavaştır; bekletir; yaptığınız en ufak değişikliği, nokta virgülü bile derleme yapmadan etkisini oyunlarda, hatta editörde bile göremezsiniz.
    BluePrint te ise yaptığınız her şeyin etkisini anında editörde görebilirsiniz. Bu yönü ile BluePrint ile çalışmak çok, ama çok daha pratiktir.


  3. Editöre yakın işlemler için BluePrint idealdir.
    C++ ise (daha çok) editörden bağımsız çalışabilen, oyuna esneklik sağlayacak varlıkları tanımlayacak yeniden kullanılabilir altyapıyı üretmek için idealdir.


  4. C++ kodu platformlar arası taşınabilir ve yeniden kullanılabilir yapıdadır.

  5. C++ ın yeni kavramları ve karmaşık mantıkları tanımlama / ifade etme gücü müthiştir. BluePrint te ise bu zor bir iştir.

  6. C++ karmaşık ve uzun kodların altından rahatça kalkabilir. BluePrint ise programlanması gereken kavram arttıkça işler zorlaşır.

  7. C++ öğrenmesi zordur; artık biraz eski tarz kaçan bi dil; syntax karışık ve ağır; (C# gibi modern dillere nazaran) kullanımı da çok pratik değil;
    BluePrint i ise öğrenmek ve kullanmak çok daha kolaydır.


  8. belkide en önemli madde bu ki:
    C++ motorun gücünden tamamen faydalanabilir, 
    BluePrint ile herşeyi yapamazsınız.

    BluePrint e sempati duyan ve kullanan kimse
    size BluePrint ile Unreal Engin in tüm api lerinde kolayca gezebildiğini ve kullanabildiğini söyleyecektir; kısmen doğrudur da. Ancak zaten C++ ile yazılmış olan bu api leri çok yüksek bir seviyeden BluePrint scripti ile çağırmakla, doğal kodun kendi ortamından çağırmak arasında bariz fark vardır. Bu fark, azalan sınırlamalar,  artan esneklikler ve performans olarak bize dönecektir.

    Elbette level seviyesi dediğimiz seviye de zaten orta kademeli (pek çok) oyun için yeterli olmaktadır. BluePrint kullanımı da level seviyesi için uygun olduğuna göre orta kademeli ve geleneksel tiplerdeki bir oyunlar için BluePrint yeterlidir diyebiliriz. Ancak biraz sıradışılık, biraz performans, fazladan esneklik / oluşumlar peşinde isek, C++ yol haritamıza mutlak dahil edilmelidir...


Peki hangisini kullanmalıyız?
Cevap: her ikisini de !

ikisi birbirine rakip veya düşman değildir; birbirini tamamlayan unsurlardır; birbirinden farklı yeteneklere sahip bu araçlardan birine tamamen sırt çevirmek hiç de akıllıca değildir...

o an hangisini kullanacağımızın kararını işlemin editöre yakınlığı ve/veya performansa göre verebiliriz;

örneğin editörde yapılacak basit bi ışık açma kapama, ya da ses çalma için tutup ta C++ yazıp yarım saat derleme ile uğraşmak sadece hamallık değil kimse kusura bakmasın neredeyse aptallıktır. Öte yandan BluePrint kullanıp bir FRP yazmaya kalkışanın da (ki yazabilir demiyorum) derhal bakırköy'e kapatılması gerekir.  En doğrusu ikisinin bir arada kullanımıdır. Arka plan ağır (core) kodların C++ ile yapılması ve bu kodların bir arabirim ile BluePrint ortamından parametrik bir biçimde çağrılması en uygunudur. Burada amaç programcının C++ ile boğuşup editör sanatçısına yani Level Designer a BluePrint ile kolayca kullanabileceği hazır öğeler hazırlamaktır. Böylece Level Designer da programlama ile minimum vakit harcayarak BluePrint ile sadece hazır fonksyonaliteyi çağıracak, ve tüm enerjisini tasarladığı leveline odaklayabilecektir. (Ancak tekrar belirtelim ki ortalama bir oyun için hiç C++ kullanmadan sadece BluePrint ile yapmak mümkündür.)

Performans açısından bakacak olursak, çok sık işlem yapacak fonksyonlar için örneğin: Tick() tutupta BluePrint kullanmak da korkunç sistem kayıplarına sebep olur. Sık çağrılan kodlar daima C++ ile yazılmalıdır.

daha fazla uzatmiyim; önyargılara ya da fanatizme hiç gerek yok. İkisi de gerekli; ve ikisi harika müttefik !


peki bağlantı nasıl sağlanıyor ?
C++ da değişken ve fonksyonlar eğer BluePrint ten çağrılacaklar ise UPROPERTY ve UFUNCTION makroları ile işaretlenir; ve parametre olarak bir kategori adı da verilir; bu kategoriler BluePrint graph editör içinde bir nodu ararken çıkan liste içinde görünen kategorilerdir. Kodu yazıp derlediğinizde BluePrint editöründe koddaki kategori, ve onun altında da koddaki değişken ve fonksyon isimleri görünmeye başlar. (eğer makrolarda işaretlenmiş ise.)

nihai olarak;
C++ ile yazdığınız sınıfları BluePrint ile devralabilirsiniz. Editöre yakın işlemleri he zaman BluePrint e bırakmak akıllıca demiştik. dolayısı ile BluePrint ortamında parametrik olup tasarımcıya esneklik sağlamasını istediğimiz kısımlar C++ kodu için de parametrik tanımlanmalı; böylece gerçek bir ekip geliştirme ortamının da önü açılmış olur.


biraz da derleme araçlarından sözedecektim ama uykum geldi; hem de konu karışmasın; onu başka makale konusu yaparız.

şimdilik bir başka yazıda görüşmek üzere hoşçakalın..

Hiç yorum yok: