OK, hanya untuk menyodok beberapa lubang di kata-kata kasar yang Anda tautkan:
- "C # bergantung pada juru bahasa" Just In Time " - salah - itu adalah kompiler JIT . Setelah metode JITted sekali , kode yang dikompilasi digunakan kembali untuk setiap doa. Kode yang dikompilasi sangat dekat dengan kode asli yang sudah dikompilasi sebelumnya.
- "Xenon CPU adalah" di tempat "prosesor" - apakah maksudnya "dalam urutan"? - Dan: "Xenon CPU tidak memiliki prediksi cabang" . Dia menyiratkan ini berarti bahwa kompilasi JIT secara alami menghasilkan kode buruk yang harus dipesan ulang oleh CPU dan menyebabkan banyak percabangan - yang merupakan omong kosong mutlak . Saran kinerja yang sama untuk berjalan pada arsitektur CPU ini berlaku untuk C ++ dan C #.
- "[JIT] membutuhkan pembilasan konstan pada 360" - salah, kode yang dikompilasi dapat disimpan dalam cache seperti kode yang biasanya dikompilasi. (Jika maksudnya flush pipeline, lihat poin di atas.)
- "generik [...] gunakan pembuatan kode" - generik JITted seperti yang lainnya dan, seperti yang lainnya, kode JITted cepat. Tidak ada penalti kinerja untuk menggunakan obat generik.
- "semua bagian bahasa yang seksi [...] memerlukan prediksi cabang ..." - bagaimana hal ini tidak berlaku untuk C ++ juga? - "... atau [...] pembuatan kode di tempat" - apakah maksudnya JITting? Apakah saya menyebutkan bahwa itu cepat? (Saya tidak akan pergi ke semua tempat yang digunakan CLR desktop sebenarnya pembuatan kode - fitur yang tidak didukung oleh Xbox 360!)
- "[C # tidak memiliki] perpustakaan besar [dari C ++]" - kecuali, katakanlah, XNA itu sendiri? Dan masih banyak lagi . (Namun, ini adalah poin yang agak adil.)
XNA di Xbox 360 berjalan pada versi modifikasi .NET Compact Framework CLR. Saya tidak ragu bahwa itu tidak memenuhi standar versi desktop. JITter mungkin tidak sebagus - tapi saya juga berpikir itu tidak buruk . Saya terkejut dia tidak menyebutkan pengumpul sampah yang mengerikan dibandingkan dengan desktop CLR.
(Tentu saja - Anda tidak harus memukul pengumpul sampah dalam permainan dikembangkan secara profesional pula , seperti yang Anda harus berhati-hati dengan alokasi di setiap pertandingan profesional kelas.)
(Untuk diskusi teknis aktual dari .NET Compact Framework, mungkin mulai dengan seri artikel ini: Gambaran Umum , Kompiler JIT , dan GC dan heap .)
Cara dia sepenuhnya tidak spesifik tentang terminologinya membuatnya bahkan sulit untuk memahami apa yang dia maksudkan. Entah dia dalam mode kata-kata kasar maksimal, atau tidak tahu apa yang dia bicarakan.
Sekarang kita punya yang keluar dari jalan, berikut adalah beberapa hal yang Anda lakukan kehilangan dengan menggunakan XNA pada 360, daripada pergi asli :
- Akses ke unit SIMD / Vektor untuk melakukan matematika floating point CPU sangat cepat
- Kemampuan untuk menggunakan kode bahasa asli yang mungkin akan sedikit lebih cepat daripada C #
- Kemampuan untuk menjadi sedikit lebih malas dengan bagaimana Anda mengalokasikan memori
- Game XBLIG hanya memiliki akses ke 4 dari 6 core (tapi kami masih mendapatkan semua 3 CPU, dan mereka juga bukan core penuh, jadi kami tidak kehilangan banyak) - tidak yakin apakah ini berlaku untuk non-XBLIG XNA permainan
- Akses DirectX penuh untuk melakukan tipu daya grafis yang benar-benar tidak jelas
Perlu juga disebutkan bahwa ini hanya pembatasan sisi CPU. Anda masih mendapatkan akses gratis sepenuhnya berjalan pada GPU.
Saya menggambarkan hal-hal ini dalam jawaban untuk pertanyaan yang sama efektifnya dengan pertanyaan ini. Seperti yang saya sebutkan dalam jawaban itu XNA benar-benar cocok untuk pengembangan "profesional" .
Satu-satunya alasan yang akan Anda hindari adalah karena Anda tidak dapat menyewa bakat C #, melisensikan mesin C #, dan menggunakan kembali kode C # yang ada dengan cara yang sama dengan basis pengetahuan C ++ yang ada. Atau karena Anda mungkin juga menargetkan platform yang tidak mendukung C #.
Tentu saja, bagi banyak dari kita yang bukan pengembang "profesional", XNA adalah satu - satunya pilihan kita untuk menggunakan Xbox 360, menjadikannya poin yang diperdebatkan.
Untuk menjawab pertanyaan Anda yang lain:
Tidak ada dalam C # yang menghentikan Anda menggunakan pendekatan berorientasi data yang pada dasarnya sama persis dengan cara Anda menggunakannya dalam C ++.
C # tidak memiliki kemampuan untuk secara otomatis kode inline pada waktu kompilasi, dan (tanpa pergi untuk memeriksa) Saya cukup yakin JITter CLR kompak tidak dapat inline metode (desktop CLR bisa). Jadi untuk kode kritis kinerja Anda mungkin harus secara manual menyejajarkan dalam C #, di mana C ++ memberikan bantuan.
Mungkin alasan yang lebih besar mengapa Anda tidak sering melihat hal-hal intensif CPU-matematika seperti deteksi tabrakan dan simulasi cairan di C # adalah kurangnya akses ke unit vektor (seperti yang disebutkan di atas).