Apakah C ++ diganti oleh C # di game industri?


23

Dalam game industri yang saya maksud seperti Quake, CoD dll.


7
Akan membantu jika Anda menjelaskan secara singkat apa yang memberi Anda ide, karena itu ide yang sangat aneh untuk sedikitnya.
Konrad Rudolph

2
Mempertimbangkan Gempa dilakukan di C .. ;-)
The Communist Duck

Saya sendiri hanya ingin tahu pertanyaan ini!
Jeff

2
Kedengarannya seperti "permainan industri" yang Anda maksud adalah apa yang biasanya disebut "judul AAA".
chaos

Jawaban:


53

Dalam arti tertentu, C ++ benar-benar digantikan - tidak hanya oleh C #, tetapi oleh banyak bahasa lain. Tetapi jika Anda bertanya, apakah akan diganti sepenuhnya - maka jawabannya pasti tidak .

Itu karena C ++ secara tradisional digunakan dalam dua kapasitas. Pertama, untuk membuat mesin permainan : komponen tingkat rendah yang memuat sumber daya, dorong poligon ke layar dan angka-angka dalam simulasi fisika. Kedua, untuk kode logika game : aturan aktual yang membuat gameplay.

Kapasitas kedua ini tidak memerlukan poin kuat C ++ (seperti kontrol penuh atas detail level rendah), tetapi menderita kelemahannya (seperti manajemen memori kode-rawan bug). Dan dalam kapasitas kedua ini C ++ sedang digantikan oleh bahasa scripting yang berbeda. Banyak pengembang menggunakan Lua; beberapa menggunakan Python. Tetapi jika platform CLI tersedia, dalam bentuk .NET atau Mono, itu menghadirkan kandidat host skrip yang hebat. Platform ini cukup cepat, dapat diandalkan, menawarkan bahasa yang dikenal luas (C #) dan perpustakaan kelas dasar yang komprehensif. Jangan lupa alat: MS Visual studio dan SharpDevelop / MonoDevelop mungkin bukan IDE terbaik di dunia, tetapi mereka cukup bagus.

Yang mengatakan, mesin gim tidak akan ditulis dalam C # (atau Lua, atau Python dalam hal ini). Mengapa? Karena mereka tidak cukup cepat.

Berlawanan dengan banyak kepercayaan populer, kinerja tunggal terbesar yang dicapai hari ini adalah karena latensi memori . Ini berarti bahwa mengakses memori adalah urusan serius. Dan bahasa yang dikelola tidak memungkinkan pengguna untuk mengontrol akses memori - itulah sebabnya mereka "dikelola" sejak awal. Jadi, tidak ada bahasa yang dikelola yang akan memungkinkan untuk menulis mesin permainan yang sangat cepat. Sebenarnya, semua mesin "C #" besar yang dapat saya pikirkan - XNA, MOGRE, Unity - didasarkan pada kode C ++ asli ; tetapi izinkan untuk menulis logika game dalam C #.

Singkatnya : C # akan digunakan sebagai pengganti C ++ atau bahasa lainnya. Tapi itu tidak akan pernah menggantikan C ++, setidaknya sampai seseorang menemukan latensi, memori akses instan.


16
+1 Visual Studio adalah IDE yang sangat bagus. Bahkan jika itu adalah sisi gelap ...
Michael Coleman

1
Bah, dalam pengalaman saya C # tidak cukup cepat untuk simulasi juga, tetapi itu tidak menghentikan orang untuk mencoba.
BigSandwich

@Nevermind Apa itu "Bahasa yang Dikelola"?
Quazi Irfan

3
@iamcreasy Dalam arti luas, oleh "Bahasa yang dikelola" Maksudku bahasa yang berjalan di bawah mesin virtual yang mencakup beberapa bentuk pengumpulan sampah dan / atau manajemen memori. Lebih tepatnya, bahasa yang dikelola adalah bahasa yang menargetkan (beberapa implementasi) Common Language Runtime, tetapi jawaban saya tidak hanya berlaku untuk mereka.
Nevermind

Menurut pendapat Anda, apakah skema GC yang dihitung referensi termasuk dalam kategori ini a la Vala?
weberc2

6

Pilihan bahasa sangat tergantung pada platform. Saat ini tampaknya sangat tidak mungkin bahwa apa pun selain platform Microsoft akan benar-benar membutuhkan .NET sebagai implementasi.

Kebijaksanaan konvensional akan mengatakan bahwa platform kecil harus dekat dengan logam untuk menjadi pemain, tetapi di sisi lain, platform yang dikelola lebih aman . Itu mungkin alasan Windows Phone 7 memaksa Anda untuk menggunakan .NET.

Pasti akan menarik jika Xbox baru membutuhkan platform yang dikelola. Jika perangkat keras ponsel dapat menanganinya (dan itu benar), saya pasti bisa melihatnya menggunakannya pada konsol ukuran penuh. Ini akan membangkitkan ekosistem konsol sedikit karena akan lebih sulit untuk menulis game lintas platform tanpa menulis semua kode game Anda dalam bahasa scripting. Jika itu masalahnya, maka C # tidak akan menggantikan C ++, tetapi akan berjalan seiring.

Saat ini Anda dapat menggunakan Mono sebagai bagian belakang scripting (mirip dengan apa yang dilakukan Unity), tetapi saya akan membayangkan bahwa sebagian besar pembuat mesin ingin menggulung sendiri, atau menggunakan sesuatu yang lebih kompak seperti Lua atau Python daripada C #.

Apa pun itu, ini semua tentang alat yang tepat untuk pekerjaan yang tepat. Anda benar-benar harus mempelajari kedua bahasa itu, karena C # membuatnya lebih mudah untuk melakukan hal-hal tertentu (pengembangan alat, pengembangan server mungkin, dll), dan Anda tidak dapat menggunakan apa pun selain C ++ dalam beberapa kasus.


Sampai sekarang, 3 tahun kemudian keadaan C # untuk pengembangan game jauh lebih berkembang. Mono-Project mengambil XNA Game Studio dan mengganti namanya menjadi MonoGame. SharpDX, SlimDX, dan OpenTK adalah pembungkus opengl / directx yang sangat baik. Bahkan beberapa mesin fisika di c # telah muncul. Mono / MonoGame memungkinkan Anda untuk membuat game sekali dan port otomatis ke android, linux, mac os, ios, xbox 360, ps3, ps4, dan wii.
Ryan Mann

3

Itu tidak mungkin. C ++ memiliki manfaat tingkat rendah sehingga pengembang dapat benar-benar mengubah detail terkecil untuk mendapatkan kinerja terbaik.

Dengan C # dan .NET, Anda memiliki pengumpulan sampah yang sangat berguna, tetapi ketika bekerja dengan platform dengan memori dan sumber daya terbatas (konsol portabel dan beberapa konsol rumah), Anda harus memiliki kendali atas memori sebanyak mungkin untuk memanfaatkan sebaik mungkin sumber daya. Mengizinkan bahasa yang dikelola untuk dialokasikan dan membebaskan memori bagi Anda kemungkinan besar akan menyebabkan Anda banyak masalah.

Kecepatan juga menjadi masalah (meskipun mungkin kurang begitu). Seiring waktu, saya yakin bahwa bahasa yang dikelola dapat dibuat untuk melakukan yang sebanding dengan kompiler C ++.

Secara keseluruhan, dalam pengalaman saya, pengembang game cenderung mengendalikan orang aneh ketika datang ke memori, waktu CPU dan sumber daya (untuk memeras kinerja sebanyak yang mereka bisa), itulah sebabnya C / C ++ adalah bahasa yang terutama digunakan.


2

AFAIK .NET GC masih menderita karena menghentikan algoritme gaya dunia . Meskipun ini bisa sesuai untuk berbagai aplikasi - itu tidak dapat diterima untuk aplikasi real-time seperti game.

Faktanya, sangat sulit untuk menggunakan bahasa yang dikelola secara efektif untuk program waktu-nyata sampai kita memiliki beberapa terobosan dalam GC.


1

Tidak. Bergantung pada .NET akan menyiratkan penulisan ulang besar-besaran untuk platform tanpa Kerangka yang tersedia, seperti PS3, dan kerugian kinerja mungkin sangat dapat diterima pada PC atau untuk game Arcade Langsung, tetapi game yang lebih besar akan membutuhkan setiap memo kinerja dari konsol mereka berjalan cukup cepat. Lebih dari itu, ada basis kode yang sangat besar di C ++ yang tidak seorang pun mampu memutakhirkan, bahkan jika mereka menginginkannya. C ++ ada di industri game dan akan tetap di sana untuk waktu yang lama.


Sementara inersia ada, basis kode C ++ tidak sendiri yang setua itu - mungkin paling banyak 10 tahun. Hampir semua kode di dalamnya telah mengalami penggantian selama periode itu - untuk akselerator 3D, saluran pipa yang dapat diprogram, arsitektur berbasis data, dan dukungan skrip. Jika pengembang AAA ingin melakukan migrasi penuh ke C #, mereka mungkin bisa mencapainya dengan biaya minimal dalam waktu tiga game - pertama menggunakannya sebagai alat dan host skrip, kedua pindahkan lapisan logika game ke sana, dan port ketiga renderer untuk menggunakan pembungkus DX / GL yang dikelola.

1
Mono memang memiliki solusi .NET komersial untuk PS3.
Dan Olson

Diperbolehkan, jika Anda membangun gim Anda dalam c # melawan mono atau dengan monogame (penggantian xna), Anda dapat port ke ps3 / ps4, wii, xbox 360, android, maks os, dll.
Ryan Mann

0

Pada saat-saat di mana daya komputer sangat langka, semua yang perlu diprogram dalam C atau C ++, hanya karena bahasa sampah yang dikumpulkan mengambil kendali memori dari programmer, dan dengan demikian, kinerja dapat turun.

Saat ini, komputer lebih cepat, tetapi seperti kata Knuth dan singkatnya, optimasi bisa jahat:

  • jelas bahwa fungsionalitas inti level rendah perlu dioptimalkan, karena komputasi geometri 3D, fisika, tabrakan, pencahayaan, dapat dengan cepat mengasapi prosesor terbaik yang ada. Anda dapat dengan mudah mengatakan bahwa peningkatan kualitas visual pada mesin hampir selalu secara signifikan membunuh kinerja.

  • Sekarang, ada fungsi-fungsi lain, seperti status gim, AI, suara, input, jaringan, yang masih penting dalam gim, tetapi yang hampir tidak pernah memakan sumber daya komputer sebanyak itu. Fungsi-fungsi itu, sebagian besar waktu, belum dioptimalkan. Itulah tujuan dari bahasa scripting dan sampah yang dikumpulkan: Anda tidak harus memikirkan koherensi memori dan organisasi aplikasi Anda, karena kode yang akan Anda tulis dengan bahasa-bahasa ini, jika Anda tidak mengkodekan hal-hal tingkat rendah, tidak akan pernah menjadi kemacetan.

Contoh dengan 2 kasus

  • Kirim 500kg furnitur dengan truk.
  • Kirim 30 ton material dengan perahu.

keduanya berada pada jarak 500 km.

Dalam kedua kasus apakah penting untuk membuat proses bongkar / muat lebih cepat untuk membuat seluruh waktu transportasi lebih kecil, mengetahui bahwa Anda TIDAK BISA membuat perahu atau truk bergerak lebih cepat?

Jawabannya adalah: itu penting dengan truk, tetapi tidak dengan kapal lagi, karena Anda sudah melakukan banyak hal dengan memindahkan stok dengan kapal.

Saya tidak tahu apakah Anda memahami metafora ini, tetapi dengan satu cara, itu bisa membuat Anda membayangkan masalah matematika, yang lebih penting daripada memahami jawabannya.

Bahasa scripting memungkinkan untuk membuat game lebih cepat jika Anda sudah memiliki mesin yang diprogram dalam C / C ++: mesin 3D memecahkan masalah tingkat rendah, sekarang Anda harus membuat game dengan skrip Anda.

Tapi ingat: Anda benar-benar tidak akan pernah bisa mengganti bahasa yang dikompilasi level rendah, EVER. Bahasa dikompilasi, dikompilasi secara statis adalah inti dari kinerja dan Anda TIDAK BISA mengesampingkan mereka, apakah itu kernel, mesin 3D atau driver kartu grafis.

Tetapi tentu saja, jika gim Anda sederhana secara grafis dan tidak memerlukan banyak perhitungan vektor, Anda dapat fokus pada gameplay dan melupakan pengoptimalan, karena dalam hal ini Anda tidak akan pernah harus berurusan dengan pengoptimalan karena mesin Anda sangat cepat untuk itu

Kecuali jika Anda berencana untuk port ir pada DS. Tapi saya akan berhenti di situ.


1
"Optimalisasi bisa jahat" sejauh ini merupakan versi pernyataannya yang paling tidak bermutasi yang pernah saya baca.

baik saya jelaskan, itu sebabnya saya merasa tidak berguna untuk mengutip seluruh pernyataannya, yang merupakan kalimat yang cukup panjang dan tidak benar-benar dijelaskan ... Di atas semua itu, kita berbicara tentang permainan, yang tidak sama perangkat lunak yang lebih luas yang ingin dibicarakan oleh Knuth.
jokoon

Anda menyebutkan bahwa input hampir tidak pernah menghabiskan banyak sumber daya komputer. Saya ingin menunjukkan bahwa ketika pemain menjadi lebih terhubung secara fisik ke permainan, ini menjadi kurang benar. Misalnya, kinect. Ini adalah bentuk input, tetapi membutuhkan banyak sumber daya komputasi untuk memanfaatkannya.
Ponkadoodle

0

Dengar, aku tahu ini kata-kata kasar tapi aku tidak hanya membelah rambut. Saya merasa sebagian besar programmer tidak benar-benar menyatukan ini. Bahasa itu sendiri tidak ada hubungannya dengan kecepatan lari / kinerja. Ini adalah kompiler / framework. Anda bisa lebih baik berdebat gcc terhadap cl (microsoft compiler pre 2010) atau msbuild (c ++ compiler untuk 2010). Setiap rilis kompiler ini menjadi lebih baik sehingga Anda juga harus membandingkannya dengan versi sebelumnya. Saya sangat terkesan dengan .net dan itu berkinerja baik tetapi bahkan jika itu berkinerja lebih baik saya tidak melihatnya mengambil alih, satu alasan: portabilitas.

Game AAA ingin berada di Windows, Linux, Mac, XBox, PS3, Nintendo, dll.


Tentu saja implementasi kompiler berperan, tetapi bahasa yang berbeda memberikan biaya yang berbeda untuk optimasi yang digerakkan oleh kompiler, dan biaya yang berbeda bagi pemrogram untuk menghindari aturan bahasa yang biasa dan berbicara dengan perangkat keras secara langsung. Bahasa dan target itu sendiri ada hubungannya dengan kinerja.

Bahasa dapat memiliki banyak kaitan dengan kecepatan lari / kinerja karena sintaks dan pustaka standar akan mendukung pendekatan yang berbeda. Sebagai contoh, bahasa yang sulit untuk menggunakan array dari memori yang berdekatan karena semua objek mereka menjadi pointer akan cenderung merosot cache lebih dari satu di mana Anda dapat menggunakan array atau vektor secara efektif.
Kylotan

1 poin yang sangat bagus, yang bisa Anda buat tanpa menghina orang-orang bodoh, mereka tidak tahu siapa mereka.
Fire Crow

Kecuali, pada hari ini, Anda dapat membangun terhadap mono dan port untuk hampir semuanya. Misalnya sekarang sangat portabel.
Ryan Mann
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.