“0–60 fps tam performans almak için Unity3D kullanarak oyununuzu optimize edin! “

Pürüzsüz frame hızının temelleri üzerine pürüzsüz bir oyun kurulabilir ve standart iPhone ve iPad cihazlarda saniyede 60 kareye ulaşan önemli bir hedeftir.
Aşağıda, performansı artırmak ve yoğun optimizasyon denetlemeleri sırasında hedeflenen frame hızına ulaşmak için oyunda göz önünde bulundurmanızı ve değiştirmek zorunda olduğunuz adımların ve özelliklerin özetini yazmaya çalıştım.
Temel oyun işlevleri yerine getirildikten sonra, oyun performansının hedefine ulaştığından emin olma zamanı geldiğinde, Performansı ölçmek için ana aracımız, Unity profiler ve Xcode profiler araçlarıdır. Unity profiler kullanarak çalışan kodun cihaz üzerinde profilerı ve performansını görebilmek paha biçilemez bir özelliktir.
Yazmış olduğum özette ve bu yoğun ölçümlerde ince ayar ve tekrar ölçüm kontroller sonucunda iyi sonuç veren ve hedef cihazlar için sabit 60 fps performanası ile sonuçlandığını söylemek isterim.

1- Garbage Collector olarak adlandırılan canavarla başa çıkmak.
C / C++ oyun programlama arkaplanından geldiğimizde, Garbage Collectorın özel davranışlarına alışkın değiliz. Kullanılmayan hafızanızın sizin için otomatik olarak temizlendiğinden emin olmak ilk başta iyi ama gerçekte kısa bir süre sonra başlıyor veGarbage Collectodan kaynaklanan CPU yükünü, Garbage Collectoın neden olduğu garbage hafızasının toplanmasıyla ilgili düzenli sorunlara şahit oluyorsunuz. Bu özellikle mobil cihazlar için büyük bir sorun olduğunu gördüm. Bellek tahsisatlarını takip etmek ve onları ortadan kaldırmak için çabalamak öncelikli bir numaralı işiniz olmalı ve bu sorunlarla alakalı adımlar aşağıda.

1- Herhangi bir dize birleştirmeyi ( string concatenation) koddan kaldırın, çünkü bu, GC’nin toplanması için çok fazla çöp bırakır.

2- “Foreach” döngülerini basit “for” döngülerle değiştirin. Bazı nedenlerden dolayı, her “foreach” döngüsünün her yinelemesi, 24 Byte garbage belleğini oluşturdu. 10 kez yinelenen basit bir döngü, bellekten 240 byte yıyor bu kabul edilemez hale geliyor.

3- Oyun nesne tag’leri için kontrol ettiğimiz yolu değiştirin. “If (go.tag ==“ Enemy ”) yerine“ if (go.CompareTag (“Enemy”) ”kullanın. Bir nesnede tag özelliğini çağırmak, ek bellek ayırır ve kopyalar. Bir de böyle bir kontrol bir iç döngüde (inner loop) bulunuyorsa bu gerçekten kötüdür.

4- Object Pooling harikadır, tüm dinamik oyun nesneleri için havuzlar(pool) hazırlayın ve kullanın, böylece hiçbir şey hiçbir zaman oyunun ortasında zamanın ortasında dinamik olarak tahsis edilmez ve her şey ihtiyaç duyulmadığı zamanda havuza geri gönderilir.

5- LINQ komutlarını kullanmayın bunlar GC için sorun.

2- Yüksek düzeyde komut dosyaları ve yerel motor (natıve engıne )C ++ kodu arasındaki iletişim yüküne dikkat edin.

Unity3D kullanarak bir oyun için yazılan tüm oyun kodları, Mono çalışma zamanı kullanılarak ele alınan C# kod dosyasıdır. Engine kodları ile iletişim kurmak için herhangi bir gereksinim yüksek düzeyde kodlama dilinden yerel motor koduna bir çağrı gerektirecektir. Bu da doğal olarak elbette kendi genel yüküne sahiptir ve oyun kodunda bu tür çağrıları azaltmaya çalışmak ikinci önceliktir.

1- Sahnedeki nesneleri hareket ettirmek yazdığımız komut kodundan motor koduna yapılan çağrıları gerektirir ve oyun kodundaki bir frame sırasında bir nesne için dönüşüm gereksinimlerini önbelleğe alın ve çağrı yükünü azaltmak için talebi yalnızca bir kez motora gönderin zaten önbelleğe alırsanız yapacağınız çağrılar bir kez gider. Bu model, bir nesneyi taşımak ve döndürmek için ihtiyaçlar dışında başka benzer yerlerde kullanılabilir.

2- Component referansların önbelleğe alınması, bir component nesnesindeki “GetComponent” yöntemini kullanarak bir Component başvurusunu alma gereksinimini ortadan kaldırır; bu, her defasında yerel motor koduna yapılan bir çağrı için başka bir örnektir.

3- Fizik (Physics)

1- Fizik simülasyon zamanını mümkün olan en düşük seviyeye ayarlamak. Mesela 16 milisaniye

2- Karakter kontolü çağrıları azaltma komutları yazın. Karakter kontolünü hareket ettirmek her çağrıda önemli bir performans maliyeti olabilir. Yapmanız gereken frame başına hareket isteklerini önbelleğe almak ve sadece bir kez uygulamak.

3- Zayıf cihazlar için Unity cloth kullanın. Cloth parametreleri performansta da önemli rol oynayabilir ve estetik ile performans arasındaki uygun dengeyi bulmak için biraz zaman harcayabilir.

4- Kullandığınız Ragdoller, fizik simülasyon döngüsünün bir parçası olmadıkları ve sadece gerektiğinde etkinleştikleri için devre dışı bırakmanızda yarar var.

5- “OnInside” trigger callbackleri dikkatli bir şekilde değerlendirilmesi gerekir ve mantığı mümkünse iyi modellenmelidir.

6- Tag yerine Layer! Layerlar ve etiketler, nesnelere kolaylıkla atanabilir ve belirli nesneleri sorgulamak için kullanılabilir, ancak, layerların mantıkla çalışması söz konusu olduğunda, layerların en azından performans açısından kesin bir avantajı vardır. Daha hızlı fizik hesaplamaları ve daha az istenmeyen yeni ayrılmış hafıza temel nedenlerdir.

7- Mesh Collider kullanmayın!!!

8- Genel olarak Ray Cast ve Sphere kontrolleri gibi çarpışma tespit isteklerini en aza indirin ve gerekirse kendi kontrollerinizi ile daha fazla bilgi almaya çalışın.

4- AI kodunu daha hızlı yapalım!

Ana ninja karakteriniz olduğunu düşünün ve karakterinizi engellemeye ve onunla savaşmaya çalışan düşmanlara yapay zeka kullandığınızı varsayın ki öle olmalı. AI performans sorunları ile ilgili olarak aşağıdaki konuların ele alınması gerekiyor.

1- Görünürlük kontrolleri gibi AI mantığından birçok fiziksel sorgu üretiliyor. AI güncelleme döngüsü, CPU yükünü azaltmak için grafik güncelleme döngüsünden çok daha düşük bir değere ayarlanabilir.

5- En iyi performansı hiç kod yazmadan elde edebilirsiniz!

Hiçbir şey olmadığında, performans iyidir. Bu, şu anda gerekli olmayan her şeyi denemek ve döndürmek için temel felsefeydi. Diyelim ki oyunumuz bir yan kaydırma (paralax) oyunudur ve bu yüzden dinamik seviye nesnelerinin çoğu sahnede görünmediklerinde kapatılabilir. (Sahnede görünmeyen neseneleri yüklememek)

1- Düşman AI, özel bir script yazarak uzakta olan ve karakterle alakası olmayan düşmanları kapatın.

2- Hareketli platformlar, tehlikeler ve onların fizik çarpışmaları uzaktayken kapatın.

3- Oluşturulmayan nesnelerdeki animasyonları kapatmak için Unity “animation culling” sistemi kullanarak yapabilir ve kapatabilirsiniz.

4- Aynı kullanılan Partikül sistemini tüm levellarda ve kullanılan tüm mekanizmalarda disable edin.

6- Callback’ler

Unity callbacklerini mümkün olduğunca azaltılması gerekiyor. Boş callback aramalarda bile performans cezaları var. Boş callback aramalara sahip olmanın bir nedeni yoktur, size yeniden kod yazdırırlar performans yüzünden boş callback yerine çareler bulun.

7- Artistler sizi kurtarabilir

Sanatçılar, artistler programıcının en sıkıntılı zamanında her zaman sihirli bir şekilde yardımcı olabilirler.

1- Doku atlası(Texture atlases) özellikle UI elemanları için çok yardımcı olur.

2- Square textur’lar ve uygun sıkıştırma ile ikisinin gücü bir zorunluluktur.

3- Gereksiz vertexleri silmelisiniz.

4- Levellara göre texture’ları düzenlemeleri, özellikle farklı çözünürlüklere sahip cihazlarda iyi bir frame hızına sahip olmak için iyi bir karar.

5- Meshleri birleştirmek, tasarımcıların bir başka performans dostu eylemidir.

6- Animatörler animasyonları mümkün olduğunca performanslı ve parçalı hale getirmeliler.

7- Estetik / performans dengesini bulmak için partikül efektlerinde çok fazla iterasyon gerekir. Bunları performanslı hale getirmek güç olsada bunun yollarını arayın.

8- Bellek kullanımının azaltılması gerekiyor!

Elbette çok fazla bellek kullanmak performansla ilgili olumsuz etkilere sahiptir, ancak bazı durumlarda iPod’larda bellek sınırlarının aşılması nedeniyle çok fazla sorun yaşanır. Genelde oyunlarda en büyük hafıza tüketenler texturelar olur. Yukarıda verdiğim örnek oyunda da performasn tüketen yine texturelardır.

1- Farklı cihazlar için farklı doku(texture) boyutları kullanılması gerekir özellikle UI’de ve büyük backgorundlarda kullanılan dokular için. Bence her oyunda zorunlu değil ama evrensel bir yapı kullanılması çok iyi olur, oyuna girerken cihaz boyutu ve çözünürlüğü algılandıktan sonra farklı assetler yüklenir.

2- Kullanılmayan assetlerin hafızada yüklü olmadığından emin olmalıyız. herhangi bir assetin belleğe tamamen yüklendiğini öğrenmeniz gerek.

3- Meshlerden ekstra polygonları kaldırın silin.

4- Bazı assetlerin lifecycle yönetimini birkaç kez yeniden yapılandırmanız gerekebilir. Örneğin, ana menü öğeleri için load / unload süresinin veya level assetlerinin veya oyun müziğinin sona ermesinin ayarlanması gibi.

5- Her bir levelın kendi object poolu dinamik nesne gereksinimlerine uyarlanması ve en az bellek gereksinimi için optimize edilmesi gerekir.

6- Ses dosyalarını sıkıştırılmış halde tutmak gerekir.

Oyun performansının artırılması uzun ve zorlu bir yolculuktur ve her oyun için performans iyileştirmeleri farklıdır ben genel ve ilk aşamada gerekli olanları yazmaya çalıştım sizlerde kendi oyunlarınızda tecrübe ederek performans iyileştirmeleri için detaylar ve ince noktalar bulabilirsiniz. Oyun geliştirme toplulukları tarafından paylaşılan çok miktarda bilgi ve Unity tarafından sağlanan çok verimli ve değerli makaleler var araştırarak bunlar erişebilirsiniz.

Yazıda eksikleri var ise veya eklenmesi gerektiğini düşündüğünüz bilgiler varsa konuşabilir ve tartışabiliriz. 🙂

Unity3D İle Virtual Reality (VR) Uygulama Geliştirmek

Sanal Geçeklik Nedir (Virtual Reality Nedir)?

3D gozluk takarak ve bunun içinde cam mercekler sayesinde aktarılan görüntüyü hareketli veya hareketsiz ortamlar için VR ile gerçekçi üç boyutlu ortamları deneyimlemenizi sağlar.Eviniziden çıkmadan, zombileri vurabilir, bir roller coaster’a binebilir 360 derece videolar izlerken bir pilot olabilir veya ve bir gemi kaptanı gibi yerinizden rotanızı izleyebilir, dalgıçlık yaparak okyanusların derinliklerini keşfedebilir, VR ile geliştirilmiş üst düzey oyunlar oynayabilir mobil cihazınızdan uygulamalar indirip test edebilirsiniz Okumaya devam et Unity3D İle Virtual Reality (VR) Uygulama Geliştirmek

Unity3D İle Augmented Reality (AR) Uygulama Geliştirmek

Augemented Reality (Artırılmış Gerçeklik) Nedir?

 

 

Bazı teknolojiler vardır ne yazarak açıklanabilir ne de anlatarak bunlardan biri ise Augemented Reality, Kısaca tanımlamak gerekirse temel olarak artırılmış gerçeklik sanal nesnelerin gerçek görüntü üzerine bindirilmesi anlamına gelmektedir. Bir artırılmış gerçeklik gözlüğü veya akıllı cihazların kameraları vasıtasıyla bakılan her hangi bir ortamda, işaretçinin tanınması ile ekrana önceden tanımlanmış obje veya objelerin basılması işlemi ile artırılmış gerçeklik sağlanmış olur. Fikri ve temelleri 1900’lü yılların başında atılan “Artırılmış Gerçeklik”, esas ivmesini 90’lı yıllarda yakaladı. Son olarak 2013’te Google’ın “Google Glass” beta versiyonunu tanıtması ile artırılmış gerçeklik günlük hayata girme sinyallerini verdi. Okumaya devam et Unity3D İle Augmented Reality (AR) Uygulama Geliştirmek

Oyun Programlamak mi Istiyorsunuz?

E-mail ile sık sık tavsiye isteyen ve oyun sektorunde calismak isteyen arkadaslar ve ogrenciler var bende bu yaziyla beraber neler yapilmasi gerektigini, neler calisilmasi gerektigini, neler ogrencilmesi gerektigini nacizane tavsiyelerimi ve onerilierimi anlatacagim. Tum oyun sektoru icin cevap veremem fakat baslangic icin neler isteniyor ve hangi bilgiler bekleniyor okudugum makalelerden ve yurtdisinda calisan arkadaslarimdan faydalanarak bu yaziyi yaziyorum.

Uzun bir sure önce, Universite ogrencilerine ve game developer olmak isteyen ogrenciler icin makale yayinlandi. Makalenin linki Okumaya devam et Oyun Programlamak mi Istiyorsunuz?

Nasil Oyun Yapabilirim?

Nasil oyun yapabilirim veya oyun yapmaya ve gelistirmeye nereden baslamaliyim? Soruları sıklıkla soruluyor bu gibi konuları konuştuğumda sıkça rastladıgım dusunce “Ben  Call of Duty / Everquest / MıneCraft . Clash of Clans ve benzeri bir oyunları nasıl yapabilirim? Bu oyunların her biri sonsuz karmaşık sistemlerden oluşmaktadır ve deneyim, tecrube, zaman gerektiren oyunlardır. Bu tur oyunlari yapmak icin kucuk oyunlarla ve adım adım başlamak gerektiğini düşünüyorum böylelikle daha sağlam bir temel ve bilgi birikimi olacaktır. Oyun programlamaya baslamadan once makaleler, kitaplar, oyun ornekleri, ornek kodlar, oyun mantiklari gibi bilgiler okuyarak baslamakta yarar var. Okumaya devam et Nasil Oyun Yapabilirim?