Pertama-tama saya ingin memiliki jawaban yang nyata, saya selalu berusaha untuk mendapatkan lebih banyak dari berbagai sumber dan artikel, dan ketika saya membaca hal-hal seperti C ++ lambat karena memiliki fungsi virtual dan karena C ini lebih baik , saya benar-benar tidak tahu harus berkata apa dan berpikir sebagai manusia dengan otak. Jadi tolong hindari untuk mencapai level ini dalam jawaban Anda.
Pertanyaan saya adalah tentang perpindahan besar-besaran ke C ++ yang selesai, kurang lebih, dengan Doom 3.
Hal yang menarik bagi saya adalah bahwa sebelum tonggak sejarah ini, sebagian besar mesin game dan game itu sendiri ditulis dalam bahasa C, seperti itu sejak era Gempa . Menarik juga untuk dicatat bahwa perangkat lunak ID memutuskan untuk sepenuhnya menulis ulang basis kode untuk IdTech 4 di C ++, sejumlah besar pekerjaan yang sejujurnya tidak dapat saya pahami tanpa daftar alasan yang sangat bagus.
Saya fokus pada Doom 3 karena saya terutama tertarik pada dunia OpenGL dan dalam perjalanan saya mencoba untuk tetap fokus pada topik ini, jadi saya banyak membaca tentang ini, tetapi saya pikir pertanyaan seperti itu dapat di-render-API -agnostik tanpa terlalu banyak masalah.
Mengapa pada titik waktu tertentu industri beralih besar-besaran ke C ++? Apa alasan untuk pilihan yang dibuat ID?
Hal terakhir yang ingin saya katakan adalah bahwa bahasa C jauh lebih sederhana untuk diimplementasikan dan menyediakan sejumlah fitur yang lebih sedikit, karena ini memiliki peluang jauh lebih kecil untuk "terfragmentasi" dalam bentuk yang tidak seperti C ++ yang sebenarnya sering terjadi. Dalam istilah paling sederhana saya memiliki lebih banyak peluang untuk menemukan kompiler C yang benar-benar baik daripada kompiler C ++ yang baik dengan semua fitur yang diimplementasikan dengan cara yang baik.
Misalnya NDK untuk Android masih tidak memiliki dukungan C ++ yang baik (dengan rilis r8b) dengan semua fitur terbaru dan terhebat, dan itu adalah toolkit asli untuk OS seluler paling populer di dunia!
Jika saya telah menulis kode saya dalam C ++ modern saya mungkin akan kesakitan sekarang karena salah satu OS paling populer di dunia akan terlarang bagi saya. Dan seperti Android, banyak kompiler lain tidak begitu bagus.
Saya harus menulis kode C ++ mengacu pada versi C ++ yang 2-3 rilis lama?
Jawaban:
C ++ melakukan semua yang dilakukan C. Anda dapat dengan mudah mencampurkan C dan C ++ dalam kasus-kasus di mana keunggulan C lebih besar daripada C ++. Ini adalah keputusan desain yang sangat disengaja dari C ++.
C ++ melakukan hal-hal yang tidak dilakukan C. Ini termasuk polimorfisme yang mudah, tetapi juga mengkompilasi pembuatan kode waktu yang mudah melalui templat. Ini sangat berguna untuk hal-hal seperti wadah, yang merupakan kelemahan terbesar C. Ini juga memungkinkan tipe seperti pointer yang ditentukan pengguna (smart handle) yang menghemat banyak waktu, serta tipe seperti primitif yang ditentukan pengguna seperti vektor dan matriks dengan dukungan operator (juga menghemat banyak waktu).
Fungsi virtual lebih lambat daripada fungsi non-virtual. Namun, Anda harus ikut serta dalam fungsi virtual, dan seorang programmer yang kompeten hanya melakukannya jika bermanfaat. Pemrogram C memiliki pointer fungsi dan sering menyimpan koleksi yang ada di struct yang direferensikan oleh struct lainnya; dengan kata lain, mereka melakukan kerja ekstra untuk membuat ulang hal yang sama persis dengan tabel fungsi virtual. Dalam kasus di mana hanya satu fungsi pointer diperlukan dan tidak ada tabel yang diperlukan, C ++ masih sepenuhnya memungkinkan itu dan setara dengan C. Dengan kompiler modern, C ++ hanya lebih lambat dari C dalam kasus-kasus tertentu pemrogram memilih fitur . Selain itu, overhead fungsi virtual dalam praktiknya sangat kecil pada CPU modem. Perangkat keras saat ini dirancang untuk pola penggunaan C ++, dan bahkan semakin dirancang untuk kebutuhan bahasa tingkat tinggi yang ditafsirkan.
Pengecualian C ++ secara historis memaksakan banyak overhead, membuat C ++ lebih lambat walaupun Anda tidak menggunakannya. Pengecualian adalah hal yang mengerikan untuk ditambahkan ke C + +, jika tanpa alasan lain selain peningkatan besar pada kompleksitas yang terlibat dalam penulisan kode pengecualian-aman, dan pada kenyataannya beberapa desain wadah secara harfiah tidak mungkin untuk membuat pengecualian aman. Pemrogram game sering mengabaikan keberadaan pengecualian, dan bahkan menonaktifkannya di kompiler. Kompiler modern memiliki pengecualian nol overhead (yaitu, Anda hanya membayar biaya untuk itu ketika Anda benar-benar menggunakannya).
C lebih mudah untuk mempelajari semua aturan. C ++ adalah bahasa yang sangat besar dan kompleks. C ++ memungkinkan penulisan kode tingkat lebih tinggi, menghasilkan API yang lebih mudah dan lebih sederhana. Beberapa orang ingin memahami bahasa lebih mudah, beberapa orang ingin menulis kode lanjutan lebih mudah. Ini adalah pertukaran antara kesederhanaan memahami apa yang dilakukan kompiler dengan sepotong kode tertentu vs kesederhanaan menulis aplikasi besar yang saling terkoneksi kompleks. Beberapa orang menilai satu jauh lebih dari yang lain, karena berbagai alasan.
Pada akhirnya, C ++ adalah superset dari C. Menurut saya, tidak ada yang seperti ini sebagai programmer C ++ yang sangat kompeten yang juga bukan programmer C lumayan (meskipun ada banyak programmer C ++ yang jatuh di bawah bar saya yang akan hilang dalam C murni). Sementara C ++ menambahkan fasilitas untuk mengisolasi programmer dari banyak C, kode C ++ non-sepele seringkali memang perlu menggunakan C untuk menyelesaikan sesuatu. Ini adalah salah satu perbedaan utama antara C ++ dan Java dan C #. Ada alasan mengapa Anda sering melihat "C / C ++" disatukan.
Keyakinan pribadi saya - yang dibagikan dengan sebagian besar profesional industri game lain yang pernah saya berinteraksi - adalah bahwa peningkatan ekspresif dan fasilitas pemrograman tingkat tinggi dari C ++ lebih besar daripada meningkatnya kompleksitas bahasa di atas C, dan sebagian besar yang sering lainnya klaim anti-C ++ dibuat sudah ketinggalan zaman dengan teknologi saat ini.
sumber
Id Software bukan "industri". Mereka adalah satu perusahaan. Meskipun mereka mungkin berpengaruh, mereka bukan semua orang.
Saya telah bekerja pada beberapa mesin game yang berasal dari tahun 1999, dan mereka menggunakan C ++.
Alasan prinsip untuk adopsi C ++ "sekitar waktu itu" adalah:
Itu standar . C ++ 98 dinamai demikian karena dirilis sebagai standar ISO pada tahun 1998. Sampai saat itu, ada beberapa dialek C ++ tanpa ide yang jelas mana yang "nyata" atau "benar". Setelah standar, dan kompiler mulai menerapkan standar, pengembang game dapat mengandalkan standar aktual.
Ingat lelucon lama: Seorang pria masuk ke kantor dokter dan berkata, "Rasanya sakit ketika saya mengangkat tangan saya seperti ini." Jadi dokter berkata, "Jadi jangan angkat tangan seperti itu."
Jika fungsi virtual lambat untuk kebutuhan Anda, C ++ tidak memaksa Anda untuk menggunakannya. Segala sesuatu di C ++ adalah opt-in. Anda memilih untuk menggunakan setiap fitur tertentu. Jika Anda menggunakan kode kritis kinerja dan Anda tidak ingin overhead virtual, Anda tidak menggunakan fungsi virtual. Seperti halnya jika Anda menggunakan kode kritis kinerja di C, Anda tidak menggunakan pointer fungsi.
Memang, ini menyebabkan banyak game C ++ tidak menjadi C ++ idiomatik (setidaknya, bukan C ++ idiomatik modern ), tetapi hanya "C dengan kelas". Dan ini adalah cara yang berfungsi sempurna untuk memprogram C ++. Sial, hanya bisa tidak harus mengetik
typedef struct
ketika Anda membuat tipe baru adalah keuntungan.C ++ adalah sekumpulan besar fitur, dan Anda dapat memilih yang mana yang Anda inginkan.
Maksudmu adalah? Google nyaris tidak mentolerir orang yang menggunakan NDK; sudah jelas bahwa mereka ingin semua orang menggunakan Java. Satu-satunya alasan NDK ada adalah karena ada pengembang penting tertentu yang tidak akan menggunakan platform tanpa itu. Dengan demikian, NDK ada untuk melayani mereka dan kebutuhan fitur mereka.
Ya, C ++ adalah spesifikasi yang lebih besar, lebih rumit untuk diterapkan. Begitu juga Jawa. Begitu juga bahasa apa pun kecuali C.
Juga, apa maksud Anda "semua fitur terbaru dan terhebat"? Jika Anda berbicara tentang hal-hal C ++ 11, well, belum ada yang sepenuhnya mengimplementasikannya. Speknya baru berumur hampir satu tahun sekarang. Juga, saya tidak tahu apakah NDK mendukung C11 juga; ya, C juga memiliki "fitur terbaru dan terhebat" yang tidak didukung di mana-mana.
Yang memunculkan poin penting: jika Anda ingin aplikasi pure-C Anda dikompilasi di Visual Studio, maka itu harus sesuai dengan C89, dan tidak ada yang lebih tinggi dari itu. Jadi fragmentasi dengan C sudah ada. Beberapa platform hanya mendukung C89. Beberapa mendukung C99. Beberapa mendukung C11, hingga derajat yang berbeda-beda. Dll
Jika Anda ingin menggunakan C, maka menggunakan C . Fakta bahwa orang lain tidak membuat pilihan itu tidak berarti pilihan Anda salah atau pilihan mereka salah. Anda tidak perlu membenarkan diri Anda kepada mereka, dan mereka tidak perlu membenarkan diri mereka sendiri kepada Anda.
sumber
Sudah umum bagi mereka untuk menulis ulang hampir seluruh mesin untuk setiap rilis (setidaknya sampai saat ini - saya tidak tahu banyak tentang beberapa game terakhir), dan karena C ++ semakin populer, masuk akal untuk menggunakannya daripada menggunakan stick dengan C. Seiring waktu semakin sedikit dan semakin sedikit orang yang akan kompeten dengan C.
Karena itu memberi Anda banyak fungsi tingkat yang lebih tinggi sementara hampir seluruhnya kompatibel dengan kode C.
Google akan menjawab ini untuk Anda: http://fabiensanglard.net/doom3/interviews.php
"... setengah programmer benar-benar memiliki latar belakang C ++ di awal. Saya memiliki latar belakang C dan Objective-C, dan saya semacam" meluncur ke C ++ "dengan hanya melihat kode yang ditulis oleh orang-orang C ++. Di belakang, saya Seandainya saya telah menganggarkan waktu untuk meneliti dan mengeksplorasi bahasa secara menyeluruh sebelum baru mulai menggunakannya.
Anda mungkin masih dapat mengetahui bahwa kode penyaji sebagian besar dikembangkan dalam C, kemudian diurutkan menjadi C ++.
Hari ini, saya sangat yakin bahwa C ++ adalah bahasa yang tepat untuk proyek-proyek besar, multi-developer dengan persyaratan kinerja kritis, dan Tech 5 jauh lebih baik untuk pengalaman Doom 3. "
Mengapa kamu peduli tentang ini? Jangan terjebak mengejar barang terbaru. Jika itu cukup baik 5 tahun yang lalu, itu tidak akan tiba-tiba memburuk sekarang.
sumber
Yah, C ++ telah keluar sejak tahun 80-an jadi jika kompiler tidak mendukungnya, mungkin Anda harus menggunakan kompiler yang berbeda. Dan juga, C + + tidak jauh lebih lambat dari C. Ini benar-benar hanya lebih lambat jika Anda memuatnya dengan fungsi virtual dan abstraksi lainnya. Namun, C ++ banyak digunakan saat ini di dunia non unix karena fleksibilitasnya dan fitur-fitur baru yang tidak dimiliki C. Menulis kode modular dalam C ++ jauh lebih mudah daripada melakukannya di C dan membantu Anda menulis lebih banyak kode portabel. Kembali pada subjek kompiler, saya tidak tahu ada kompiler yang tidak mendukung C ++ (mungkin tidak sepenuhnya C ++ 11, tetapi setiap kompiler yang layak setengah harus mendukung C ++).
sumber