Genel Bakış
Godot Engine, Android için güçlü destek sunan popüler bir çok platformlu açık kaynak oyun motorudur. Godot, neredeyse her türde oyun oluşturmak için kullanılabilir ve hem 2D hem de 3D grafikler sunar. Godot 4 sürümü, yüksek kaliteli grafikler için gelişmiş özelliklere sahip yeni bir oluşturma sistemi kullanıma sundu. Godot 4 oluşturma aracı, Vulkan gibi modern grafik API'leri için tasarlanmıştır.
Godot Foundation, Godot 4 Vulkan oluşturma aracını analiz edip daha da iyileştirmek ve bu optimizasyonları proje deposuna geri birleştirmek için The Forge Interactive'teki grafik optimizasyonu uzmanlarıyla birlikte çalıştı ve Google ile işbirliği yaptı. Bu optimizasyonlar, geliştiricilerin Android'de özel Vulkan oluşturma araçlarını iyileştirmesine yardımcı olur.
Optimizasyon metodolojisi ve sonuçları
Optimizasyon sürecinde, karşılaştırma hedefleri olarak Godot'ta iki farklı 3D sahne kullanıldı. Sahnelerin oluşturma süresi, her optimizasyon iterasyonunda birden fazla cihazda ölçüldü. Dahil edilmeye uygun olmak için, oluşturma aracında yapılan değişikliklerin en azından bazı test edilen cihazlarda performans iyileştirmeleri göstermesi ve hiçbir cihazda performansta gerileme olmaması gerekiyordu.
Testte birden fazla popüler Android GPU mimarisi kullanıldı. Birçok optimizasyon genel iyileştirmeler sağlasa da bazı optimizasyonlar belirli GPU mimarileri üzerinde daha fazla etki yarattı. Tüm optimizasyon çalışmalarının toplamı, GPU kare sürelerinde genel olarak %10-20 oranında bir düşüşe neden oldu.
Genel Vulkan optimizasyonu
Forge, performansı artırmak ve arka uçta artan içerik oluşturma talepleriyle ölçeklendirmeye yardımcı olmak için Godot Vulkan oluşturma arka ucunda genel mimari yeniden düzenlemesi yaptı. Bu optimizasyonlar mobil donanıma özel değildir ancak tüm Godot Vulkan platformlarına fayda sağlar.
Dinamik UBO ofset desteği
Vulkan, dinamik tekdüzen arabellek nesnesi (UBO) içeren bir tanımlayıcı grubunu bağlarken, bağlama parametrelerinde UBO'ya dinamik ofsetlerin belirtilmesine olanak tanır. Bu özellik, birden fazla oluşturma işlemine ait verileri tek bir UBO'da paketlemek için kullanılabilir. Açıklayıcı kümesini, gölgelendirici için uygun verileri seçmek üzere farklı bir dinamik ofsetle yeniden bağlayarak kullanabilirsiniz. Godot Vulkan görüntüleyicisi, ofseti her zaman sıfır olarak başlatmak yerine dinamik ofsetler kullanabilmesi için güncellendi. Bu iyileştirme, gelecekte verimlilik optimizasyonları yapılmasına olanak tanır.
Doğrusal tanımlayıcı kümesi havuzları
Daha önce Godot Vulkan oluşturma aracındaki varsayılan davranış, tüm tanımlayıcı grubu havuzlarını VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT
işaretini kullanarak oluşturmaktı. Bu, tanımlayıcı grubu tahsislerinin havuza geri serbest bırakılabileceği ve havuzda yeniden tahsis yapılabileceği anlamına geliyordu. Bu mod, yalnızca doğrusal atama ve ardından havuzun tamamen sıfırlanmasına izin veren tanımlayıcı grubu havuzlarına kıyasla ek yükü beraberinde getirdi.
Mümkün olduğunda tanımlayıcı kümesi havuzları artık VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT
ayarlanmadan doğrusal havuz olarak oluşturulur. Daha sonra, gerektiğinde doğrusal havuzların tamamı sıfırlanır. Bu çalışmada, mümkün olduğunda açıklayıcı grubu bağlama işlemi için ek optimizasyon da yer alır. Bu sayede vkCmdBindDescriptorSets()
'e yapılan ayrı çağrıların sayısı azaltılır.
Sabit örnekleyici desteği
Örnekleme yapılandırma verilerini içeren örnekleyici nesneleri, geleneksel olarak tanımlayıcı grubu verilerinin bir parçası olarak bağlanır. Bu yöntem, örnekleyici nesnelerinin tanımlayıcı grubu verilerinde dinamik olarak değiştirilmesine olanak tanır. Vulkan, örnekleyici verilerini doğrudan tanımlayıcı grubu düzenine kodlayan değişmez örnekleyicileri de destekler. Bu örnekleyici yapılandırması, tanımlayıcı grubu ve ardışık düzen durumu oluşturulurken bağlanır ve oluşturulduktan sonra değiştirilemez.
Değiştirilemez örnekleyiciler, artık ayrı örnekleyici nesnelerini yönetmek ve bağlamak zorunda kalmamak için esneklikten ödün verir. Godot Vulkan işleyicisi, değişmez örnekleyicilerin kullanımını destekleyecek şekilde güncellendi; örnekleyici kullanımı, uygun olduğunda değişmez örnekleyiciler kullanacak şekilde değiştirildi.
Mobil cihazlara odaklanan optimizasyon
Özellikle mobil grafik donanımındaki oluşturma performansını iyileştirmek için ek optimizasyonlar uygulandı. Optimizasyonlar, farklı mimari tasarımlar nedeniyle genellikle masaüstü sınıfı grafik donanımıyla alakalı değildir.
Bu optimizasyonlar şunları içerir:
- Büyük push sabitlerinin kullanımını değiştirme
- Geç arabellek ayırma
- Kalıcı arabellek desteği
- ASTC kod çözme modu değişikliği
- Ekranı önceden döndürme
Büyük push sabitlerinin kullanımını değiştirme
Push sabitleri, etkin gölgelendirici programı için sabit değerleri komut arabelleğine eklemenize olanak tanıyan bir özelliktir. Push sabitleri, arabellek oluşturma ve doldurma gerektirmediği ve tanımlayıcılara bağlı olmadığı için kullanışlıdır. Ancak push sabitlerinin maksimum boyutu sınırlıdır ve mobil donanımdaki performansı olumsuz yönde etkileyebilir.
Android cihazlarda yapılan testler sırasında, 16 bayttan fazla push sabit kullanımının tekdüze arabelleklerle değiştirilmesiyle performans iyileştirildi. 16 bayt veya daha az sabit veri kullanan gölgelendiriciler, itme sabitleriyle daha yüksek performans gösteriyordu. Performansla ilgili hususlara ek olarak, bazı grafik donanımlarında tekdüze tamponlar için minimum 64 baytlık hizalama vardır. Bu, itme sabitleri kullanılmasına kıyasla kullanılmayan dolgu nedeniyle bellek verimliliğini azaltır.
Geç arabellek ayırma
Çoğu mobil grafik donanımı, karo tabanlı ertelenen oluşturma (TBDR) mimarisini kullanır. TBDR kullanan GPU'lar, daha büyük ekran bölgesini daha küçük karolardan oluşan bir ızgaraya böler ve karo başına oluşturma işlemi gerçekleştirir. Her karo, GPU bir karoyu oluştururken depolama alanı olarak kullanılan küçük miktarda yüksek hızlı RAM ile desteklenir. TBDR ile, oluşturma geçişlerinin dışında başka bir hedef tarafından hiçbir zaman örneklenmeyen oluşturma hedefleri etkili bir şekilde tamamen karo RAM'de kalabilir ve ana bellek destek deposu için arabellek gerektirmez.
Asla kullanılmayacak arabellek belleği ayırmamak için VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT
, ana renk ve derinlik hedefleri gibi uygun oluşturma hedeflerinin oluşturulması sırasında eklenmiştir. Örnek sahnelerde, tembel atama bellek tasarrufunun yaklaşık 50 megabayt RAM kadar yüksek olduğu ölçüldü.
Kalıcı arabellek desteği
Mobil donanım, ana RAM ile grafik RAM arasında donanımsal ayrım yerine Birleşik Bellek Mimarisi (UMA) kullanır. Ana RAM ve grafik RAM ayrı olduğunda, GPU tarafından kullanılabilmesi için verilerin ana RAM'den grafik RAM'e aktarılması gerekir. Godot, bu aktarım işlemini Vulkan oluşturucusunda ara bellekler kullanarak zaten uygulamaktadır. UMA donanımlarında,birçok veri türü için bir ara bellek gerekmez. Bellek hem CPU hem de GPU tarafından kullanılabilir. Forge, mümkün olduğunda ara depolama alanını ortadan kaldırmak için desteklenen donanımlarda kalıcı paylaşılan arabellekler için destek uyguladı.
ASTC kod çözme modu değişikliği
Uyarlanabilir ölçeklenebilir doku sıkıştırma (ASTC), mobil donanımlarda tercih edilen modern doku sıkıştırma biçimidir. GPU, sıkıştırma işlemi sırasında varsayılan olarak piksellerin kodunu görsel doğruluk için gerekenden daha yüksek bir hassasiyete sahip bir ara değere çözebilir. Bu da doku oluşturma verimliliğinde kayba neden olur. Hedef donanım tarafından destekleniyorsa kod çözme işlemi sırasında 16 bit kayan nokta değerleri yerine bileşen başına 8 bit normalleştirilmemiş değerleri belirtmek için VK_EXT_astc_decode_mode
uzantısı kullanılır.
Ekranı önceden döndürme
Android'de Vulkan kullanılırken en iyi performans için oyunların, ekranın cihaz yönünü oluşturma yüzeyi yönüyle uyumlu hale getirmesi gerekir. Bu işleme ön rotasyon denir. Dönüşüm öncesi işlemin yapılmaması, Android OS'in resimleri manuel olarak döndürmek için bir derleyici geçişi eklemesi gerektiğinden performansın düşmesine neden olabilir. Godot oluşturma aracına Android'de ön döndürme desteği eklendi.
Hata ayıklamayla ilgili iyileştirmeler
The Forge, performans optimizasyonlarının yanı sıra Godot oluşturma aracındaki grafik sorunlarında hata ayıklama deneyimini aşağıdaki eklemelerle iyileştirdi:
- Cihaz arızası uzatması
- İçerik haritaları
- Hata ayıklama işaretçileri
Cihaz arızası uzatması
GPU, oluşturma işlemleri sırasında bir sorunla karşılaştığında Vulkan sürücüsü, Vulkan API çağrısından VK_ERROR_DEVICE_LOST
sonucu döndürebilir. Sürücü VK_ERROR_DEVICE_LOST
değerini döndürdüğünde varsayılan olarak ek bağlam bilgisi sağlanmaz. VK_EXT_device_fault
uzantısı, sürücünün hatanın niteliği hakkında ek bilgi sağlaması için bir mekanizma sağlar. Godot, cihaz hatası uzantısını (varsa) etkinleştirme ve sürücü tarafından döndürülen bilgileri raporlama desteği ekledi.
İçerik haritaları
GPU kilitlenmesi veya yürütme duraklaması sorunlarının hata ayıklanmasının zor olması mümkündür. Bir hata sırasında hangi grafik içeriğin oluşturulmuş olabileceğini belirlemeye yardımcı olmak için Godot oluşturma aracına içerik haritası desteği eklendi. Kırıntılar, oluşturma grafiğindeki çizim listelerindeki içeriğe eklenebilen kullanıcı tanımlı değerlerdir. Kırıntı verileri, yeni bir oluşturma geçişi başlatılmadan önce yazılır. Kilitlenme veya yürütme duraklaması meydana gelirse sorunun hangi verilerden kaynaklanmış olabileceğini belirlemek için mevcut içerik haritası değeri kullanılabilir.
Hata ayıklama işaretçileri
Sürücü tarafından desteklendiğinde hata ayıklama işaretçileri, kaynakları adlandırmak için kullanılır. Bu, RenderDoc gibi bir grafik aracı kullanırken kullanıcı tarafından okunabilen dizelerin oluşturma geçişleri gibi işlemlerle ve arabellek ve doku gibi kaynaklarla ilişkilendirilmesine olanak tanır. Hata ayıklama işaretçisi ek açıklaması desteği Godot Vulkan oluşturma aracına eklendi.
Ek Bağlantılar
Godot Engine blogu - Google ve The Forge ile Ortak Çalışmayla İlgili Güncelleme
Godot Engine Vulkan ortak çalışma isteği