Fortnite

Fortnite'ın Android'e Çıkışı Üzerine Teknik Altyapı Blogu

06.09.2018
Yazar: Fortnite Ekibi

GİRİŞ

9 Ağustos tarihinde, Samsung’daki ortaklarımızla seçtiğimiz bir dizi cihaz için Fortnite’ın Android Betası’nı piyasaya sürmüştük. Birkaç gün sonra, pek çok telefon üreticisine ait Android cihazların sahiplerine davetiyeler göndermeye başladık. Beta etkinliğimiz sayesinde performans, güvenlik, cihaz uyumluluğu ve Fortnite Yükleyicisi’nin Android’de Fortnite deneyimini sunma kalitesine dair pek çok şey öğrendik. Şimdi birlikte beta başlangıcı ardındaki teknik detaylardan, üzerinde çalıştığımız şeylerden ve Android’i yakın gelecekte gördüğümüz yerden bahsedeceğiz.  

İSTATİSTİKLER

Fortnite’ın Android için piyasaya çıkmasından sonra geçen 21 günde, ilgi muazzam ölçüde yüksekti. 23 milyondan fazla oyuncu Android betasına katıldı, 15 milyondan fazla oyuncu uygulamamızı yükledi.  Android için hâlâ davetlilere açık aşamada olsak da, oyunculara davetlerimizi iOS betasında yaptığımıza benzer bir şekilde keserek oyunu herkese açacağız. 
 

DONANIM, OPTİMİZASYON 


Teknoloji Alanındaki Gelişmelere Giriş

Platformlar arası oynanışı desteklerken, aynı oyunu tüm platformlar için piyasaya sürmek bizim için pek kolay olmadı. Çoğunlukla, bir oyunu mobil cihazlara uygun hale getirmeye çalışırken, içeriği ve hatta dizaynı bile, platformun performans sınırlamaları dahiline sığdırabilmek için basitleştirmeniz gerekir. Örneğin, cisimleri kameraya yaklaştırarak çizim taleplerinin sayısını azaltabilirsiniz. Fortnite’ta, Android oyuncuları PC ve konsollarda oynayan arkadaşlarıyla aynı maçta olabiliyorlar. Bu yüzden oynanışa etki eden hiçbir şeyi oyundan kaldıramazdık.

Android’de Piyasaya Çıkış Hikâyesi

2018 Ocak ayından bu yana önemli bir ekiple Fortnite Battle Royale’in Android sürümü üzerinde çok sıkı çalışıyoruz. Her ne kadar Android’de Fortnite’ı mümkün kılmak için yaptığımız çalışmaların büyük kısmını görselleştirme performansına, dengeliliğine ve bellek kullanımına ayırmış olsak da, Android cihazların donanım, işletim sistemi sürümleri ve sürücü çeşitleri aşmak zorunda olduğumuz en büyük sorundu.

İş ortaklarımızla birlikte çalışmak bu anlamda Fortnite’ı Android’e getirmek için son derece önemliydi. Onların bilgileri, uzmanlıkları ve çalışkanlıkları olmadan, bunların hiçbiri mümkün olamazdı.

Samsung cihazlar için Fortnite’ın profillendirilmesi ve optimizasyonu için, Samsung’la birlikte sıkı çalıştık. Samsung, Epic’in dünyanın her yerindeki birçok ofisine mühendislerini göndererek optimizasyon, performans analizi ve özellikle de Vulkan görüntü işleyicisi üzerinde yapılacak kod değişiklikleri alanında mühendislerimizle doğrudan çalıştı. Özel tasarımlı test telefonları ve sahip oldukları kurum içi mühendislik araçlarıyla, performans ve bellek konularında karşılaşacağımız engeller ve bu engellerin aşılması için yapmamız gerekenler hakkında bize çok yardımcı oldular. Ayrıca, Samsung telefon kullanıcıları için en zahmetsiz ve güvenli yükleme yöntemini yaratmak için de Samsung’la birlikte çalıştık.

Google’ın mühendisleri de bizi ofisimizde ziyaret ederek Fortnite’ı profillendirmemize, optimize etmemize, önemli optimizasyon problemleri ve bir bellek sızıntısını tespit etmemize ve Android’de OpenGL için sağlıklı bir kare hızı tasarlamamıza yardım ettiler. Google’daki Android mühendisleri son derece yetenekli insanlar. Android ekosistemini oyunculuk için harika bir hale getirmek konusunda tutkuyla çalışıyor, sistemlerini sürekli olarak geliştiriyorlar.

Ek olarak, Fortnite’ı denemek ve optimize etmek için ARM, Qualcomm, Imagination Technologies, Razer, HiSilicon ve pek çok başka firmanın da aralarında olduğu birçok başka ortağımızla da birlikte çalışma fırsatı bulduk.
 

Cihaz Desteği

Android ekosistemi pek çok farklı üreticinin imzasını taşıyan telefonlardan oluşur. Tüm telefonlar bir Yongada Sistem devresi üzerine tasarlanır. Bu devre tümleşik olarak bir işlemci ve grafik işlemci yapılandırması içerir. Şu anda desteklenen cihazların %71’ine güç veren, Adreno grafik işlemcili Qualcomm Snapdragon ve ARM Mali grafik işlemcili Samsung Exynos, MediaTek MT serisi, HiSilicon Kirin gibi yaygın olarak kullanılan pek çok Tek Yongada Sistem ailesi vardır. Her cihaz Android’in hafifçe değiştirilmiş bir sürümü yüklü olarak gelir ve pek çok üretici zamanlayıcı ve güç yönetimi gibi yazılımları özelleştirmeyi tercih eder. Aynı grafik işlemciye sahip cihazlar da farklı grafik sürücüleri yüklü olarak gelir. Özetle, aynı donanım altyapısını paylaşan cihazlar farklı performans niteliklerine sahip olabilir ve farklı yazılım hatalarına maruz kalabilir.

Android‘in yeni sürümünün en fazla 2 yıllık cihazlarda beklediğimizden de büyük bir hızla yayılması bizi hem mutlu etti, hem de şaşırttı. Daha yüksek sistem gereksinimlerine sahip Beta sürümümüzü deneyen Fortnite oyuncularının %92’den çoğunun Android 8 (Oreo) veya daha yeni bir sürüm, yaklaşık %8’inin Android 7 (Nougat) ve %0,5’ten az bir kısmınınsa 2015 veya öncesinde çıkmış bir Android sürümü kullandığını görüyoruz. En az 2 yıllık cihazlarda yeni Android sürümlerinin kullanımında inanılmaz bir düşüş mevcut. Bu cihazlar için üreticilerin özelleştirilmiş güncellemeler yayınlaması ve pek çok durumda dünya çapında çeşitli servis sağlayıcılarla birlikte çalışarak güncellemelerini geliştirip kullanıcılara sunmaları gerekiyor.

Bu karmaşayı kontrol altına alabilmek amacıyla Unreal Engine’da basamaklı cihaz profil sistemi kullanıyoruz. Öncelikle dört performans profili oluşturarak başlıyoruz: Düşük, Orta, Yüksek ve Destansı. Bu profiller, oyun motorunda bulunan ölçeklenebilirlik ayarlarını düzenleyerek oyunun farklı performans niteliklerine sahip cihazlarda çalışabilmesine olanak sağlıyor. Düşük profil, görüş uzaklığını olabildiğince azaltır ve tüm isteğe bağlı görüntü ayarlarını devre dışı bırakıyor. Destansı profilse gölgeler, yeşillikler ve son model cihazlarda çalışabilecek en yüksek görüş uzaklığı gibi tüm özellikleri etkinleştiriyor.

Bunun yanında Adreno 54x ve Mali G72 gibi bir dizi grafik işlemci profillerimiz bulunuyor. Bu grafik işlemci profilleri cihazdaki donanıma en uygun performans profilini seçmenin yanı sıra telefondaki donanıma uygun iyileştirmeleri ve çözümleri etkinleştirebilmemizi sağlar. Son olarak, Samsung Galaxy Note 9 Adreno ve Google Pixel 2 XL gibi cihaza özel profillerimiz de var. Bu son cihaz profili katmanı gerekli yerlerde cihaza özel daha fazla çözüm ve iyileştirme sunabilmemizi sağlıyor. Hangi cihaz profilinin kullanılacağını belirlemek için Fortnite açılırken cihaz modeli, işletim sistemi sürümü ve grafik sürücüsü sürümü gibi özellikleri inceliyoruz.
 

Görüntü Oluşturma Performansı

Görüntü oluşturma esnasında işlemci kullanımı, stabil bir kare hızı elde etmemizin önündeki en büyük engeldi. Android üzerinde grafik sürücüsünde harcadığımız işlemci süresi PC, konsol ve iOS platformlarına oranla çok daha fazla. Galaxy S9’un Adreno sürümü gibi Android cihazlar kare başına 1500’den fazla çizim talebini cevaplayabilirken eski cihazlar bunun çok daha azını yapabiliyor. Desteklediğimiz orta segment cihazlar ortalama 600, düşük özellikli cihazlar ise yaklaşık 400 çizim talebi cevaplayabilmeliler.

Kare başına oluşturulacak nesne sayısını bu sene başında iOS’a geliştirme yaparken zaten oyun deneyimini etkilemeyecek en düşük seviyeye indirmiş olduğumuzdan başka özellikler üzerine yoğunlaştık. Çizim taleplerini dinamik olarak, örneklenen çizim taleplerine harmanlamayı denedik. Bazı kazanımlar elde edebilmemize rağmen sağladığı avantaj, oluşturduğu karmaşık kod yapısına değmezdi.

OpenGL görüntü oluşturucu üzerinde yaptığımız iyileştirmeler bize ufak kazanımlar sağlasa da en büyük kazanımlarımızdan biri olan öykünmüş tekdüzen arabellekler, bellek optimizasyonlarımızın bir parçası olarak ortaya çıktı ve bizi de şaşırttı. Sabit arabellekler olarak da bilinen bu özellik, aslında UE4’ün yıllardır desteklediği ve tekdüzen arabellekleri desteklemeyen OpenGL ES2 cihazlarda kullanılan bir kod yoluydu. Nasıl işlediğine bir bakalım. Gölgelendirici derlemesi süresinde gölgelendirici için gereken tüm değişmezleri tespit ediyoruz ve onları gölgelendiricinin okuyacağı bir diziye paketliyoruz. Aynı zamanda oyun motoruna değişmezleri tekdüzen arabelleklerin neresinden çekeceğini ve değişmezler dizisinde nereye yerleştireceğini gösteren bir eşleme tablosu sunuyoruz. İşleyiş esnasında tekdüzen arabellekleri işlemcinin erişilebilir belleğinde tutuyor, eşleme tablosu kullanarak geçici bir arabelleğe kopyalıyor ve tek bir glUniform4fv fonksiyon çağrısıyla tüm değişmezleri yüklüyoruz.

Şanslıydık ki öykünmüş tekdüzen arabellek kod yolu, grafik sürücüsünde harcadığımız süreyi büyük ölçüde azalttı. Sürücünün de kendi içinde benzer bir işlem yapıyor olması ve bizim uygulamamızın iş yükümüz göz önünde bulundurulduğunda daha hızlı çalışıyor olması da ihtimal dahilinde. Aynı zamanda daha az kaynak oluşturup bağladığımız için sürücü bu arabelleklerin sayımını yapmaya ve yaşam süresini düzenlemeye daha az zaman harcıyor olabilir. Her ne şekilde olursa olsun, bu kod yolu sürücüde harcadığımız süreyi bazı durumlarda %10-15 oranında azalttı.
 

Vulkan

Vulkan, yüksek performans ve donanıma alt düzeyde erişim için tasarlanmış yepyeni bir Android görüntü API’ıdır. 2016’da Samsung’la ortak çalışarak Android üzerinde yüksek performanslı bir görüntü API’ı ile neler yapılabileceğini gösteren ProtoStar adında bir demo oluşturduk. Fortnite, kare başına pek çok nesne çizimi gerektirdiğinden Vulkan ile tabiatları uyuşuyor gibi görünüyor. Fakat maalesef iş bununla bitmedi.

Vulkan desteği henüz Android’de bir gereksinim olmadığından tüm ekosistemde kullanılıyor olduğunu varsayarak ona bel bağlayamayız. Sadece nispeten güncel donanımları hedefliyor olduğumuzdan bu durum ilerleyişimize mani olmadı fakat bu sefer de eski Vulkan sürücülerinde bir takım hatalara ve performans sorunlarına rastladık. OpenGL, pek çok cihazda Vulkan’a nazaran daha hızlı ve stabil çalışıyordu. Sektörün OpenGL sürücülerini iyileştirip geliştirmek için on yıldır çalışıyor olduğunu düşünürsek aslında bu durum o kadar da şaşırtıcı değil. Vulkan daha karmaşık bir API ve OpenGL ile aynı olgunluğa ulaşması biraz vakit alacak.

Samsung S9+ (Adreno) ve Note 9 (Adreno) için Vulkan desteği sunduk. Samsung mühendisleriyle yakın çalışarak UE4’ün Vulkan desteğinin OpenGL’den ortalama %20 daha hızlı olmasını sağladık. Hem Fortnite oyuncularına Android’de daha iyi bir deneyim sunmak, hem de tüm geliştiriciler için Vulkan sürücülerinin performansını geliştirmek için donanım ortaklarımızla birlikte çalışmaya devam ediyoruz.
 

Bellek

Bellek, hâlâ üzerinde uğraştığımız bir sorun. Sadece tam teşekküllü bir konsol oyununu mobil cihazlar için sunmakla kalmıyor, oyuna sürekli yeni içerik ekliyoruz. Hal böyle olunca da devamlı bellek iyileştirmeleri üzerine çalışıyoruz. Android, diğer platformlara nazaran benzersiz zorluklara sahip.

Hedef edineceğimiz bellek sınırı belli değil. Her cihaz farklı miktarda belleğe, arka planda çalışan farklı tür uygulamalara ve bir uygulama yüksek bellek kullandığında ne zaman sonlandıracağına dair farklı olabilecek kurallara sahip. Bu bellek sınırını sorgulayacak bir API yok. Referans veri elde etmek için bellek testlerinden birinde maça girdik ve işletim sistemi programı sonlandırana kadar ayırdığımız belleği yükselttik. Yeniden başlattığımız cihazlarda herhangi bir uygulama açmadan yaptığımız bu testte Samsung Galaxy S8 (Mali) 4GB belleğinin 3GB’ını ayırabildi, sonrasındaysa uygulama kapandı. Google Pixel 2 üzerinde ise 3,6GB belleğin sadece 1,8GB’ını ayırabildik.

Sistem, özellikle de grafik sürücüsü, bizim adımıza çok fazla bellek ayırıyordu. UE4 işletim sisteminden talep ettiğimiz tüm belleği, grafik işlemci için ayrılan belleği de yaklaşık olarak hesaplayarak takip ediyor fakat sürücünün ayırdığı belleğin detaylarını tam olarak göremiyoruz. Yaptığımız denemelerin sonucunda sürücünün Fortnite için ayırdığı belleğin çoğunun gölgelendiriciler için olduğunu gördük.

Yukarıda da bahsi geçen öykünmüş tekdüzen arabellek iyileştirmelerinde amacımız bellek sorununu çözmekti. OpenGL, uygulamanın tekdüzen arabelleğindeki herhangi bir üyenin yerini sorgulayabilmesini gerektiriyor. Örneğin, OpenGL’e ilkel tekdüzen arabelleğindeki LocalToWorld matrisinin konumunu sorulabilir. Bu özelliği desteklemek için sürücü, her üyenin adının yazılı olduğu karakter dizilerini içeren bir konum tablosu gibi çeşitli meta verileri hafızasında tutuyor ve bunu her program için yapıyor.

Fortnite’ta çok çeşit gölgelendiricimiz var. Sıradan bir oyun oturumunda oyun motoru yaklaşık 2.000 adet gölgelendirici programı kullanıyor. Sürücü, bu gölgelendirici programların her biri için meta veri tutuyor gibi görünüyor ve bu da belleğe hatırı sayılır derecede bir yük bindiriyor. Fortnite’ta öykünmüş tekdüzen arabellekleri kullanarak 400MB’tan fazla bellek tasarruf ettik!

Android için Fortnite’ı ilk çıkardığımızda testlerimiz hedef cihazlarımızın bellek sınırları dahilinde çalışmamız gerektiğini gösterdi. Google haritalar üzerinden navigasyon kullanarak ve internetten müzik dinleyerek Fortnite’ı sorunsuz oynayabildiğimizden emin olmak için testler yürüttük. Yine de Fortnite’ı piyasaya sürdüğümüzde pek çok oyuncuda oyunun çöktüğünü veya bellek yetersizliği sebebiyle yavaş çalıştığını gördük.

Bir Android telefonun belleği dolmaya başladığında kullanılmayan uygulamaları kapatarak yer açmaya çalışır. Fakat görünüşe göre, birçok düşük kaliteli arka plan uygulaması ve servisi işletim sistemi onları kapattığında yeniden başlıyor. Bu, durumu daha da kötü hale getiriyor! Android, bellekte yer açmak için uygulamayı kapatıyor fakat uygulama yeniden başlayarak aynı belleği kullanmaya devam ediyor. Daha da kötüsü, uygulamaları kapatıp açmak işlemci süresi kullandığı için bellekte yer açamadığımız gibi bir de gereksiz yere işlemci kaynaklarını kullanıyoruz.

Sorunları önceden tespit edebilmek amacıyla kullanıcıların sık kullandığı uygulamaları yükleyerek test sürecimizi güncelledik ama yine de bellek kullanımını hızlı bir şekilde azaltmamız gerekiyordu. Sorunu, oyunu 4GB belleğe sahip son model Qualcomm Snapdragon cihazlarıyla Yüksek ve Destansı ayarlarda çalıştıran oyunculara kadar daraltabildik. Bir kez daha asıl fark yaratan gölgelendirici belleği oldu. Geçici bir çözüm olarak gölgeleri kaldırmak sorunu hafifletti. Böylece, gölge haritalarını aramak ve filtrelemek için değişkenlere artık ihtiyacımız olmadığından gerekli gölgelendirici sayısı azaldı. Aynı zamanda gölgelendiriciler için LRU önbelleği de ekledik. Bu önbellek, sadece mevcut sahnenin görüntüsünü oluşturmak için gereken gölgelendirici programlarını bellekte tutmamıza olanak sağladı. Diğer gölgelendirici programları bellekte sıkıştırılmış olarak duruyor. Gerektiğinde sıkıştırılmış veriyi çıkartıyor ve sürücüye geri veriyoruz.
 

Gelecek - Sonraki adımlar

Şu anda oyunun desteklenen mevcut cihazlarda iyi bir şekilde çalışmasını sağlamaya ve hem görsel kaliteyi, hem de dengeliliği geliştirmemize olanak tanıyacak kadar çok bellek kurtarmaya çalışıyoruz. Sonra başka uyumluluk sorunları üzerinde çalışacağız. Örneğin ses sorununu 5.40 yamasında çözmüş ve daha fazla cihaza destek vermek için kendimize geniş bir alan açabilmiştik. Ayrıca kullanıcılara cihaz üzerinde ayarlamalar yapabilecekleri daha detaylı bir kontrol şansı vermeyi ve kaliteyle performans arasında seçim yapma olanağı sunmayı planlıyoruz.

Vulkan desteğini geliştirmeye devam edecek, zaman içinde daha fazla cihazı destekleyeceğiz. Bu da optimizasyon anlamında, hem UE4 hem de sürücüler üzerinde cihaz üreticileriyle birlikte çalışmaya devam edeceğimiz anlamına geliyor. Uzun vadede, Vulkan desteğini ve sürücülerini geliştirmek için yaptığımız zaman yatırımı, Android platformuna çıkan tüm UE4 oyunları için oyunculara daha iyi performanslar sunmamızı sağlayacak.

Daha eski ve yavaş telefonlar üzerindeki çalışmalarımız da sürecek ancak fazla geriye gitmek pek kullanışlı olmaz. Her yıl, son teknoloji telefonlar, bir sene öncesinin son teknoloji telefonlarından %50 daha hızlı hale geliyor. Fortnite iki yıllık telefonlarda kabul edilebilir, bir yıllık telefonlarda iyi, bu sene piyasaya çıkmış telefonlardaysa harika bir performansla çalışıyor. Bu hızla gidildiğinde, Fortnite'ın önümüzdeki yıl çıkacak telefonlarda nasıl bir performansla çalışacağını düşünsenize!

image2.png


Son olarak, oyun motoru üzerinde yaptığımız pek çok iyileştirme UE4 4.20 sürümüyle çıktı bile. Geri kalan iyileştirmeler önümüzdeki 4.21 sürümüyle sunulacak ve gelecekte yapacağımız iyileştirmeleri tüm UE4 geliştiricileri ile paylaşmaya devam edeceğiz.
 

KÖTÜ AMAÇLI YAZILIMLARLA SAVAŞ   

Fortnite’ın Android için de piyasaya sürüleceğini duyurmamızın öncesinde bile, “Android’de Fortnite” konulu yetkisiz internet sitelerinin ortaya çıktığından haberdardık. Bu sitelerin çoğu kötü amaçlı yazılım veya dolandırıcılık faaliyetleri barındıran siteler.  Bu internet sitelerinin farkına vardıkça sitelerle ve bağlı oldukları hosting (barındırma) hizmeti sağlayıcılarıyla iletişime geçerek bu içeriklerin kaldırılması için çalışıyor, bu sitelerin tanıtımını yapan her türlü reklam veya videoya da erişimi engellemek için çalışmalar yürütüyoruz.  İnternet sitesi kötü amaçlı yazılım yayıyor olsun olmasın, Android’de Fortnite konulu her türlü dağıtım ve dağıtım iddiasını yetkisiz olarak değerlendiriyoruz. Android’de Fortnite için tek geçerli kaynak Epic’in Fortnite Yükleyicisi üzerinden sunduğu hizmettir.
 
Şimdiye dek, Epic pek çoğunun aynı kötü niyetli çevreler tarafından yönetildiği görülen, “Android’de Fortnite” konulu 47 yetkisiz internet sitesine yaptırım uygulattı. Bu konuda, bu siteleri kapattırmaya çalışmak veya sahtecilikle mücadele alanında çalışan (İnternet servis sağlayıcıları, tarayıcı firmaları ve antivirüs yazılımı firmaları gibi) firmalardan oluşan geniş iş ortakları ağımız sayesinde erişimi kısıtlamaya çalışmaya devam edeceğiz. Bu firmalar tarayıcı içinde görüntülenecek şu şekilde uyarılar tasarlayabiliyorlar: 

Image1.png
 
Bünyemizde sadece bu iş için kurduğumuz ekiple, sürekli olarak yeni kötü amaçlı yazılım siteleri aramaya ve tespit etmeye devam ediyoruz. Ek olarak, üçüncü parti bir IP ve dolandırıcılıkla mücadele ajansıyla anlaşarak, bu sitelere karşı çabalarımızı ilerlettik. Bu ortaklık sayesinde şüpheli isimlere sahip yeni kaydettirilmiş adresleri tespit edip inceliyor, bu adresler zararlı sitelere dönüşürse Epic olarak hukuki yollar da dahil olmak üzere, gerekli gördüğümüz şekilde harekete geçebiliyoruz.

SONUÇ

Android’de Fortnite sektörün pek çok anlamda ilklerini temsil ediyor. Fortnite, Android’e platformlar arası desteği ve uyumluluğu tam anlamıyla sağlanmış ilk konsol ve PC oyunu olmanın yanı sıra, Google Play Store dışında çıkıp indirme rekorları kıran ilk oyun oldu. İnanılmaz bir girişim ve öğrenme süreci geçirmiş olsak da, oyunun 15 milyonun üzerinde Android kullanıcısı tarafından hızla benimsenmiş olması bu yaklaşımımızın doğru olduğunu ve son derece başarılı olabileceğini gösteriyor. En önemlisi de, Android’de Fortnite için yaptığımız tüm teknik çalışmalar, 4.21 sürümüne sahip tüm Unreal Engine geliştiricileri için de kullanılabilir olacak. Böylece tüm çalışmalarımızdan herkes faydalanabilecek.