Apakah masuk akal untuk menulis mesin game di C? [Tutup]

53

Meskipun C ++ tampaknya menjadi raja, dari apa yang saya katakan C masih banyak digunakan dalam game, terutama di konsol. Namun, akankah menulis seluruh mesin game di C menjadi tidak masuk akal hari ini? Apa, jika ada, beberapa keunggulan yang dimiliki C lebih dari C ++? Mengapa seseorang mungkin ingin menggunakan C lebih dari C ++?

Mencabut Rob Gila
sumber
1
Game konsol menggunakan c ++ FYI!
Alan Wolfe
Saya benar-benar berpikir C akan lebih mudah untuk menulis game hingga skala tertentu, katakanlah puluhan ribu LOC atau lebih, terutama karena itu memungkinkan Anda hanya fokus pada bit dan byte tanpa tipe data yang kompleks dan membangun super cepat dibandingkan dengan C ++. Tetapi setelah skala tertentu (katakanlah mencapai ratusan ribu LOC), saya akan mulai ingin meraih C ++ di mana saya mulai benar-benar menginginkan tipe data yang kompleks, lebih banyak tipe keselamatan, mungkin pengecualian, template, dan bahkan lebih besar lagi di skala (katakan jutaan), untuk hal selain C ++ untuk digabungkan dengan kode C dan C ++.
C juga memiliki keuntungan tambahan yaitu menjadi portabel secara luas bahkan untuk ABI, sehingga menjadi sangat mudah untuk mengambil kode C yang ada dan kemudian mulai menggunakannya dalam bahasa lain dari, katakanlah, sebuah FFI. C ++ sedikit lebih canggung dengan nama mangling, ketidakmampuan untuk dengan aman melewati batas-batas modul, repetisi vtable tidak sama di kompiler, implementasi perpustakaan standar berbeda antara vendor, dll. Secara umum saya menemukan perpustakaan C yang saya tulis bertahan lebih lama tanpa perlu perubahan dan keluar dari gaya, meskipun butuh waktu lebih lama untuk menulis skala dengan itu.

Jawaban:

49

Namun, akankah menulis seluruh mesin game di C menjadi tidak masuk akal hari ini?

Masuk akal, tetapi pertanyaannya adalah apa yang Anda beli? Anda mungkin tidak memerlukan penawaran portabilitas C yang ekstrem, dan memalukan untuk menyerahkan semua fitur yang ditawarkan C ++ kecuali Anda benar-benar secara filosofis menentangnya.

Apa, jika ada, beberapa keunggulan yang dimiliki C lebih dari C ++?

Waktu kompilasi yang lebih baik?

Mengapa seseorang mungkin ingin menggunakan C lebih dari C ++?

Saya pikir itu sebagian besar pilihan estetika. Banyak orang menyukai C karena sederhana dan minimal serta terasa bersih. C ++ memiliki banyak fitur bagus (ruang nama saja yang membuatnya layak untuk digunakan), tetapi juga besar dan berantakan.

banyak sekali
sumber
3
Hingga Id Tech 4
ahli kacamata
9
@Josh: Lebih mudah di-debug !? Program-C terkenal sulit untuk di-debug, sebagian besar karena petunjuk dan manajemen memori. Program C ++ (bila menggunakan idiom pemrograman C ++ yang sebenarnya, yang cenderung menghindari pointer dan manajemen memori bila memungkinkan) adalah beberapa urutan besarnya yang lebih mudah untuk di-debug.
BlueRaja - Danny Pflughoeft
14
C dapat dipahami oleh manusia biasa. C ++ tampaknya memiliki banyak fitur dan tepi kasus programmer berpengalaman belajar bahkan setelah satu dekade menggunakannya setiap hari untuk hidup.
Jari Komppa
13
C ++ adalah bahasa yang besar, tetapi reputasinya yang menakutkan sebagian besar tersebar oleh orang-orang yang baru saja membaca cerita-cerita horor dan belum meluangkan waktu untuk mempelajarinya. Ada banyak yang harus dipelajari, tetapi Anda mendapatkan banyak nilai sebagai imbalan untuk itu. C ++ memungkinkan Anda mengekspresikan banyak hal yang tidak bisa dilakukan C.
murah hati
2
@ BlueRaja-DannyPflughoeft #define malloc(x) my_malloc(x) #define free(x) my_free(x)dan Anda sekarang men -debug memori. Dengan C ++ Anda tidak pernah tahu apa yang akan dialokasikan kapan, karena ada begitu banyak cara untuk mengalokasikan memori (baru, malloc, konstruktor kelas, dll.)
YoYoYonnY
59

Saya telah bekerja secara luas dengan mesin game murni-C yang telah mengirimkan beberapa produk, jadi itu sangat mungkin. Inilah pengalaman pribadi saya dengan bekerja di kedua mesin C vs C ++:

  1. Menggunakan struktur pure-C memungkinkan Anda untuk mengambil keuntungan dari pengetahuan tentang penyelarasan struktur, dan Anda kemudian dapat menggunakan informasi ini untuk membangun objek kegigihan dan lapisan serialisasi objek Anda. Mesin saya bekerja dengan memiliki beberapa parser header sederhana yang secara otomatis akan membuat metadata ini tentang struktur, dan itu membuat beberapa jenis operasi data sepele. Mem-parsing file header C ++ sewenang-wenang pada dasarnya tidak mungkin, dan segera setelah Anda menambahkan fungsi pewarisan dan virtual Anda kehilangan kemampuan untuk mengetahui dengan tepat di mana segala sesuatu berada dalam memori
  2. Waktu kompilasi secara signifikan lebih singkat karena Anda dapat menjaga file header Anda sangat kompak dan mengambil keuntungan dari deklarasi maju struktur.
  3. Debugging dapat ditingkatkan karena tanpa menggunakan templat dan pewarisan, sangat mudah untuk mengetahui dengan tepat apa objek tertentu dan apa yang dilakukannya.

Semua manfaat ini juga dapat dicapai dengan mudah menggunakan kode c ++ tertahan yang menahan diri dari menggunakan templat dan pewarisan pada objek berseri, tetapi merupakan keputusan CTO bahwa akan lebih mudah untuk menegakkan kesederhanaan jika elemen-elemen C ++ yang lebih membingungkan tidak tersedia.

Secara pribadi saya pikir ini sedikit ekstrim, karena saya benar-benar kehilangan kemampuan untuk mendeklarasikan variabel secara masuk akal untuk loop dan banyak kegunaan yang benar-benar sah untuk warisan. Tapi, itu benar-benar tidak menghabiskan banyak produktivitas pada akhirnya semua hal dipertimbangkan

Ben Zeigler
sumber
5
Benar-benar tidak ada yang menghentikan Anda menerapkan warisan dalam C. Dan jika Anda menggunakan C99 Anda dapat mendeklarasikan variabel untuk loop.
jsimmons
15
Akan tidak setuju dengan poin 3. Sama mudahnya untuk menulis kode yang berantakan dan sulit di-debug di C seperti di C ++. Melakukan debug yang lebih baik bukanlah sesuatu yang inheren dalam bahasa C.
Dan Olson
7
Bahkan kode bersih dapat lebih sulit untuk dipahami dalam C ++ - dengan kelebihan beban, templat, fungsi virtual, dan pengecualian, jauh lebih sulit untuk melihat secara sekilas seperti apa aliran kontrol yang sebenarnya.
Kylotan
6
@Dan: Cukup dengan memiliki lebih banyak barang, C ++ lebih sulit untuk di-debug. Anda tentu saja dapat membatasi diri Anda dari menggunakan hal-hal itu, dalam hal ini menjadi mudah untuk debug seperti C - karena menjadi C.
Lebih sedikit barang sebenarnya adalah alasan saya suka C. Sebagai contoh, di CI hanya dapat menyalin bit dan byte sekitar dengan memcpyapa saja karena sistem tipe tidak memungkinkan hal-hal seperti copy ctors dan dtors. Saya dapat menulis kode dengan mengetahui bahwa saya tidak perlu memutar kembali efek samping pada hampir semua baris kode yang diberikan karena saya tidak dapat secara implisit keluar dari suatu fungsi kecuali jika saya secara eksplisit mengembalikannya; tidak ada pengecualian yang dilemparkan. Semua ini membuat penulisan struktur data jadi jauh lebih mudah - dalam C ++ hanya menulis yang memenuhi standar vectorsangat memakan waktu, terutama jika Anda ingin membuatnya ...
18

Saya menulis ulang mesin gim 2D yang ditulis dalam C ++ dan Lua menjadi C dan Lua. Sejauh ini pengalamannya cukup bagus. Jelas melakukan operasi vektor dan matriks tidak berakhir sebagai nice looking di C. Tapi selain itu saya telah menemukan pengalaman yang cukup menyegarkan setelah menghabiskan 10+ tahun sebagai pengembang C ++.

C memiliki sejumlah keunggulan dibandingkan C ++:

  1. Kompiler akan memastikan bahwa tidak ada kode yang dijalankan pada waktu inisialisasi statis. Itu membuatnya benar-benar aman untuk secara statis mengalokasikan data global seperti string yang digunakan misalnya kunci
  2. Transparansi. Dalam penugasan C atau mengalokasikan atau mendefinisikan variabel tidak akan menyebabkan banyak kode untuk dijalankan. C ++ akan secara otomatis menghasilkan copy constructor untuk Anda sehingga Anda memiliki sedikit kendali atas apa yang dieksekusi ketika melakukan penugasan.
  3. Banyak proses debug bisa lebih mudah karena tidak mendapatkan nama fungsi yang rusak
  4. Biasanya memcpy menggunakan C tidak apa-apa, tetapi akan mudah menyebabkan masalah di C ++, karena copy constructor tidak akan berjalan. Mengingat memcpy jauh lebih cepat daripada std :: copy yang penting.

Selain itu ada sejumlah keuntungan untuk masuk ke cara berpikir C. Dalam C ++ saya sering menemukan diri saya membuat hal-hal yang agak terlalu umum dan abstrak. Dalam CI biasanya memotong hal-hal seperti metode get-set dan sering preallocate array berukuran tetap daripada menggunakan array dinamis. Seringkali saya berakhir dengan kode yang lebih pendek dan lebih mudah di-debug dalam C. Struktur data biasanya lebih datar dan lebih mudah dilihat dalam debugger.

Agar adil, saya tidak akan pernah membuat aplikasi secara eksklusif di C. Alasannya, saya menggabungkannya dengan bahasa tingkat yang lebih tinggi seperti Lua yang dapat melengkapi C dengan sangat baik, jika C tidak begitu kuat.

Perangkat lunak id menulis sebagian besar mesin mereka di CI percaya, Anda dapat melihat Kembali ke kastil Wolfenstein yang ditulis dalam C.

Saya menulis tentang beberapa pengalaman saya tentang skalabilitas C vs C ++ dan kelemahan vektor STL dibandingkan dengan array biasa.

Erik Engheim
sumber
11
FYI, dalam setiap contoh yang telah saya periksa (yaitu, saya pikir, darwin gcc dan vc2008), std :: copy hanya akan mengkompilasi panggilan ke memcpy jika kedua jenisnya adalah POD.
BRaffle
3
Juga, RE: STL vektor vs array biasa, mengapa tidak menggunakan bagian vektor yang bagus dan menggunakan pointer C normal alih-alih iterator jika Anda tidak menyukainya? Anda bisa melakukannya & myvector [N]. Ini seperti yang terbaik dari kedua dunia, dengan asumsi kode C Anda melakukan alokasi memori dengan cara yang sama. Atau, untuk loop, lihat BOOST_FOREACH.
Jadikan
1
Terima kasih atas tipnya tentang std :: copy memcpy. Saya tidak tahu itu. Ketika Alexandrescu merawat ini beberapa tahun yang lalu, bukan itu masalahnya. Tentang C ++ iterators. Ini terutama tentang filosofi, saya mencoba memprogram bagaimana C ++ dimaksudkan untuk menjadi program baik untuk orang yang bekerja dengan saya dan untuk mengambil keuntungan dari fitur C ++. Itu terutama dibuat untuk menunjukkan bahwa beberapa perbaikan C ++ seperti wadah STL tidak selalu lebih baik daripada melakukannya dengan cara C lama.
Erik Engheim
7

Seperti yang ditunjukkan orang lain, C ++ membawa keuntungan dari bahu besar tempat Anda berdiri (BOOST, STL, dll.). Pada akhirnya, ini adalah pilihan pribadi, tetapi saya akan memilih C ++ karena sumber daya yang tersedia. Jika ada fitur di C ++ yang tidak ingin Anda gunakan, maka jangan menggunakannya.

user266
sumber
1
Perhatikan bahwa 99% mesin game komersial dan in-house menjauhi Boost dan STL karena berbagai alasan (jaminan kinerja, kemampuan debug, keamanan thread, kontrol).
Kaj
42
Dan 99% statistik dibuat.
BRaffle
Saya merasa seperti itu seharusnya menjadi aturan untuk mengutip semua statistik.
Matt Jensen
3

Saya tidak berpikir siapa pun menggunakan C secara eksklusif akhir-akhir ini, biasanya dicampur dengan bahasa tingkat yang lebih tinggi.

Pemrograman dalam C memiliki beberapa kelebihan dibandingkan, katakanlah, pemrograman dalam C ++. C ++ dapat melakukan banyak hal di bawah tenda yang tidak terlihat oleh pengguna, yang dapat merusak kinerja jika Anda tidak berhati-hati. C ++ dapat juga menjadi mengerikan ketika datang ke penggunaan cache, yang lagi dapat menyakiti kinerja Anda.

Jadi mungkin ada manfaatnya untuk menulis bagian-bagian penting kinerja permainan dengan cara yang mirip C, daripada dengan cara C ++ tradisional. Saya belum pernah mendengar ada orang, dalam beberapa tahun terakhir, yang sebenarnya menulis seluruh permainan dalam bahasa C.

Pada beberapa platform, seperti iPhone, menggunakan C ++ dapat meningkatkan ukuran Anda yang dapat dieksekusi dengan sejumlah kilobyte (saya lupa berapa banyak, maaf), yang merupakan alasan mengapa beberapa pengembang iPhone memilih untuk menulis kode mereka dalam campuran C dan Objective -C.

Sander van Rossen
sumber
3

Saya akan memberi Anda beberapa alasan mengapa tidak masuk akal untuk menulis mesin gim dalam C daripada C ++ hari ini: STL dan BOOST.

Saya tidak bisa membayangkan bagaimana layaknya menulis listimplementasi lain ketika Anda bisa mengandalkan kode yang bekerja di luar kotak (dan Anda tidak perlu menulis!)

Loris
sumber
1
Apakah ada studio besar yang benar-benar menggunakan boost? Bahkan penggunaan STL masih dalam perdebatan, karena mudah dibawa. Setidaknya untuk mesin konsol.
slicedlime
2
Secara pribadi, saya menggunakan Boost.FunctionTypes untuk interaksi c ++ / lua (lihat gamedev.net/reference/programming/features/CPPLuaExport/… ) dan meningkatkan perpustakaan nomor acak untuk pembuatan nomor acak yang seragam (untuk sistem partikel). Juga, Boost.Foreach rapi. BTW, siapa yang peduli jika studio besar tidak menggunakan BOOST? Mereka memiliki tenaga untuk menulis perpustakaan STL mereka sendiri dari awal, saya tidak.
Loris
1
Ya tetapi juga menyadari bahwa ada perpustakaan serupa untuk C juga.
jsimmons
2
Banyak orang menggunakan boost dalam game, saya percaya. Tapi itu jauh dari persyaratan (atau bahkan diinginkan) bagi banyak dari kita.
Dan Olson
6
Teman-teman, apa yang Anda yakini tidak relevan: Anda tahu atau tidak .
o0 '.
3

Menulis mesin gim dalam bahasa C adalah wajar. Cepat dan dapat porting ke beberapa sistem. Misalnya Anda bisa menggunakan untuk Android (dengan menggunakan NDK). Anda dapat menggunakannya untuk iPhone (Objective c hanyalah perpanjangan dari c). Anda juga dapat menggunakannya untuk dan dari OS utama seperti Linux, Mac atau Windows. Jika Anda merasa nyaman dengan c, saya sarankan Anda mencobanya!

Luke Taylor
sumber
2

Tentu itu masuk akal. Saya pribadi tidak akan melakukannya, dan sebagian besar penggemar C yang saya kenal sebenarnya hanya menulis kode seperti-C dalam file .cpp. Tetapi bahasanya cukup mirip dengan tempat yang tidak terlalu penting.

Adapun mengapa seseorang memilih untuk melakukan ini, saya pikir sebagian besar ke filosofi anti-C ++. Secara pribadi saya masih tidak berpikir ini adalah alasan yang baik untuk memilih C daripada "C-style C ++". typedef struct kegilaan adalah alasan yang cukup baik untuk menghindari C, dan ada sejumlah lainnya.

Sayangnya C dan C ++ keduanya bahasa yang cukup mengerikan ketika kita sampai ke sana. Itulah salah satu alasan orang mencoba melakukan banyak kode dalam skrip mereka dalam beberapa tahun terakhir.

Jika Anda mencari contoh orang yang bekerja di C, Anda dapat mengabaikan id karena saya ingat pernah membaca bahwa mereka telah meninggalkan C sejak lama. Cryptic Studios (Star Trek Online) melakukan semua pengembangan mesin mereka di C, meskipun. Sejauh yang saya tahu, ya, itu karena filosofi lebih dari karena keuntungan nyata.

Dan Olson
sumber
0

Iya dan tidak. Ya saya telah melakukannya beberapa tahun yang lalu tetapi saya membutuhkan permainan saya untuk berjalan dalam 3D pada server remote 64 bit unix (bukan linux) dengan para pemain di terminal bodoh. Itu tidak sepele. C bisa menyenangkan adalah Anda ingin mengintegrasikan LUA tapi saya akhirnya dapat bekerja di C ++ jadi saya akan mengatakan ya itu mungkin tapi jangan lakukan itu.

Jeff
sumber
0

Mungkin jawaban yang bagus adalah "gunakan keduanya"?

Ketika saya mendengar bahwa proyek panda3d dapat dioptimalkan, membunuh bottleneck baik menggunakan beberapa cython atau baik recode bagian-bagian itu.

Sebagian besar waktu, bagian-bagian yang perlu dioptimalkan adalah bagian dengan banyak iterasi dan bersarang atau dengan banyak komputasi numerik, jadi tebakan saya (liar) adalah bahwa satu kompromi yang adil adalah menggunakan kedua bahasa, menggunakan C untuk bagian yang menyertakan banyak pemrograman tingkat rendah, jadi Anda tidak dapat melakukan penyalahgunaan bahasa C ++ untuk bagian yang membutuhkan kecepatan, dan C ++ untuk sisa permainan.

Idealnya Anda melakukan bagian cepat dari menjaga mesin dengan tingkat tinggi dalam pikiran, dan kemudian menggunakan bahasa scripting atau C ++ yang akan menggunakan jauh lebih sedikit sarang / loop.

Tentu saja Anda tidak akan pernah bisa membuat mesin seperti itu yang cocok dengan semua gim yang perlu dilakukan pengembang, kecuali jika Anda mendedikasikan mesin Anda untuk jenis gim khusus ...

Tapi jangan terima saran saya karena saya bukan pengembang game berpengalaman atau pengembang berpengalaman ... Saya pikir C memaksa Anda untuk menulis kode cepat, sambil menulis kode C ++ yang baik dan cepat untuk proyek sebesar game adalah hal yang berbeda ...

jokoon
sumber
0

C bekerja untuk John Carmack , Anda mungkin mendapatkan banyak keuntungan dengan menggunakan C, tetapi sampai Anda sampai di sana untuk mendapat manfaat dari mereka, mungkin Anda perlu waktu.

Di sini Anda dapat menemukan daftar mesin permainan yang beberapa di antaranya ditulis dalam huruf C, mungkin Anda bisa mendapatkan beberapa wawasan tentang cara melakukan mesin permainan C dengan menelusuri kode sumbernya.


sumber
0

Kode C biasanya kode C ++ yang valid.

Masalah utama dengan C ++ menggunakannya secara salah ( Linus Torvalds membencinya karena alasan ini , ia juga memiliki beberapa masalah lain dengan portabilitas pustaka dan seterusnya, ia bekerja pada level sistem operasi dan harus dapat menjalankan berbagai hal secara acak) chip di luar sana).

Misalnya hampir tidak ada keuntungan menggunakan array cstyle [] di atas c ++ std :: vector <> (atau wadah serupa).

Vektornya adalah typesafe dan dapat diperiksa batasnya (Anda dapat mengakses elemen menggunakan get () atau [], bahkan jika Anda tidak menggunakan metode cek array, Anda masih dapat meminta ukuran daripada mengangkutnya dengan pointer).

Tetapi vektor bisa lebih lambat jika, misalnya, Anda tidak mendeklarasikan ukuran default di konstruktor. Juga menambahkan hal-hal ke vektor dapat menyebabkan perlambatan jika kemudian membutuhkan ukuran. C ++ 11 menambahkan banyak keuntungan juga seperti inisialisasi seragam (Anda sekarang dapat mendeklarasikan dan menginisialisasi vektor menggunakan sintaks yang sama) dan ada konstruktor pemindahan yang memungkinkan Anda menghindari penyalinan. Anda bahkan dapat membuat inisialisasi khusus Anda sendiri (jika Anda ingin melakukan sesuatu selain menggunakan malloc karena alasan tertentu).

Atau tentu saja jika Anda perlu mengubah ukuran hal-hal, maka vektor masih lebih mudah untuk melakukannya dengan, Anda tidak perlu dipusingkan dengan malloc, menyalin secara manual dan sebagainya.

C ++ memberi Anda kode berorientasi objek. Ketika dikompilasi, itu akan sama efisiennya karena itu benar-benar hanya sebuah abstraksi untuk manusia yang bekerja dengan kode. Meskipun hal-hal seperti konstruktor dapat memperlambat pembuatan objek. Tetapi Anda membutuhkan konstruktor untuk menetapkan nilai default atau Anda dapat menginisialisasi objek tanpa menggunakan konstruktor (dengan mengabaikan () dari).

Tetapi orientasi objek membuat game pemrograman lebih mudah. Game sering berurusan dengan objek.

David C. Bishop
sumber