OpenGL vs fisika?


8

Saya sangat baru dalam pemrograman game dan saya sedang dalam proyek pertama saya. Saya sampai pada titik bahwa saya memerlukan saran ahli:

Sekarang agar fisika game dapat bekerja pada objek, perlu mengetahui posisi masing-masing objek dan orientasinya dalam ruang 3D. Sebagai bagian dari simulasi dan karena benda bergerak (perubahan posisi) dan perubahan orientasi (rotasi).

Apakah ini berarti rotasi dan perhitungan terjemahan dilakukan dua kali? Satu dalam fisika dan lainnya dilakukan dengan menggunakan glTranslate dan glRotate sebelum menggambar objek?

IMO ini seharusnya tidak terjadi. Juga menghitung terjemahan dan rotasi di bagian fisika akan menyebabkan mereka menggunakan CPU, bukan GPU yang akan mempengaruhi kinerja.

Bagaimana ini dilakukan oleh para ahli dan saran apa yang Anda berikan tentang arsitektur game yang efisien untuk menangani situasi seperti itu?

Jawaban:


17

Ada sejumlah alasan mengapa rendering dan pipa-pipa fisika secara tradisional tetap terpisah. Ingatlah ketika saya daftar ini, bahwa ini bukan hanya tentang permainan. Pertanyaan Anda menyentuh pada aplikasi apa pun yang menggunakan teknologi render 3D seperti OpenGL, pesaing, atau pendahulu.

  • Tidak setiap aplikasi yang menggunakan 3D, membutuhkan fisika. Ingatlah bahwa OpenGL tidak hanya dibuat untuk permainan, penggunaannya mencakup semuanya, mulai dari simulasi medis hingga pemodelan statistik penjualan, simulasi lalu lintas udara hingga reaksi kimia yang rumit, dan seterusnya dan seterusnya.
  • Setiap sistem yang melayani banyak tujuan menjadi encer dalam hal efisiensi. Pipa grafik harus sangat cepat. Saat Anda mulai memperkenalkan titik-titik di mana pipa harus berinteraksi dengan subsistem lain seperti memori sistem utama (tempat kode Anda berada), Anda akan mengalami pengurangan efisiensi dalam urutan besar-besaran. Perangkat keras pada kartu grafis Anda secara khusus dipersempit dan sangat dioptimalkan untuk mendorong piksel , dengan biaya besar dan bertahun-tahun penelitian yang sangat kompetitif.

  • Sifat matematika dan struktur data di sekitar operasi fisika (khususnya deteksi tabrakan dan resolusi, yang tanpanya tidak ada fisika ) sebagian besar berbeda dari matematika yang diperlukan untuk rendering.

  • Ada solusi yang berhubungan dengan fisika dalam perangkat keras. Tetapi tidak seperti cara kita membuat, cara kita melakukan fisika dalam situasi apa pun sangat berbeda. Indikasi paling mendasar dari ini adalah bahwa fisika Newton tidak cocok untuk semua ukuran; ada cara lain untuk memodelkan fisika secara matematis yang lebih sesuai dalam situasi lain, seperti mekanika Hamilton. Dan dalam gim khususnya, setiap gim individual dapat memilih untuk memodelkan fisika secara berbeda, baik dalam 2D ​​atau 3D. Ini bahkan tidak perlu mencerminkan fisika dunia nyata! - Karena permainan adalah produk dari imajinasi. Dengan kata lain, fisika pada akhirnya adalah bagian dari dinamika gim Anda, dan itu dapat berubah dari gim ke gim lainnya - apalagi semua solusi lain yang menerapkan teknologi seperti OpenGL.
  • Simulasi fisika secara akurat pada level vertex-by-vertex, untuk sebagian besar, saat ini bukan pilihan yang layak. Mengingat tingginya jumlah poli model di sebagian besar game, dan kesulitan yang melekat pada deteksi tabrakan yang melibatkan polihedra cekung, tidak semudah hanya menghitung fisika dari model yang disediakan. Bagi banyak, jika bukan sebagian besar game 3D, volume yang terikat dalam bentuk silinder atau kotak digunakan untuk menyederhanakan deteksi tabrakan, di mana tingkat deteksi tabrakan semacam itu bahkan diperlukan. Mengingat teknologi saat ini, tingkat pemrosesan yang terlibat tidak akan menyisakan banyak ruang untuk sisa logika permainan Anda untuk dijalankan. Bahkan PhysX Nvidia membutuhkan polyhedra cekung yang rumit untuk didekomposisi menjadi polyhedra cembung yang lebih sederhana, untuk simulasi fisika.

  • Kartu grafis Anda menghasilkan perspektif dengan transformasi yang dilakukan. Itu berbeda dari transformasi yang dilakukan dalam fisika, yang tidak ada hubungannya dengan perspektif seperti itu - itu hanya menghitung posisi dasar dan orientasi di dunia Anda. Jika Anda tahu tentang MVC, Anda akan memahami bahwa ada perbedaan nyata antara data yang Anda pegang dalam aplikasi Anda, dan bagaimana Anda menyajikan data itu.

Industri teknologi komputer didorong oleh kebutuhan, dan sementara visualisasi adalah kebutuhan yang hampir universal, simulasi fisika sama sekali tidak universal baik sebagai persyaratan atau dalam hal implementasi masing-masing.

Jadi saran saya adalah, berhentilah khawatir tentang melawan arus dan mulailah fokus pada bagaimana melakukan dua hal yang perlu Anda lakukan: rendering dan fisika. Anda tidak akan mendapatkan data di pipeline pemrosesan kartu grafis Anda (CUDA / OpenCl adalah pengecualian): Anda mendorong segitiga dan data material, itu memompa dunia 3D Anda sebagai gambar bergerak.


Sebagai penutup terakhir, pertanyaan Anda bukan tanpa akal. Keinginan untuk basis gabungan untuk fisika dan rendering, dan fakta bahwa matematika titik-mengambang bisa jauh lebih lambat daripada titik tetap, menunjukkan kepada kita mengapa teknologi voxel melihat kebangkitan besar minat: mereka menyederhanakan seluruh dunia hingga diposisikan dengan grid. , polyhedra cembung yang sejajar sumbu. Ini sangat meningkatkan kinerja, dengan mengurangi jumlah vektor vektor titik-mengambang yang diperlukan untuk operasi fisik, karena Anda sekarang bekerja terutama dalam kisi spasi-terbagi, instable, integer-indexed. Kisi yang sama ini dapat digunakan untuk rendering dan fisika, khususnya karena Anda dapat menggunakan resolusi kisi yang berbeda untuk dua subsistem berbeda ini (saat menggunakan solusi berbasis octree seperti SVO).


3
Titik peluru kelima perlu lebih ditekankan: Anda biasanya menggunakan geometri tabrakan yang terpisah dari geometri visual.
jhocking

Jawaban Anda sangat mendalam. Terima kasih banyak. Saya telah berpikir untuk menggunakan OpenCL untuk kode fisika. Ini akan menyebabkan operasi matriks transformasi yang telah saya bicarakan akan dilakukan pada GPU dan seharusnya memberikan sedikit peningkatan kinerja. Apa yang Anda pikirkan, Apakah ini ide yang bagus?
M.Sameer

3
Itu adalah suatu kesenangan. "Kita harus melupakan efisiensi kecil, katakanlah sekitar 97% dari waktu: optimasi prematur adalah akar dari semua kejahatan" -Donald Knuth. Fokus pada logika Anda, dan optimalkan sesuai kebutuhan Anda. Anda terlalu peduli dengan kinerja pada apa yang saya anggap merupakan tahap yang sangat awal dalam pengembangan game Anda. Sangat mudah untuk memperlambat segalanya saat berbagi pemrosesan antara CPU dan GPU seperti halnya dengan CUDA / OpenCL. Google "CUDA lambat", Anda akan menemukan banyak hasil. Apa yang Anda kirim ke GPU harus dikumpulkan dengan sangat hati-hati. Jangan berharap melakukan menulis setiap beberapa milidetik, dll.
Engineer
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.