Ringkasan
Godot Engine adalah game engine open source multiplatform populer dengan dukungan yang andal untuk Android. Godot dapat digunakan untuk membuat game dari hampir semua genre dan mampu membuat grafis 2D dan 3D. Godot versi 4 memperkenalkan sistem rendering baru dengan fitur lanjutan untuk grafis fidelitas tinggi. Perender Godot 4 dirancang untuk API grafis modern seperti Vulkan.
Godot Foundation melibatkan pakar pengoptimalan grafis di The Forge Interactive dan berkolaborasi dengan Google untuk menganalisis dan meningkatkan lebih lanjut perender Vulkan Godot 4 dan menggabungkan pengoptimalan tersebut kembali ke repositori project. Pengoptimalan ini membantu developer meningkatkan kualitas perender Vulkan kustom di Android.
Metodologi dan hasil pengoptimalan
Proses pengoptimalan menggunakan dua tampilan 3D yang berbeda di Godot sebagai target benchmarking. Waktu rendering tampilan diukur di beberapa perangkat selama setiap iterasi pengoptimalan. Agar memenuhi syarat untuk disertakan, perubahan pada renderer harus menunjukkan peningkatan performa pada setidaknya beberapa perangkat yang diuji dan tidak dapat menyebabkan regresi performa pada perangkat apa pun.
Beberapa arsitektur GPU Android populer digunakan dalam pengujian. Meskipun banyak pengoptimalan memberikan peningkatan umum, beberapa pengoptimalan memiliki dampak yang lebih besar pada arsitektur GPU tertentu. Jumlah total semua pekerjaan pengoptimalan menghasilkan pengurangan waktu render frame GPU secara umum sebesar 10%-20%.
Pengoptimalan Vulkan umum
Forge melakukan pemfaktoran ulang arsitektur umum pada backend rendering Godot Vulkan untuk meningkatkan performa dan membantu backend menskalakan dengan peningkatan permintaan rendering konten. Pengoptimalan ini tidak khusus untuk hardware seluler, tetapi bermanfaat bagi semua platform Godot Vulkan.
Dukungan offset UBO dinamis
Saat mengikat kumpulan deskripsi yang berisi objek buffer seragam dinamis (UBO), Vulkan memungkinkan offset dinamis ke UBO ditentukan dalam parameter pengikatan. Fitur ini dapat digunakan untuk memaketkan data untuk beberapa operasi rendering ke dalam satu UBO, mengikat ulang kumpulan deskripsi dengan offset dinamis yang berbeda untuk memilih data yang tepat bagi shader. Perender Godot Vulkan diperbarui agar dapat menggunakan offset dinamis, bukan selalu melakukan inisialisasi offset ke nol. Peningkatan ini memungkinkan pengoptimalan efisiensi di masa mendatang.
Kumpulan set deskriptor linear
Sebelumnya, perilaku default di perender Godot Vulkan adalah membuat semua
kumpulan set deskripsi menggunakan
flag
VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT
, yang berarti alokasi set deskripsi dapat dibebaskan kembali ke kumpulan
dan realokasi dapat dilakukan dari kumpulan. Mode ini menimbulkan overhead tambahan
dibandingkan dengan kumpulan set deskripsi yang hanya mengizinkan alokasi linear
diikuti dengan reset total kumpulan.
Jika memungkinkan, kumpulan set deskripsi kini dibuat sebagai kumpulan linear tanpa
menyetel
VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT
. Kemudian, kumpulan linear
akan direset secara keseluruhan jika diperlukan. Pekerjaan ini juga mencakup pengoptimalan tambahan untuk
binding kumpulan deskripsi jika memungkinkan, sehingga mengurangi jumlah panggilan
terpisah ke vkCmdBindDescriptorSets()
.
Dukungan sampler yang tidak dapat diubah
Objek sampler yang berisi data konfigurasi sampling secara tradisional terikat sebagai bagian dari data set deskripsi. Metode ini memungkinkan objek sampler ditukar secara dinamis dalam data set deskripsi. Vulkan juga mendukung sampler yang tidak dapat diubah, yang mengenkode data sampler langsung ke dalam tata letak set deskripsi. Konfigurasi sampler ini terikat saat membuat kumpulan deskripsi dan status pipeline dan tidak dapat diubah setelah pembuatan.
Pengambil sampel yang tidak dapat diubah mengorbankan fleksibilitas karena tidak perlu lagi mengelola dan mengikat objek sampler terpisah. Perender Godot Vulkan diperbarui untuk mendukung penggunaan sampler yang tidak dapat diubah; penggunaan sampler diubah untuk menggunakan sampler yang tidak dapat diubah jika praktis.
Pengoptimalan yang berfokus pada seluler
Pengoptimalan tambahan diterapkan untuk secara khusus meningkatkan performa rendering pada hardware grafis seluler. Optimasi ini umumnya tidak relevan dengan hardware grafis kelas desktop karena desain arsitektur yang berbeda.
Pengoptimalan tersebut meliputi:
- Mengganti penggunaan konstanta push besar
- Alokasi buffer lambat
- Dukungan buffering persisten
- Perubahan mode dekode ASTC
- Pra-rotasi layar
Mengganti penggunaan konstanta push besar
Konstanta push adalah fitur yang memungkinkan injeksi nilai konstan untuk program shader aktif ke dalam buffer perintah. Konstanta push praktis karena tidak memerlukan pembuatan dan pengisian buffering serta tidak terikat dengan deskripsi. Namun, konstanta push memiliki ukuran maksimum terbatas dan dapat memengaruhi performa secara negatif pada hardware seluler.
Selama pengujian di perangkat Android, performa ditingkatkan dengan mengganti penggunaan konstanta push lebih dari 16 byte dengan buffering seragam. Shader yang menggunakan data konstan 16 byte atau kurang memiliki performa yang lebih baik dengan push constant. Selain pertimbangan performa, beberapa hardware grafis memiliki minimum perataan 64 byte untuk buffer seragam, yang mengurangi efisiensi memori karena padding yang tidak digunakan saat dibandingkan dengan menggunakan konstanta push.
Alokasi buffer lambat
Sebagian besar hardware grafis seluler menggunakan arsitektur rendering tertunda berbasis ubin (TBDR). GPU yang menggunakan TBDR membagi wilayah layar yang lebih besar menjadi petak ubin yang lebih kecil dan merender berdasarkan per ubin. Setiap kartu didukung oleh sejumlah kecil RAM berkecepatan tinggi yang digunakan untuk penyimpanan oleh GPU saat GPU merender kartu. Dengan TBDR, target render yang tidak pernah diambil sampelnya oleh target lain di luar pass rendernya dapat secara efektif tetap berada di RAM kartu dan tidak memerlukan buffering untuk penyimpanan pendukung memori utama.
VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT
ditambahkan selama
pembuatan target render yang sesuai, seperti target kedalaman dan warna
utama, untuk menghindari alokasi memori buffer yang tidak akan pernah digunakan. Penghematan memori
alokasi lambat dalam contoh scene diukur setinggi
sekitar 50 megabyte RAM.
Dukungan buffering persisten
Hardware seluler menggunakan Unified Memory Architecture (UMA), bukan diferensiasi hardware antara RAM utama dan RAM grafis. Jika RAM utama dan RAM grafis terpisah, data harus ditransfer dari RAM utama ke RAM grafis agar dapat digunakan oleh GPU. Godot sudah menerapkan proses transfer ini di perender Vulkan-nya melalui penggunaan buffering staging. Pada hardware UMA,buffer staging tidak diperlukan untuk banyak jenis data; memori dapat digunakan oleh CPU dan GPU. Forge menerapkan dukungan untuk buffering bersama persisten pada hardware yang didukung untuk menghilangkan staging jika memungkinkan.
Perubahan mode dekode ASTC
Adaptive scalable texture compression (ASTC) adalah format kompresi tekstur
modern yang lebih disukai di hardware seluler. Selama dekompresi, GPU secara default
dapat mendekode texel menjadi nilai perantara yang presisinya lebih besar daripada
yang diperlukan untuk fidelitas visual, sehingga menyebabkan hilangnya efisiensi tekstur. Jika
didukung oleh hardware target, ekstensi VK_EXT_astc_decode_mode
digunakan untuk menentukan nilai 8-bit yang tidak dinormalisasi per komponen saat
mendekode, bukan nilai floating point 16-bit.
Pra-rotasi layar
Untuk mendapatkan performa yang optimal saat menggunakan Vulkan di Android, game harus merekonsiliasi orientasi perangkat layar dengan orientasi platform rendernya. Proses ini disebut sebagai pra-rotasi. Kegagalan untuk melakukan pra-rotasi dapat mengurangi performa karena OS Android perlu menambahkan kartu compositor untuk memutar gambar secara manual. Dukungan untuk pra-rotasi di Android ditambahkan ke perender Godot.
Peningkatan proses debug
Selain melakukan pengoptimalan performa, The Forge meningkatkan pengalaman proses debug masalah grafis di perender Godot dengan tambahan berikut:
- Perpanjangan kerusakan perangkat
- Breadcrumb
- Penanda debug
Perpanjangan kerusakan perangkat
Saat GPU mengalami masalah selama operasi rendering, driver Vulkan
dapat menampilkan hasil VK_ERROR_DEVICE_LOST
dari panggilan Vulkan API. Secara default,
tidak ada informasi konteks tambahan yang diberikan tentang alasan driver menampilkan
VK_ERROR_DEVICE_LOST
. Ekstensi VK_EXT_device_fault
memberikan mekanisme bagi pengemudi untuk memberikan informasi tambahan tentang
sifat kesalahan. Godot menambahkan dukungan untuk mengaktifkan ekstensi error perangkat
(jika tersedia) dan untuk melaporkan informasi yang ditampilkan oleh driver.
Breadcrumb
Error GPU atau jeda eksekusi dapat sulit di-debug. Untuk membantu mengidentifikasi konten grafis yang mungkin telah dirender pada saat terjadi error, dukungan breadcrumb ditambahkan ke perender Godot. Breadcrumb adalah nilai yang ditentukan pengguna yang dapat disertakan ke konten dalam daftar gambar di grafik render. Data breadcrumb ditulis sebelum pass render baru dimulai. Jika terjadi error atau penghentian eksekusi, nilai breadcrumb saat ini dapat digunakan untuk menentukan data yang mungkin menyebabkan masalah.
Penanda debug
Penanda debug, jika didukung oleh driver, digunakan untuk memberi nama resource. Hal ini memungkinkan string yang dapat dibaca pengguna dikaitkan dengan operasi seperti render pass dan resource seperti buffering dan tekstur saat menggunakan alat grafis seperti RenderDoc. Dukungan anotasi penanda debug telah ditambahkan ke perender Godot Vulkan.
Link Tambahan
Blog Godot Engine - Info Terbaru tentang Kolaborasi dengan Google dan Forge
Permintaan pull kolaborasi Vulkan Godot Engine