Kapanış Notları

Bu son bölümde, OpenGL ile yalnızca teknik demoların ötesine geçerek gerçek bir şeyler üretmenin nasıl bir deneyim olduğunu görmüş olduk. Baştan sona tam bir 2D oyun geliştirdik ve düşük seviyeli grafik kavramlarından nasıl soyutlama yapabileceğimizi, temel çarpışma algılama tekniklerini nasıl kullanacağımızı, parçacıklar oluşturmayı ve ortografik projeksiyon matrisinin pratik bir kullanım senaryosunu öğrendik. Tüm bunları, önceki bölümlerde işlediğimiz kavramları bir araya getirerek gerçekleştirdik. Bu bölümde yeni ve heyecan verici OpenGL teknikleri öğrenmedik belki ama şimdiye kadarki bilgileri daha büyük bir sistemin parçası olarak nasıl birleştirebileceğimizi deneyimledik.

Breakout gibi basit bir oyun, binlerce farklı yöntemle geliştirilebilir. Bizim kullandığımız yaklaşım, bu yöntemlerden sadece biri. Oyun karmaşıklaştıkça, daha fazla soyutlama ve tasarım deseni uygulamaya başlarsınız. Bu konular hakkında daha fazlasını öğrenmek isterseniz, Game Programming Patterns adlı harika sitede pek çok kaynak bulabilirsiniz.

Unutmayın: son derece temiz ve mükemmel düşünülmüş bir oyun kodu yazmak genellikle çok zordur (hatta çoğu zaman imkânsıza yakındır). Oyununuzu o an size en doğru gelen şekilde geliştirin. Video oyunu geliştirme pratiği yaptıkça, problemleri çözmek için yeni ve daha iyi yöntemler öğrenirsiniz. “Mükemmel kod yazmalıyım” baskısına kapılıp motivasyonunuzu kaybetmeyin — yazmaya devam edin!

Optimizasyonlar

Bu bölümlerde ve geliştirdiğimiz oyunda odak noktamız, konuları olabildiğince basit açıklamak oldu; bu nedenle optimizasyona yönelik pek çok detay bilerek atlandı. Ancak, kare hızınız düşmeye başladığında kullanabileceğiniz modern 2D OpenGL optimizasyonlarından bazıları şunlardır:

  • Sprite sheet / Texture atlas: Her sprite için ayrı bir texture kullanmak yerine, tüm gerekli texture’ları büyük bir texture atlasında birleştirip, uygun koordinatlarla sadece bir tanesinden parça seçeriz. Texture değiştirmek maliyetlidir; sprite sheet kullanımı bu değişimleri azaltır ve GPU’nun texture’ları önbelleğe almasını kolaylaştırır.

  • Instanced rendering: Her dörtgeni (quad) ayrı ayrı çizmek yerine, hepsini bir arada toplar ve yalnızca tek bir draw call ile çizeriz. Çünkü tüm sprite'lar aynı vertex'lerden oluşur, sadece model matrisleri farklıdır. Bu matrisleri instanced array içinde geçirerek performansı ciddi şekilde artırabiliriz. Parçacıklar (particles) ve yazı karakterleri için de kullanılabilir.

  • Triangle strips: Her quad'ı iki üçgenle çizmek yerine, sadece 4 vertex kullanarak GL_TRIANGLE_STRIP ile çizebiliriz. Bu, GPU’ya gönderilen veri miktarını %33 oranında azaltır.

  • Alan bölme algoritmaları (space partitioning): Çarpışma kontrolü sırasında, topu sahnedeki her bir tuğla ile karşılaştırmak verimsizdir. BSP, Octree, k-d tree gibi algoritmalarla sahneyi küçük bölgelere ayırıp, topun bulunduğu bölgedeki nesnelerle sınırlı çarpışma kontrolü yapılabilir. Breakout gibi küçük bir oyun için fazla olabilir ama büyük oyunlarda ciddi performans kazancı sağlar.

  • Durum değişimlerini en aza indirin: Texture bağlamak veya shader değiştirmek gibi işlemler OpenGL’de pahalıdır. Bu nedenle, mümkün olduğunca az state değişimi yapılmalıdır. Bunu başarmak için bir state manager yazıp, mevcut durum zaten doğruysa yeniden ayar yapmayı önleyebilirsiniz. Ayrıca tüm çizilecek nesneleri, shader veya blend modu gibi ortak özelliklerine göre sıralayıp art arda işleyerek gereksiz değişimleri önleyebilirsiniz.

Bu ipuçları, 2D oyunlarınızın performansını artırmak için ileri düzey teknikler hakkında size fikir verebilir. Aynı zamanda size OpenGL’in ne kadar güçlü bir araç olduğunu da gösterir: çünkü tüm süreci kendiniz kontrol ettiğiniz için, aynı zamanda optimizasyon üzerinde de tam kontrol elde etmiş olursunuz. Eğer Breakout’un performansından memnun kalmadıysanız, buradaki teknikleri birer alıştırma olarak uygulamayı deneyebilirsiniz.

Yaratıcı Olun

Artık OpenGL ile basit bir oyun geliştirmenin nasıl bir süreç olduğunu gördüğünüze göre, kendi grafik ya da oyun uygulamalarınızı geliştirmeniz sizin elinizde. Şimdiye kadar öğrendiğimiz birçok teknik —sprite çizme, çarpışma algılama, postprocessing, yazı çizimi ve parçacıklar— çoğu 2D (hatta 3D) oyunda da kullanılabilir.

Bundan sonrası size kalmış: bu teknikleri istediğiniz gibi birleştirin, değiştirin, geliştirin ve kendi oyunlarınızı yaratın.

Last updated

Was this helpful?