Pernah melihat game yang tampak lancar di area kecil tetapi FPS langsung jatuh ketika masuk kota ramai atau pertempuran besar? Kondisi seperti ini biasanya menandakan adanya beban rendering yang berubah drastis.
Jumlah objek, material, shadow, particle, post-processing, sampai resolusi layar dapat memengaruhi waktu yang dibutuhkan untuk menghasilkan sebuah frame.
Memahami Cara Mengoptimalkan Rendering Pipeline membantu developer menentukan mana fitur visual yang layak dipertahankan dan mana yang perlu disederhanakan.
Tujuannya bukan membuat grafis terlihat buruk, melainkan menggunakan kemampuan hardware dengan jauh lebih efisien.
Mulai Optimasi dengan Profiling, Bukan Feeling
Banyak developer mencoba meningkatkan performa dengan mengubah berbagai setting secara acak.
Texture diturunkan, polygon dikurangi, shadow dimatikan, lalu berharap FPS meningkat. Masalahnya, perubahan tersebut mungkin tidak berhubungan dengan bottleneck sebenarnya.
Pipeline grafis memiliki beberapa titik yang dapat membatasi performa. CPU bisa terlalu sibuk menyiapkan render command, GPU dapat kewalahan menjalankan pixel shader, atau memory bandwidth menjadi hambatan karena terlalu banyak data dipindahkan.
NVIDIA menyebut proses optimasi grafis sebagai siklus menemukan bottleneck lalu menyerang titik tersebut secara sistematis. Mengoptimalkan tahap yang bukan pembatas utama bahkan bisa menghasilkan nyaris nol peningkatan.
Jadi, ukur dahulu sebelum mengubah aset.
Bedakan CPU-Bound dan GPU-Bound
Salah satu diagnosis dasar adalah mengetahui apakah sebuah scene CPU-bound atau GPU-bound.
Jika render thread CPU membutuhkan waktu lebih lama daripada GPU, mengurangi shader complexity kemungkinan tidak menyelesaikan masalah utama. Sebaliknya, jika GPU menjadi bottleneck, mengoptimalkan kode gameplay CPU mungkin tidak meningkatkan FPS.
Draw call sering berkaitan dengan beban CPU karena setiap object dapat membutuhkan pekerjaan untuk culling, material setup, lighting setup, dan penyusunan GPU command.
Epic juga mencatat bahwa jumlah draw call yang tinggi dapat menjadi kontributor utama masalah performa grafis pada sejumlah skenario real-time.
Karena itu, pahami dulu waktu CPU dan GPU secara terpisah.
Kurangi State Change dan Draw Call
Setiap perubahan mesh, shader, texture, atau material dapat menambah pekerjaan dalam rendering pipeline.
Contohnya, sebuah pasar dalam game memiliki 500 kotak barang. Jika setiap kotak menggunakan material unik, renderer harus melakukan lebih banyak pergantian state dibanding ketika banyak objek berbagi material yang sama.
Unity menyarankan penggunaan material yang sama pada beberapa objek ketika memungkinkan serta menyediakan SRP Batcher dan GPU Resident Drawer sebagai beberapa pendekatan pengurangan overhead draw call pada render pipeline modernnya.
Gunakan Instancing untuk Objek Berulang
GPU instancing cocok digunakan untuk objek yang memiliki mesh sama tetapi muncul berkali-kali.
Pepohonan, batu, tiang, rumput, rumah modular, atau dekorasi berulang merupakan contoh kandidat yang bagus.
Tetapi jangan sekadar mengejar angka draw call serendah mungkin.
Jika terlalu banyak object digabung menjadi satu kelompok besar, sistem culling kehilangan kemampuan menghilangkan object individual yang berada di luar pandangan. Optimasi harus mempertimbangkan keseimbangan antara batching dan visibility.
Gunakan LOD Berdasarkan Ukuran di Layar
LOD bukan hanya teknik untuk “game open world”.
Pada dasarnya, LOD mencegah GPU mengolah detail yang tidak lagi terlihat jelas oleh pemain.
Bayangkan satu pohon memiliki 80.000 triangle. Ketika pohon tersebut memenuhi layar, detail itu mungkin berguna. Namun ketika posisinya sangat jauh dan hanya berukuran beberapa puluh pixel, mesh sedetail itu menjadi pemborosan.
Gunakan beberapa tahap LOD yang berubah secara halus berdasarkan jarak atau screen size.
Unreal Engine juga memiliki Hierarchical Level of Detail yang dapat menggabungkan sejumlah Static Mesh menjadi proxy mesh pada jarak jauh. Pendekatan ini membantu mengurangi jumlah Actor yang dirender sekaligus serta draw call per frame.
Transisi LOD sebaiknya diuji agar perubahan model tidak terlalu terlihat.
Sederhanakan Pixel Shader
Pixel shader dapat menjadi salah satu sumber beban terbesar karena kalkulasinya dilakukan pada area layar yang mungkin terdiri dari jutaan pixel.
Resolusi 4K memiliki lebih dari delapan juta pixel. Jika sebuah shader berat memenuhi hampir seluruh layar, operasi yang sama dapat dijalankan dalam jumlah sangat besar setiap frame.
Godot menggunakan perbandingan 4K dengan resolusi VGA untuk menunjukkan betapa drastisnya peningkatan jumlah pixel yang harus diproses renderer modern.
Kurangi texture lookup yang tidak penting dan hindari procedural calculation mahal jika hasil serupa bisa diperoleh dengan pendekatan lebih sederhana.
Unreal menyediakan Shader Complexity view untuk membantu memperkirakan biaya shader berdasarkan instruction complexity, walaupun instruction count bukan satu-satunya faktor yang menentukan performa aktual.
Artinya, angka shader tetap harus divalidasi menggunakan profiling hardware.
Waspadai Fill Rate dan Overdraw
Game dapat memiliki geometry sederhana tetapi tetap mengalami GPU bottleneck karena fill rate.
Particle system adalah contoh klasik.
Satu efek asap mungkin menggunakan beberapa sprite transparan berukuran besar. Ketika puluhan particle bertumpuk, pixel yang sama dapat dihitung berkali-kali.
Overdraw seperti ini bisa menjadi berat, terutama pada resolusi tinggi dan GPU mobile.
Dokumentasi Godot menjelaskan bahwa translucent atau blended object sulit mendapatkan keuntungan yang sama dari depth handling seperti opaque object. Lapisan transparan yang saling menumpuk membuat semua lapisan tersebut perlu dirender.
Kurangi ukuran particle, jumlah layer transparan, dan area screen-space yang tidak perlu.
Buat Lighting Budget untuk Setiap Scene
Lighting sebaiknya diperlakukan sebagai resource yang memiliki budget.
Jangan memberikan dynamic shadow ke semua lampu hanya karena engine memungkinkan.
Pada lorong dengan 20 lampu, mungkin hanya beberapa lampu utama yang benar-benar membutuhkan shadow. Lampu dekoratif bisa menggunakan pencahayaan lebih sederhana.
Hal serupa berlaku pada shadow distance dan shadow resolution.
Untuk object jauh, resolusi bayangan tinggi biasanya sulit dilihat pemain. Menggunakan setting lebih rendah pada jarak tertentu dapat mengurangi beban tanpa perubahan visual yang terlalu mencolok.
Prinsipnya sederhana: investasikan GPU time pada bagian yang memang diperhatikan pemain.
Jangan Lupakan Resolution dan Post-Processing
Jumlah pixel yang dirender memiliki pengaruh langsung terhadap banyak pekerjaan GPU.
Karena itu, menurunkan internal rendering resolution terkadang memberikan peningkatan performa lebih besar daripada memangkas beberapa ribu polygon.
Post-processing juga membutuhkan perhatian. Bloom, depth of field, ambient occlusion, motion blur, screen-space reflection, dan efek lainnya biasanya menambahkan pekerjaan setelah atau selama proses pembentukan frame.
Epic menjelaskan bahwa penambahan post-processing dapat menghasilkan render pass tambahan, sementara lighting dan shading dengan fidelitas lebih tinggi ikut menambah kompleksitas kalkulasi sebuah frame.
Sediakan quality presets agar pemain dapat menyesuaikan efek berdasarkan kemampuan perangkat.
Uji Scene Terburuk pada Hardware Minimum
Game sebaiknya tidak dioptimalkan hanya berdasarkan average scene.
Cari kondisi terburuk.
Jika game action biasanya memiliki lima musuh tetapi kondisi tertentu memungkinkan 50 musuh, profile kondisi 50 musuh. Jika kota pada malam hari memiliki puluhan lampu, gunakan area itu sebagai stress test.
Pengujan juga harus dilakukan pada spesifikasi minimum yang benar-benar ingin didukung.
Developer yang membuat game mobile menggunakan PC high-end akan mendapatkan gambaran performa yang menyesatkan jika tidak rutin melakukan device testing.
Godot secara khusus menyarankan pengujian multiplatform sejak awal karena bottleneck sangat bergantung pada hardware.
Jadikan benchmark scene bagian dari pipeline produksi.
Optimasi Harus Menjadi Proses Berulang
Rendering optimization bukan pekerjaan sekali di akhir development.
Konten terus bertambah. Artist memasukkan material baru, level designer menambah object, programmer membuat efek gameplay, dan lighting artist mempercantik scene.
Scene yang berjalan 16 ms bulan ini bisa berubah menjadi 25 ms beberapa bulan kemudian.
Buat performance budget dan lakukan profiling berkala. Catat frame time CPU, GPU time, draw call, jumlah triangle, memory usage, serta area yang mengalami spike.
Dengan kebiasaan tersebut, masalah dapat ditemukan ketika masih kecil, bukan ketika jadwal rilis sudah dekat.
Cara Mengoptimalkan Rendering Pipeline bukan berarti memangkas seluruh kualitas grafis.
Kuncinya adalah mengetahui bottleneck melalui profiling, lalu mengelola draw call, shader, LOD, lighting, overdraw, resolusi, dan post-processing secara terukur.
Tentukan target FPS serta hardware minimum sejak awal, lalu lakukan benchmark rutin. Mulailah dari scene terberat proyek dan lihat bagian mana yang paling layak dioptimalkan.