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 ++?
53
Jawaban:
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.
Waktu kompilasi yang lebih baik?
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.
sumber
#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.)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 ++:
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
sumber
memcpy
apa 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 standarvector
sangat memakan waktu, terutama jika Anda ingin membuatnya ...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 ++:
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.
sumber
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.
sumber
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.
sumber
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
list
implementasi lain ketika Anda bisa mengandalkan kode yang bekerja di luar kotak (dan Anda tidak perlu menulis!)sumber
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!
sumber
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.
sumber
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.
sumber
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 ...
sumber
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
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.
sumber