Tanshaydar'ın Mekânı
Başka bir şey yok
Kategori: Oyun Geliştirme, Yazılım

Oyun Yapmak vs Oyun Motoru Yazmak, Fark Ne?

Not: Bu yazının tüm amacı bilgilendirmedir. Farkları ve benzerlikleri göstermek, seçim sırasında daha bilgili olmayı sağlamak dışında bir amacı yoktur.

Yıllardır duymaktan gına gelen bir soru var: “Kendi oyun motorumu yazabilir miyim?”
Yıllardır bu soruya cevap olarak sormaktan gına gelen bir soru var: “Neden kendi oyun motorunu yazmak istiyorsun?”

Geçtiğimiz yaz tanıştığım, oyun geliştirme piyasasında programcı olarak yer alan bir arkadaşın, İbrahim Arslan‘ın, aynı istekle karşıma gelmesi ile sorduğum soruya aldığım cevap beni oldukça tatmin etmişti: “Oyun yapımcısı bir firmanın varacağı son nokta.”
Haklı buldum kendisini. Hiçbir kısıtlamaya bağlı kalmadan, tamamen kendi isteğiniz üzerine. Ne eksik ne fazla. Frictional Games bu konuda Amnesia ve HPL2 motoru ile devrim yaratarak oyunu motorun üstüne değil, motoru oyunun üstüne kurdu. HPL2’yi Amnesia’yı yapabilmek için yazdı. Şimdi de HPL3’ü SOMA’yı yapabilmek için yazıyor.
Ne güzel, ne âlâ.
Ve sonra yine kendi blogumda aldığım tepki: “Yıl 2011 olmuş halen böyle grafikleri olan oyunlar çıkarıyorlar!”.

Oyun Yapmak ≠ Oyun Motoru Yazmak


Gözlemlediğim kadarıyla en büyük yanılgı bu. İnsanlar sanıyor ki, oyun yapımcıları oyun motoru yazıyor, hatta yazmalı!
Oyun geliştirmeye ilgi duyan herkesin ilk sorusu, oyun motoru nasıl yazılır?
Oyun geliştirme ile ilgili başka bir yazımda da gelen yorumların çok büyük kısmı oyun motoru yazmak üzerine.

Soruyorum: Oyun Geliştirme nedir? Oyun Motoru geliştirme nedir?
Cevaplıyorum: Oyun Geliştirme, konsol veya bilgisayar platformlarında oynanabilir bir son ürün, bir video oyunu geliştirme aşamasıdır. Oyun Motoru geliştirme ise, bu oyunların yapılacağı, oyunun kullanacağı teknolojiyi, oyunun sistem donanımını en verimli şeklinde kullanması için bir köprü olan aracı geliştirmektir.

Soruyorum: İkisinin arasındaki ilişki nedir?
Cevaplıyorum: Bir araba gibi, motor olmadan oyun çalışmayacaktır.

Soruyorum: Ne yapmak istiyorsunuz?

Oyun Geliştirici olmak istiyorsanız işte size analoji:
1) Yazar olmak istiyorsunuz.
2) Ressam olmak istiyorsunuz.
3) Sinema Yönetmeni olmak istiyorsunuz.
4) 2D sanatçı olmak istiyorsunuz.
5) 3D sanatçı olmak istiyorsunuz.
6) …

Oyun Motoru yazmak istiyorsanız karşılıklı analoji:
1) Matbaa makinesi üretmek istiyorsunuz. Yayınevi kurmak istiyorsunuz.
2) Tuval, yağlıboya, fırça üretmek istiyorsunuz.
3) Kamera üretmek istiyorsunuz. Mikrofon üretmek istiyorsunuz.
4) Photoshop, GiMP programlarını yazmak istiyorsunuz.
5) Maya, 3Dmax, Cinema4D programlarını yazmak istiyorsunuz.
6) …

Kapito?
Aradaki fark aslında çok büyük.
Ama ne yazık ki, oyun yapmayı programlamadan ibaret görmekten ileri gelen bir algı, oyun motoru yapmak ile oyun yapmak arasındaki farkı da görmüyor.

Oyunu ve Motoru Aynı Anda Yapmak!

Oyunun tasarımını, modellerini, hatta seslerini ayarladınız. Ne güzel!
Henüz adamakıllı çalışmayan bir oyun motoru ile bu oyunun hiçbir şeyini yapamazsınız.
Oyuna eklemek istediğiniz her özellik için motora yeni bir şey yazmak zorunda kalırsınız.
Oyun yapım aşamasında kolaylaştırmak adına her şey için motora yeni bir şey yazmak zorunda kalırsınız.
Farklı bir platforma geçmek isterseniz bir çok şeyi değiştirmek zorunda kalırsınız.

Sağlam bir yazılım mühendisliği disiplini almadan da bunları yapamazsınız. Bakın, disiplin diyorum, eğitim değil. Yoksa lise mezunu bile olmadığı halde benden kat kat iyi kod yazan abilerim oldu benim bana yol gösteren.

Hazır Oyun Motoru Çok mu İyi?

Hayır.
Hazır oyun motorlarını kullandığınızda da yukarıdakilere benzer sorunlar yaşayacaksınız.
En iyi ihtimalle ilgili motoru nasıl kullanmanız gerektiğini öğrenmek zorundasınız. Başkasının yazdığı bir programı kullanmayı öğreneceksiniz.
Hiçbir hazır oyun motoru her istediğinizi anında şıp diye yapamaz. Değiştirmek, geliştirmek, eklentiler yazmak, kurcalamak zorundasınız kendi oyununuza gerekli olan şekillerde. Kendi içeriğinizi doğru okuması için eklentliler, yeni editör pencereleri, oyununuza özgü eşsiz özellikler… Açıktır ki, kendi motorunuzu yazmak size tüm bu avantajları sağlayacaktır. Ama unutmamanız gereken bir şey var: Geliştirmeden önce ortada çalışan bir motor olması lazım.
Ama ne var ki, mantık döngüsü, oyun nesne modeli, olay döngüsü, kontrol mekanizması, modeli ekrana çizdirme, parçacık efektleri, animasyon olgusu gibi kısımlar bitmeden elinizde bir motor olmaz.

Ne Yapmak İstiyorsunuz?

Oyun yapmak istiyorsanuz, amacınıza yönelik çalışırsınız.
Oyun motoru sadece bir araçtır.
Ankara’dan İstanbul’a gitmek için otobüs, otomobil yapmazsınız. Var olanı kullanırsınız. Amaç bellidir.
Oyun motoru yazmak için harcayacağınız vakti oyunun dizaynında ve yapımında harcayın.

Oyun motoru yapacaksanız eğer…
Motoru lisanslayacak mısınız? Başka firmalara kullanmaları için satacak mısınız? Bir sonraki yeni nesil oyunların yaratılacağı motoru mu yazacaksınız?

Şimdi, düşününce insana kolay geliyor. Hemen OpenGL veya DirectX’te grafik demosu yapayım. Hatta DirectAudio veya OpenAL ile iki ses çakayım. Google’dan üç beş fizik kodu araklayayım. Oha lan ne güzel, bir haftada oyun motoru yazmanın yarısına geldim!
Hadi şimdi memory yönetimine gelelim. RAM’i nasıl kullanacaksın? 32 bit mimaride mi kalacaksın, 64 bite de geçecek misin? Uhh, işletim sistemi değişince kullanman gereken fonksiyonlar ve soyutlamalar değişiyor! Kullanıcı girdisi? Klavye fare? Oyun kumandası? Ya öntanımlı gelen ayarları değiştirmek isterlerse? Animasyonları nasıl oynatacaksın? Dosya sistemi? Kriptolama yapacak mısın? Paket dosyaları runtime sırasında mı açacaksın? Yoksa streaming mi yapacaksın? Dosyaları ram’de mi tutacaksın? Pipelining için ne yapacaksın? Ya ekibin geri kalanları için araçlar? Editör ekranı ne olacak? Level’ları modelleyip modelleyip mi koyacaksın? Ama dinamik objeler ne olacak? Platformlar arası uyumluluk?

Elbette, bunların hepsi yapılabilir. Hatta tek bir kişi bile altından kalkabilir.
Piyasada var olan oyun motorları evrimsel süreç içerisinde kendiliğinden oluşmadı. Onları da insanlar yazdı. Zamanları, amaçları, bilgileri, tecrübeleri, kaynakları, paraları olan insanlar. İster hepsinin arasına ‘ve’ ekleyin, ister ‘veya’.

Hadi diyelim 4 tane çok sağlam yazılımcıyı aldık, 3 ayda güzel bir motor elde edeceğiz dedik. Bu çalışanların maaşı ile alınabilecek motorların kalitesini düşünün bir de. Alacağınız motorlar kendini ispatlamış, tam motorlar; ama 4 yazılımcıdan 3 ayda alacağınız motor sadece bir oyun motorunun prototipi olacak, içinde bir sürü hata barındıracak, eksikleri olacak, optimizasyonu Allah bilir.

EA games olursunuz, para derdiniz olmaz, yaptırırsınız.
Üç beş kişilik bir ekip olursunuz, bırak oyun yapmayı profesyonel bir çalışan tutacak paranız olmaz, hadi oyun motoru yapalım.

Ne zaman oyun motoru yazılır?

1) Zaten elinizde yazdığınız bir motor vardır. Onu geliştirir, günümüz standartlarına veya oyunun amacına göre şekillendirirsinzi.
2) Patronunuz öyle dedi. Bence işi bırakın.
3) Mantığı öğrenmek istiyorsunuz. İşte o zaman ne istediğinizi biliyorsunuz. Kimsenin size dur demesine imkân vermeyin. Deneyin, yazın, görün. Tecrübe edinin.

Ama şunu unutmayın ki birçok firmada oyun yapanlar ile oyun motoru yapanlar farklı takımlardır ve neredeyse hiçbir iletişimleri yoktur. TellTale, Crytek, EA, CapCom, Konami… Benim bildiğim, hem motoru hem oyunu yapan sadece iD Software (o da John Carmack sayesinde) bir de Frictional Games var. Valve’da bile oyunu tasarlayıp inşa eden ekip ile motor üzerinde çalışan ekip yıllardır ayrı. İşte bir ilk zamanlarda aynıydı, onlar da zaten Quake motorunu alıp üzerine bir şeyler eklerken olmuştu.

Kendi amacı için kendi aracını yaratan bir sürü insan var.
Ama, amaca yeterince bağlıysanız ve yeterince iyi araçlar varsa, aracı amaç haline getirmek sizce de yersiz olmaz mı?

17 şey demişler
  1. Döktürmüşsün yine. Dünkü muhabbet üzerine oldukça güzel olmuş. Kalemine (Klavyene(!)) sağlık. Adamlar uçan otomobil icat etmişken oturup tekerleği yeniden icat etmenin pek bir manası yok zaten. Bir kaç ay öncesine kadar benim de kafamı kurcalardı hep bu olgu. Belli başlı kütüphaneler kullanarak ufak oyun prototipleri geliştiriyorum şu sıralar biliyorsun. Bu sayede oyun motoru-oyun mantığını da kavramış oldum. Şimdi gayet memnunum (Bir motor kullan(a)mamın sebebi OpenGL bile desteklemeyen bir ekran kartım olmasından değil tabii ki. Yersen artık)

    Onur Çelik 7 Nisan '14 tarihinde | Cevapla
  2. Gerçekten iyi bir oyun oynadıktan, anime veya film izledikten ya da kitap okuduktan sonra arkasındaki emek fark ediliyor ya hani, bu hale gelmesi için temelin aslında ne kadar kuvvetli olduğu anlaşılıyor ya; işte senin yazıların da bende aynı etkiyi uyandırıyor.

    Teşekkürler.

    Gluskap 8 Nisan '14 tarihinde | Cevapla
  3. kendi motorumu yazmak istiyorum çok zaman alacak belli münkün ama değilmi 15 kişiyiz

    ali sahan 12 Nisan '14 tarihinde | Cevapla
    • Mümkün. Kolay gelsin.

      Tanshaydar 12 Nisan '14 tarihinde |
  4. Bu yazınızla beraber, linkini verdiğiniz diğer yazınızı da okudum ve aklıma bir kaç soru takıldı.

    Meseleye “oyun programcısı” perspektifinden bakarsak eğer, hala “oyun yapmak” için motor kullanmamız en doğru seçenek olur mu sizce? Yoksa bir oyun programcısı adayı olarak, yapmak istediğimiz oyun için gereken altyapıyı sıfırdan kodlamamız, veya varsa daha önceki projelerimizde yazdığımız altyapıları kullanmamız mı bizi bir adım daha ileriye taşır? Neticede üçüncü parti oyun motorlarında yaptığımız programlama, motorun bize sunduğu dillerden biri ile script yazmaktan ibaret. Ve bu bana bir programcının değil, daha çok bir designer’ın işiymiş gibi geliyor. Belki bize oyun programlama konusunda birkaç bir şey öğretebilir evet ama sizce bir oyun programcısını bir adım ileri taşıyabilir mi?

    İtina ile “kendi yazdığımız motor” terimini kullanmaktan kaçındım, çünkü 2D bile olsa, editör destekli, genel kullanıma uygun bir framework ve bir oyun motoru kodlamak, kulağa hiç gerçekçi gelmiyor -tabi bir Jonathan Blow olmadığınız sürece- . Ancak hiç kimse kendi mükemmel Unity klonunu yapmak zorunda değil, bu aşamada proje spesifik düşünüp, yalnızca yapmayı planladığımız oyunun yazılım gereksinimlerini karşılayacak altyapıyı kodlamamız yazdığınız kadar boş bir uğraş mı? Yoksa bize bir şeyler öğreten, dahası bizi lisans masraflarından kurtaran ama en önemlisi oyunumuz için bize gereken esnekliği sağlayan ve bence teknik yeterliliğe sahip herkesin yapması gereken bir şey mi?

    Mert Kasar 6 Ocak '15 tarihinde | Cevapla
    • Merhaba Mert,
      Ciddi ve düzgün bir yorum yazarak soru sorduğun için mutlu oldum.

      Benim yazım daha ziyade “kendi motorunu” yazmak isteyenlere açıklama niteliğinde. Oturup CryEngine veya Unity yazabileceğini sananlar için. Yoksa bir kişi tek başına oyun motoru yazabilir, editör de yazabilir. Burada kaçınılması gereken nokta her şeyi sıfırdan yazmaya çalışmamak. Mesela Thomas Grip, HPL motorunu yazarken grafik kütüphanelerini kendisi sıfırdan yazmadı, hatta OpenGL yerine SDL kullandı.

      Çok spesifik bir proje için genel amaca hizmet eden oyun motoru kullanmak doğru olmayabilir. O noktada belli başlı kütüphaneleri kullanarak motoru yazmak daha doğru olabilir. Ben birkaç defa yeri geldiğinde piyasada var olmasına rağmen ihtiyacımı görmediği için sıfırdan kütüphane yazdım; ama genelde hizmete özel olduğu için paylaşıma açamıyorum. Böyle bir işe kalkışmak zor olsa da, ufuk açacağı ve tecrübe katacağı gayet aşikâr. Ama bunun ne kadar zor olacağı ve ne kadar temelden başlayacağını öngörmek gerekiyor.

      Şöyle bir örnek vereyim. Elinizde tamamen halat mekaniğine bağlı bir oyun var. Geriye kalan her şey trivial. Bu noktada, halat mekaniğini sıfırdan yazıp tüm vakti ona harcamak mantıklı gelebilir; ama halen bahsettiğim rendering, input, memory management vb gibi aşamaları implement etmek gerekiyor. Maalesef piyasada abstract diye tabir edeceğimiz temel kütüphanelerle son kullanıcıya sunulan motorlar arasında bir seviyede ürün yok. En fazla Ogre3D gibi kütüphaneler/frameworkler bulabiliyor insan.

      Ayrıca scripting dili bile olsa, programlama dili programlama dilidir. PHP ve Python da scripting dilleri; ama bu blogun kullandığı ve yorum yazdığım WordPress sistemi de PHP ile yazıldı. Ayrıca yine gameplay ve senaryo kodlaması geniş miktarda kodlama bilgisi ve tecrübesi gerektirir. Designer diye tabir ettiğimiz tasarımcının işi adı üstünde tasarlamak ve belli bir oyun mekaniğini Hello World seviyesindeki programlama bilgisi ile yazmak imkânsızdır. Neticede oyun motoru oyunu kendi kendine yapmıyor, oyunu yapabilmek için bir altyapı sağlıyor. W tuşuna basınca karakterin ne şekilde ileri gideceği, çömelmiş mi, normal durumda mı, yoksa koşuyor mu olduğuna göre ne hızda ilerleyeceği, önünde engel varsa veya bir kutunun üstünden atlama animasyonu oynatılacaksa bunun hangi şartlar altında mümkün olabileceği en âlâ motorda bile oyun programcısının yazmak zorunda olduğu bir durumdur.

      Sonuçta oyun yapmak mutlaka kodlama bilgisi ve tecrübesi gerektirecektir. Eğer vakit ve kaynak sıkıntısı yoksa çok belirli özelliklere sahip bir proje için motor yazımı yoluna gidilebilir; ama ben şahsen Unreal Engine’in kaynak kodlarını alıp onun üzerine yazmayı tercih ederdim. Yine de bilgi ve tecrübe seviyenizi ve projenizin özelliklerini bilmediğim için yazının kendisi gibi bu yorumum da genel amaca hizmet edecektir. Eninde sonunda seçim sizin.

      Tanshaydar 6 Ocak '15 tarihinde |
  5. Kardeşim bana bi ulaşır mısın ister ara ister mesaj at 0531 396 80 70

    ismail 12 Haziran '16 tarihinde | Cevapla
  6. araba benzetmenizi beğendim 🙂

    husreVa 28 Aralık '16 tarihinde | Cevapla
    • Çok popüler bir analojidir oyun geliştirme dünyasında, ben sanırım ilk defa bu yazımda kullanma gereği duydum.

      Tanshaydar 28 Aralık '16 tarihinde |
  7. Pazarlamacıyım, ben sadece oyun oynarım arada bir hiç alakam olmamasına rağmen google da program yazdım sizin sayfada çıktı okudum ilginç bir konu (benim için) başarılar dilerim =)))) Saygılar takipteyim…

    Ery 16 Mayıs '17 tarihinde | Cevapla
    • Bir faydam dokunduysa ne mutlu bana 🙂

      Tanshaydar 17 Mayıs '17 tarihinde |
  8. Merhaba yazınız gayet açıklayıcı ve güzel olmuş.
    Gerçekten oyun motoru yazmayı kolay bir iş sananlar var. 🙂
    Eğer gerçekten tek başlarına Unity,Unreal vb. oyun motorlarını,
    yazabileceğini düşünüyorlarsa vah hallerine. En basit bir oyun motorunda bile physics olaylarında zorluk çekilebilecektir. Size bir soru soracağım ben lise 2 öğrencisiyim. Ve Yazılım Mühendisliği düşünüyorum ve oyun programlama üzerine uğraşacağım ve araştırdığım kadarıyla C++ ile oyun yapılabiliyor. C++ hakkında biraz bilgim var hatta reverse engineering üzerine çalışmalar yapıyordum. Sizce direk C dilini mi öğreneyim yoksa direk C++ mı öğreneyim ? C++ C’nin OOP versiyonu bildiğim kadarıyla…. Şimdiden yorumunuz için teşekkürler. 🙂

    Kaan 1 Aralık '17 tarihinde | Cevapla
    • Dunning-Kruger etkisi en çok Türkiye’de kendini gösteriyor zaten.

      Programlama dili öğrenme konusunda bence C ile başlamak en uygunu. Modern dillerin hepsi C üzerine kuruludur ve C bilen biri tüm dilleri öğrenip hâkim olabilir.

      Ne var ki, pointer mantığı C’yi oldukça zorlaştırıyor. O yüzden hemen bir sonuç görmek istiyorsanız, Python ile başlayıp PyGame kütüphanesi ile küçük bir oyun yapabilirsiniz.

      Bir noktadan sonra programlama dilinin ne olduğu önemini kaybedecektir, o yüzden istediğiniz şey hemen sonuç görmek mi, yoksa uzun vadede programlama dillerine hâkimiyet sağlamak mı, ona karar verip, verdiğiniz kararar göre hareket etmeniz yerinde olacaktır.

      Tanshaydar 2 Aralık '17 tarihinde |
  9. Güzel yorumunuz için teşekkürler. Ayrıca White Night projenizde güzel bir proje olmuş. 🙂
    Genelde herkes hemen sonuç almak ister. Ben şöyle düşünüyorum aslında;
    C dilini öğrenirken aynı zamanda Unity ile de çalışmayı planlıyorum fakat şöyle bir problem var ne yazık ki model sıkıntısı çekeceğim gibi 🙁 Modelleme konusunda pek fazla bilgim yok ki bunun yanında assetler genelde pahalı.
    Birde ben Muhammed Mastar’ın C++ derslerini indirmiştim. C yerine direk C++ ile başlasam sıkıntı olur mu ? Yani C ile başlamanın bir artısı varmıdır ? Bu arada dediğiniz gibi şu pointerlar bayağı zor.

    Kaan 2 Aralık '17 tarihinde | Cevapla
    • Bilkmukabele 🙂

      Profesyonel işlerde modelleri özel yaptırmak gerekir; ama küçük çaplı bir projede Asset Store’da var olan birçok ücretsiz model paketi kullanılabilir. Yalnız, Unity’de programlama C# ile yapılıyor, C ve C++’tan oldukça farklıdır.

      C++, C’den çok daha yüksek seviyede bir dil. Elbette ki C++ ile de başlanabilir, zira pointer mantığı aynı şekilde devam ediyor; ama C++ nesne yönelimli bir dil. Eğer imkânlar ve kolaylıklar C++ yönündeyse öyle de başlayabilirsin. Oradan yine diğer dillere geçilebilir. Sözgelimi bir Python’dan daha düşük seviyeli dillere geçiş daha zor.

      Tanshaydar 4 Aralık '17 tarihinde |
  10. Aynen haklısın kardeşim, özellikle oyun motoru yazmanın analojisinde.. hep birşeyleri yapmak için önce üretmek istemişimdir.

    Soner 8 Aralık '17 tarihinde | Cevapla
    • İkisi de kendi içinde güzel şeyler ve ikisi de istenilebilir; ama amaç ile aracı farklı tutmak gerekiyor.

      Tanshaydar 14 Aralık '17 tarihinde |

Söz uçar yazı kalır