Gangguan Prosedural dalam Kontrol: Pelajaran dari Pengalaman Perbaikan

Di GDC musim panas ini, artis senior VFX, Remedy Johannes Richter berbicara tentang bagaimana penghancuran prosedural diterapkan di game terbaru studio, game aksi mistis, Control.



Dalam kuliahnya, ia memperhatikan prinsip dasar membangun banyak efek dalam game, atau prinsip granularitas. Bagaimana studio menerapkan sistem penghancuran realistis skala besar, batasan sumber daya dan kinerja platform yang dihadapinya, pengoptimalan apa yang dibuat, dan pelajaran apa yang dipetik dari semua ini - lebih jauh dalam materi.







Jadi, pertama tentang tantangan yang dihadapi studio.



Permainan berlangsung di dalam gedung agen pemerintah bergaya brutalist yang memiliki beberapa fitur supernatural seperti dinding yang bergerak.



Struktur kantor pusat harus terlihat dapat dipercaya, karena ini adalah lembaga pemerintah, tempat ribuan pegawai layanan mengerjakan tugas-tugas rutin. Meja, telepon, mug, MFP - semua ini adalah atribut yang biasa untuk seorang pekerja kantoran yang Anda harapkan untuk dilihat di tempat kerja, dan dengan kehadiran mereka mereka membantu menceritakan secara kualitatif kisah tentang tempat ini. Brutalisme berarti berton-ton beton, tetapi tidak hanya: di sini kami memiliki kayu dan kaca, yang menciptakan tampilan paling sesuai untuk bangunan layanan khusus.







Ketika berbicara tentang kehancuran, hal pertama yang harus dipikirkan adalah kebijaksanaan. Tim pengembang ditugaskan untuk mengatur lingkungan interaktif yang kaya yang segera menciptakan perasaan mampu berinteraksi dengan hampir semua hal di dalamnya.







Jelas, studio menghadapi batasan tertentu selama pengerjaannya. Interaksi dengan objek harus terlihat dan terasa realistis. Pemain harus memiliki kebebasan bertindak terkait penghancuran, tetapi tidak terbatas, karena kemungkinan permainan bergantung pada kinerja platform, memori, dan persyaratan untuk kecerdasan buatan. Pada saat yang sama, tim yang diserahi tugas melaksanakan perusakan lingkungan ternyata cukup kecil, yang juga harus diperhitungkan dalam pekerjaannya.







Jadi, penghancuran dalam game didasarkan pada prinsip perincian. Ini juga merupakan dasar dari banyak efek khusus dalam sinematografi. Artinya, alam tidak dikuantifikasi. Ini adalah kanvas berkelanjutan yang dibuat dari berbagai objek - dari yang besar hingga kecil, dari benda padat berskala besar hingga debu dan asap. Jika ada sesuatu yang tidak tercermin di layar, seluruh gambar tidak akan berfungsi.



Dalam mesin permainan, prinsip ini dapat diterapkan dalam tiga tingkat detail yang berbeda. Benda pada mereka disajikan dalam bentuk benda kaku (Rigid Bodies), bagiannya, bagian alat peraga, alat peraga itu sendiri dan lingkungan. Yang terakhir dalam hal ini adalah sejenis jaring statis yang dapat ditumbukkan oleh objek interaktif. Partikel mesh, hierarki solid, dan stiker material memberi objek lebih detail pada lapisan tertentu. Jadi, dari benda padat kita beralih ke fragmennya dan kemudian ke fragmen. Lapisan terakhir adalah partikel itu sendiri. Sprite partikel, partikel bara, pasir, dan lainnya, semuanya berperan besar dalam mengisi gradien ini.







Tangkapan layar di atas menunjukkan lingkungan statis. Kelihatannya cukup kosong, meskipun ada beberapa detail di sini: misalnya, di latar belakang Anda bisa melihat susuran tangga.







Sungguh menakjubkan bagaimana persepsi berubah ketika kita mulai mengisi ruang dengan objek yang dapat berinteraksi langsung dengan kita.







Adapun alur kerja di Remedy, sebenarnya cukup sepele. Seniman lingkungan menyediakan modul geometri level dan properti untuk perakitan, setelah itu departemen VFX menyiapkan rig dan animasi penghancuran sinematik. Akhirnya, setelah itu, hasilnya dikirim ke mesin milik Remedy, Northlight.



Itu perlu untuk memutuskan pendekatan bagaimana segala sesuatu akan bekerja, dan tim menetapkan satu prosedural.



Apa artinya?



Pendekatan prosedural adalah pemrosesan dan interpretasi data berbasis aturan.







Informasi tentang dunia game diwakili oleh model yang berisi metadata tentang materi. Jadi, Anda bisa mengatur, misalnya, bahwa kursi bangku terbuat dari kain, alasnya dari beton, tanaman sebenarnya adalah tanaman. Setelah menentukan materi, Anda dapat merumuskan seperangkat aturan terbatas untuk masing-masing materi, menentukan reaksi terhadap semua tindakan yang dapat dilakukan dalam permainan. Misalnya, saat memotret dari tanaman, potongan daun beterbangan, beton pecah menjadi serpihan, dan pipa logam berubah bentuk, dan air menyembur keluar. Kemudian semua data dialihkan ke mesin, dan mesin sudah bereaksi terhadap setiap interaksi yang sesuai.







Jadi mengapa penghancuran prosedural?



Karena ada kebutuhan untuk pergantian tindakan yang cepat dan konsisten, perilaku yang dapat diprediksi dalam kondisi yang ditentukan dengan jelas. Ada ratusan aset yang terlibat dalam permainan tersebut. Pada gambar di atas, Anda dapat melihat semua jenis balok yang menyusun ruangan, dinding, kolom, tangga, pagar, dan lainnya. Di bawahnya terdapat berbagai alat peraga: meja, kursi, vas, tanaman, komputer, telepon. Untuk melaksanakan penghancuran berbagai objek seperti itu, tim yang terdiri hanya 1-3 orang dipilih. Oleh karena itu, perlu untuk menentukan terlebih dahulu pola-pola yang menurut dunia bekerja: jika suatu objek dipengaruhi dengan cara tertentu, itu harus rusak persis seperti yang ditentukan untuk metode penghancuran material yang dipilih.







Jadi, perlu mengatur perilaku tertentu tergantung pada materi. Sehingga saat Anda menembak ke pohon, ia akan terbang berkeping-keping. Atau, jika Anda menembak kaca, kaca itu akan pecah menjadi pecahan. Pada saat yang sama, partikel dan stiker juga harus berperilaku dengan cara tertentu sesuai dengan bahan pembuatnya.







Setiap material memiliki geometri rekahannya sendiri, yang ditentukan oleh level yang berbeda. Dalam contoh, kita melihat sepotong pagar, yang dasarnya adalah beton, kemudian penyangga logam dan, terakhir, kayu. Dari kiri ke kanan, tahapan ditampilkan saat mereka putus:



  • Level A menunjukkan kerusakan pada beton. Tidak ada stiker di sini, karena masih sedikit retakan. Terlihat bahwa penyangga agak bengkok.
  • Level B. Metal sudah hilang, tetapi beton dan kayu yang rusak lebih banyak.
  • C : , .


Sekarang mari kita bayangkan bahwa kita menabrak sudut tertentu dari suatu objek - maka benda itu tidak boleh rusak sepenuhnya, hanya sebagian saja.







Jadi, ada benda padat di Kontrol, yang merupakan benda padat. Tetapi ada juga detail yang dihubungkan dengan tautan. Ini adalah benda kaku yang sama yang dapat dipisahkan oleh tabrakan majemuk.







Bagian dibuat selama inisialisasi, berbagi collider umum, dan bergerak sebagai satu bagian hingga pecah. Mereka terhubung satu sama lain oleh permukaan yang saling bersentuhan.







Mari kita bicara tentang koneksi. Mereka dibuat dalam hierarki geometris berdasarkan metadata. Padatan dihubungkan satu sama lain dengan semacam engsel - misalnya, dalam kasus pintu atau laci. Mereka dapat dihancurkan secara dinamis, lagi-lagi oleh kekuatan dorongan hati.







Ada fisika khusus penghancuran senyawa. Mereka tidak merusak objek - yaitu, jika Anda membuat lubang di pintu, pintu akan tetap menjadi objek utuh, disatukan oleh koneksi internal. Jadi, jika Anda memecahkan blok induk RB1, pintu tidak akan jatuh dari engselnya: sebagian masih akan menempel pada bukaan, tidak terpengaruh oleh benturan. Dan pintu dengan lubang di tengahnya masih bisa ditutup dan dibuka seperti yang diharapkan. Dengan demikian, pengembang ingin menghindari situasi di mana objek benar-benar rusak, terlepas dari di mana dan apa kekuatan pukulan itu jatuh, seperti yang terjadi di beberapa game.







Selama simulasi, mesin asli Northlight menjalankan logika penghancuran dan menentukan peristiwa dan partikel mana yang bereaksi. Mesin fisika NVIDIA kemudian memodelkan benda kaku dan mencoba menyesuaikannya dengan batasan permainan.







Penghancuran itu sendiri diwujudkan sebagai berikut. Kami memiliki beberapa geometri masukan. Kadang-kadang perlu untuk mempersiapkan model sebelumnya, mengatur geometri ikatan dan menentukan dalam kasus apa bagian mana yang dapat rusak. Model tersebut kemudian dikirim ke Houdini dan diproses di sana. Destruction in Houdini adalah penyiapan HDA berskala cukup besar yang melakukan reaksi berbasis material dan menulis data ke memori. Kadang-kadang saya harus memperbaiki secara manual dan mengatur beberapa metadata fisika untuk memastikan pengaturannya benar, terutama dalam hal koneksi. Kemudian semua data ditransfer ke mesin, yang digunakan untuk membuat dunia game.







Alat penghancur di Houdini terlihat seperti ini. Katakanlah kita memiliki balok beton sebagai masukan. Penting untuk menentukan area mana yang bisa pecah dan mengatur material. Dalam hal ini, blok akan melakukan penghancuran sesuai dengan aturan yang ditetapkan untuk beton, mengelolanya, dan membuat hierarki yang berbeda dalam hal rendering geometri dan tumbukan. Kemudian Anda perlu memastikan bahwa pemodelan dilakukan sesuai anggaran dan gaya yang Anda tetapkan. Setelah itu, Anda dapat mengekspor model tersebut ke mesin.







Sepertinya ini di mesin. Anda memiliki semacam hierarki yang membawa informasi tentang lapisan A, B, C, dll. Ini termasuk nama material, apakah objek tersebut statis atau tidak, data tentang koneksi, jenisnya, dan sebagainya. Hierarki diwakili oleh level, dan properti fisik berbeda tergantung pada nama materialnya. Jika namanya ditentukan dengan benar, fisika diproses oleh mesin. Kami akan membicarakan masalah nama nanti.







Di atas adalah skenario simulasi benda kaku. Jesse menembakkan benda di sekitarnya, dan benda itu meledak, dengan demikian menyadari fisika kehancuran.







Karena lingkungan yang dapat dirusak adalah hal yang membutuhkan banyak sumber daya, dan konsol serta PC memiliki batasan kinerja mereka sendiri, tim dihadapkan pada tugas untuk mengoptimalkan sistem agar tidak membebani perangkat.



Karena perlu menyesuaikan dengan anggaran kinerja tertentu, batas ditetapkan pada 200 padatan aktif di layar - jadi objek di luarnya hilang sama sekali.



Dalam kasus peristiwa yang melibatkan banyak objek yang bergerak cepat, terjadi penundaan tabrakan sehingga sistem memiliki waktu untuk melakukan semua penghitungan.



Mode tidur juga diterapkan untuk item yang tidak digunakan. Misalnya, jika balok beton jatuh ke lantai, tidak ada yang mengharapkannya mulai melompat seperti bola, sehingga dapat "tertidur" dengan cukup cepat. Ini berlaku untuk banyak item di dalam game. Untuk alasan yang sama, mereka dapat ditumpuk satu sama lain, dan dengan cara yang sama mereka tidak bergerak.



Selain itu, celah antar item diisi dengan partikel. Jadi, ketika sebuah benda hancur, debu atau serpihan terbentuk di sekitarnya.







Segala sesuatu dalam permainan ini sistematis dan didorong oleh peristiwa. Peristiwa partikel berikut ini ada:



  • dampak peluru, yang memiliki hasil berbeda tergantung pada bahannya;
  • memutus hubungan antara dua bagian; dalam hal ini, terjadi pengikisan, melepaskan partikel;
  • penghancuran total suatu objek, yang mengarah pada disintegrasi menjadi partikel.






Di atas menunjukkan proses pengeditan partikel. Tepat di dalam game, Anda dapat menempatkan sistem partikel tertentu dan kemudian mengubahnya. Dalam hal ini, frekuensi pembentukan percikan berubah begitu saja. Menariknya, Anda bisa mengubahnya secara real time dan langsung mendapatkan respon instan, lalu memutarnya lagi dan melihat bagaimana efeknya bekerja. Diterapkan dengan cara ini, loop iterasi cepat memungkinkan Anda memoles hal-hal seperti ini hingga ditampilkan dengan benar.







Fitur lain dari partikel adalah pemodelan standar. Dari waktu ke waktu, tim harus menggunakan lapangan jarak bertanda tangan (SDF). Berkat ini, dimungkinkan untuk memastikan bahwa benda-benda tidak jatuh ke lantai, yang akan terlihat sangat aneh.







Dalam contoh di atas, benda yang dapat dirusak adalah simbiosis partikel dan benda padat. Inilah yang kami lihat. Ledakan tersebut menciptakan debu di udara karena lapisan partikel tambahan yang mengisi celah yang hilang dalam gradien granularitas.







Dan yang terakhir - stiker bahan, yang banyak terdapat di dalam game dan dibuat secara dinamis. Pada dasarnya, itu hanyalah tekstur yang diterapkan di atas objek untuk menciptakan tampilan kehancuran.



Jika ada yang rusak, stiker retak akan muncul pada item tersebut. Mereka biasanya dibuat di Houdini atau serupa. Di Control, pemilihan decal yang diinginkan dibuat secara dinamis berdasarkan bahan. Ini juga membantu menggunakan sebagian besar geometri statis. Seperti yang diperlihatkan di awal, selalu ada banyak objek statis di sekitar kita, yang juga dapat terkena pengaruh yang harus diperhitungkan.







Seperti inilah kelihatannya. Jika Anda merusak lantai, poligon itu sendiri akan tetap sama, tetapi dengan munculnya stiker, penampilannya bisa banyak berubah. Perlu dicatat bahwa mereka cukup ekonomis dan efektif digunakan.







Jadi kami memiliki partikel, padatan, dan stiker. Dalam contoh ini, saya harus mempelajari beberapa trik, karena alat ledakan sederhana tidak akan menghasilkan begitu banyak stiker. Sekarang Jesse "melempar" sebuah benda yang bisa meninggalkan penyok di lantai. Pada saat yang sama, lantainya tetap berupa poligon statis, tetapi berkat stikernya, tanda benturan tetap ada di atasnya.







Mari kita juga menyentuh topik alat peraga khusus. Ada banyak item dalam game untuk disebarkan - alat pemadam kebakaran, komputer, lampu, dan sejenisnya - yang tidak dapat dibuat sepenuhnya secara prosedural. Seniman lingkungan masih harus mengatur efek untuk masing-masing secara manual. Namun, dari kehadiran mereka, dunia dalam game hanya terlihat lebih kaya dan lebih beragam.



Jadi, pelajaran apa yang dipelajari studio dari Control?



Hal-hal berikut ini patut disinggung di sini:



  • ;
  • ;
  • ;
  • .






Yang pertama adalah kualitas geometri. Geometri masukan yang tidak konsisten dapat disebabkan oleh penskalaan dan orientasi yang salah, tetapi juga dari penugasan material yang salah. Terkadang kualitas jaring bisa menjadi terlalu rendah, dan ini juga akan berdampak buruk pada hasilnya. Itu juga terjadi ketika Anda memecahkan suatu benda, Anda menyadari bahwa tidak ada apa-apa di dalamnya, dan ini salah. Untuk menghindari masalah seperti itu, perlu dilakukan penyempurnaan data masukan, standarisasi seluruh pipa geometri sehingga saat mengekspor, sistem memperingatkan jika ada sesuatu yang tidak memenuhi kriteria dan perlu diperbaiki. Ini akan membantu menghindari putaran umpan balik yang terus-menerus antara departemen yang berbeda untuk mencari kapan tepatnya masalah muncul.



Selain itu, alangkah baiknya memiliki alat bawaan sehingga Anda dapat memodelkan suatu objek dan segera melihat bagaimana tampilannya ketika dihancurkan. Jelas ini menimbulkan tantangan untuk membuat lebih banyak alat dengan antarmuka yang lebih baik, tetapi itu sepadan dengan masalahnya.







Kami terbiasa memberi nama untuk hal yang berbeda. Tetapi masalahnya adalah nama-nama ini mungkin salah. Misalnya di Control ada 17 sebutan berbeda untuk material "beton", dan ini tidak bisa disalahkan pada siapapun, karena selalu ada faktor manusia. Saran Richter adalah untuk menghilangkan standar penamaan sama sekali. Lebih baik hanya memiliki satu API metadata. Dengan cara ini, tidak peduli alat apa yang digunakan seniman untuk membuat props, dimungkinkan untuk mengekspor data ke mesin langsung dari sana tanpa langkah perantara.







Tutorial selanjutnya sebagian besar khusus Houdini. Intinya adalah sering, ketika mulai mengerjakan sesuatu, Anda mengulanginya berkali-kali dalam prosesnya, membuat beberapa add-on, dan Anda perlu memastikan bahwa bahkan setelah dua tahun bekerja Anda dapat membuka file sumber meskipun bahwa alat kerja sudah berubah 20 kali. Ini berarti Anda memerlukan semacam standardisasi untuk bekerja dengan HDA. Inilah yang sedang dikerjakan oleh Remedy: untuk memastikan bahwa semuanya didistribusikan dengan benar, sehingga Anda tidak pernah kehilangan versi apa pun dari alat tersebut dan selalu memiliki kesempatan untuk mengulangi apa yang Anda lakukan di masa lalu.



Penting untuk diperhatikan di sini bahwa ketika Anda membuat alat otomatis, sebenarnya Anda menggunakan perangkat lunak yang sama seolah-olah Anda melakukan semuanya secara manual. Dan selama mereka memiliki backend yang sama, semuanya harus benar-benar konsisten.







Kinerja dan pengujian adalah beberapa aspek pengembangan yang paling penting.



Tes awalnya tidak otomatis di Remedy. Setelah menambahkan objek baru ke level, Anda harus melewatinya secara manual untuk memeriksa bahwa semuanya bekerja dengan benar. Tapi kemudian ada sesuatu yang berubah di mesin, backend berubah, ada yang dioptimalkan, dan setelah itu diperlukan pengujian ulang. Ini cukup berbahaya, karena Anda pasti akan lupa untuk mengecek sesuatu. Singkatnya, bukan cara terbaik, yang mengarah pada potensi akumulasi bug.



Aspek kedua adalah pengujian kinerja. Untuk waktu yang lama, Remedy tidak mengukur metrik apa pun yang signifikan seperti frekuensi gambar atau waktu komputasi. Oleh karena itu, masalah kinerja seringkali terlambat ditemukan.







Yang bisa dilakukan di sini adalah, pertama-tama, meningkatkan indikator kinerja. Penting untuk menentukan peningkatan parameter mana yang akan mempengaruhi permainan lebih baik atau lebih buruk, untuk mengandalkan ini saat mengoptimalkan dan menentukan anggaran yang tidak dapat dilampaui.



Selain itu, pengujian otomatis dapat membantu Anda, di mana Anda juga dapat memvariasikan output untuk menunjukkan dampak perubahan pada mesin dengan lebih baik.







Anda juga dapat mengidentifikasi dan mengambil tindakan terhadap penurunan kinerja. Misalnya, untuk memastikan bahwa selama peristiwa berskala besar, beberapa objek melewati tingkat kehancuran menengah - katakanlah, dari padatan langsung menuju partikel.



Pengukuran lain adalah zonasi kawasan tergantung pada beban yang diharapkan. Gagasan ini didasarkan pada fakta bahwa kita sendiri dapat menentukan pada wilayah mana tindakan penanggulangan tertentu akan diterapkan agar tidak diterapkan pada semua aset pada tingkat yang tidak diperlukan. Misalnya, jika musuh dengan granat segera tiba tepat waktu ke Jesse, jelas, akan ada terlalu banyak kerusakan di lokasi, dan selama serangan mereka, proses menghasilkan kehancuran dapat dipercepat.



Sebagai hasilnya, saya ingin mencatat bahwa tim Remedy telah melakukan pekerjaan yang monumental, di mana Anda bisa mendapatkan banyak ide tentang penerapan dan optimalisasi sistem prosedural perusakan lingkungan.



All Articles