XNA dan C # vs 360 dalam prosesor urutan

14

Setelah membaca kata-kata kasar ini , saya merasa mereka mungkin benar (mengingat Xenon dan CELL BE keduanya sangat sensitif terhadap kode yang bodoh dan cache ), tapi saya pernah mendengar bahwa orang-orang membuat game baik-baik saja dengan C # juga.

Jadi, apakah benar bahwa tidak mungkin melakukan sesuatu yang profesional dengan XNA, atau apakah posternya hilang apa yang menjadikan XNA API pembunuh untuk pengembangan game?

Secara profesional, saya tidak bermaksud dalam arti bahwa Anda dapat menghasilkan uang dari itu, tetapi lebih dalam arti bahwa game yang lebih profesional memiliki model phsyics dan sistem animasi yang tampak di luar jangkauan bahasa dengan hambatan yang pasti terhadap intrinsik . Jika saya ingin menulis sistem tabrakan atau mesin dinamika fluida untuk permainan saya, saya tidak merasa seperti C # menawarkan saya kesempatan untuk melakukan itu ketika generator kode runtime dan kurangnya intrinsik menghalangi kinerja.

Namun, banyak orang tampaknya baik-baik saja bekerja dalam batasan-batasan ini, membuat permainan yang sukses tetapi tampaknya menghindari masalah apa pun dengan kelalaian. Saya tidak melihat ada game XNA melakukan sesuatu yang kompleks selain apa yang sudah disediakan oleh perpustakaan, atau ditangani oleh shader. Apakah ini penghindaran dinamika permainan yang lebih kompleks karena keterbatasan C # , atau hanya orang yang berkonsentrasi untuk menyelesaikannya ?

Dalam semua kejujuran, saya tidak percaya bahwa perang AI dapat mempertahankan banyak unit AI tanpa pendekatan berorientasi data, atau beberapa hack C # kotor untuk membuatnya berjalan lebih baik daripada pendekatan standar, dan saya kira itu juga sebagian pertanyaan saya, bagaimana sudahkah orang meretas C # sehingga dapat melakukan apa yang dilakukan pembuat game secara alami dengan C ++?

Richard Fabian
sumber
Kata-kata kasar. Tidak menemukan info APA SAJA tentang pria itu dan melihat mereka (dia?) Seorang pemula, saya ingin melihat segala jenis informasi yang dapat diraba untuk mendukung hal ini ...
Jonathan Connell
Untuk alasan saya tidak sepenuhnya mengerti studio sepertinya tidak mengakui menggunakan XNA. Namun ada banyak contoh tautan di
Tristan Warner-Smith
Nah, informasi yang jelas untuk mendukungnya adalah kenyataan bahwa CPU secara inheren buruk pada kode branchy, yaitu C #. Yang ingin saya ketahui adalah, apa yang dilakukan pengguna XNA profesional yang berarti mereka tidak mencapai batas lunak yang ditentukan oleh C #?
Richard Fabian
3
saya tidak dapat memahami suara turun ...
FxIII
3
Saya pikir banyak orang mengecilkan pertanyaan Richard karena (banyak) kesalahan teknis dalam artikelnya yang terhubung, dan beberapa orang mengacau kata "profesional" berarti "produksi tingkat Halo" daripada "menghasilkan uang". Yang terakhir adalah pilihan yang buruk tetapi jangan downvote hanya karena Anda tidak setuju dengan tautan - sanggah dengan menjawabnya sebagai gantinya.

Jawaban:

21

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).

Andrew Russell
sumber
Saya tidak dapat mengingat diri saya sendiri, tetapi bukankah C # menghentikan Anda melakukan iterasi melalui array sederhana? Saya ingat sesuatu tentang hal itu mengemas tipe kelas satu seperti int, float, char, dan karena itu, beberapa pendekatan berorientasi data tidak berfungsi secepat yang mereka bisa. Apakah itu benar? Apa yang saya ingat?
Richard Fabian
2
C # akan mengotakkan tipe nilai (bukan hanya intrinsik - Anda dapat membuat tipe nilai Anda sendiri) jika Anda menetapkannya ke suatu objecttipe. Dan dalam versi 1 (sebelum obat generik) Anda tidak bisa memasukkannya ke dalam wadah non-array tanpa meninju mereka. Tapi hari ini sangat mudah untuk menulis kode bebas kotak. Dan CLR Profiler memungkinkan Anda untuk mendeteksi tempat di mana Anda mungkin bertinju.
Andrew Russell
Apakah mungkin untuk memiliki juru bahasa JIT? Kedengarannya paradoks.
Bebek Komunis
Saya telah melihat beberapa teknik kode berulir yang akan saya klasifikasikan sebagai interpretasi JIT. Ini jelas merupakan kasus tepi.
1
@Roy T. " XNA Perpustakaan Math " (bagian dari DirectX) dan " XNA Framework " adalah dua benar-benar hal yang berbeda dengan tabrakan penamaan sangat disayangkan. Dokumentasi yang Anda tautkan tidak berlaku untuk Kerangka XNA. Tipe matematika XNA Framework tidak menggunakan unit SIMD / Vector .
Andrew Russell
5

Anda harus mendefinisikan 'profesional'. Bisakah Anda melakukan Angry Birds, Plants vs Zombies, dll? Benar. Bisakah Anda melakukan Crysis 2, COD, Halo? Aku meragukan itu. Menggunakan C # hanya benar-benar akan berdampak pada game yang sangat intensif CPU dan juga perlu memeras setiap byte terakhir dari memori (Anda kehilangan koleksi sampah), jadi ada banyak sekali yang masih bisa Anda lakukan.

Sebagai alat pembelajaran untuk orang-orang yang memulai, alat prototyping, platform untuk menulis permainan yang dapat mengatasi pertukaran, dll, ini fantastis dan memiliki banyak kekuatan dan kesederhanaan, itu tidak dirancang untuk membuat apa yang Anda inginkan sebut game 'AAA'. Ini juga menghilangkan banyak rasa sakit dan penderitaan yang orang harus khawatirkan dengan porting lintas platform dan kompatibilitas.

Jika Anda datang dengan permainan yang luar biasa dan Anda mengalami keterbatasan apa yang dapat Anda lakukan dengan XNA maka saya sarankan menghubungi MS secara langsung, jika idenya benar-benar cukup baik, mereka mungkin hanya akan membiarkan Anda mendapatkan pengembangan penuh. kit.

Roger Perkins
sumber
Bisakah Anda membuat sekuel Duke Nukem yang jelek? ;)
Jonathan Connell
1
Sebagian besar tolok ukur menemukan bahwa kode C # berjalan di suatu tempat antara 30% dan 70% lebih lambat daripada kode C yang setara (pada PC). Ketika Anda menganggap bahwa sebagian besar game tidak terikat dengan CPU, dan juga bagian-bagian penting dari kode C # dapat ditulis menggunakan kode tidak aman yang dapat berjalan hampir secepat atau lebih cepat daripada kode C yang setara (lebih cepat karena JIT memiliki lebih banyak informasi yang tersedia untuk daripada kompiler, sehingga dapat membuat pilihan optimisasi yang lebih baik) , Anda melihat bahwa C # sangat mampu untuk game AAA.
BlueRaja - Danny Pflughoeft
@BlueRaja: Kode tidak aman bukanlah opsi untuk sebagian besar pengembangan XNA di Xbox 360.
1
@BlueRaja: Ada baiknya menunjukkan bahwa unsafekode sering lebih lambat daripada setara aman, karena mengurangi jumlah optimisasi yang bisa dibuat oleh CLR. Anda harus mengukurnya.
Andrew Russell
2
@Blueraja "Ketika Anda menganggap bahwa sebagian besar game tidak terikat dengan CPU" rujukan? Saya belum pernah mengerjakan game yang dikembangkan secara profesional yang tidak terikat pada semua sumbu. jika bukan kita akan menemukan cara untuk memindahkan beban ke bagian mesin itu!
Richard Fabian
3

Fakta sederhananya adalah Anda tidak perlu jumlah poligon tinggi, pencahayaan HDR penuh, atau fisika paling menarik di dunia untuk membuat gim yang menarik, dan jika rencana gim Anda tidak menyertakannya, maka mengapa tidak memilih yang lebih cepat solusi waktu pengembangan?

game yang lebih profesional memiliki model dan sistem animasi phsyics

Itu salah. Permainan profesional memiliki apa yang mereka butuhkan untuk menerapkan permainan mereka dan mencapai tampilan artistik mereka, dan tidak lebih dan memang, tidak kurang. Sebuah permainan tidak lebih profesional karena terlihat lebih realistis atau memiliki fisika lebih rinci. Sebuah gim yang profesional menghasilkan gim dan sasaran visualnya, tepat waktu, sesuai anggaran, dll, dan dikirimkan serta menghasilkan keuntungan.

DeadMG
sumber
1
Hitungan poligon tinggi dan HDR akan jatuh pada kartu grafis, bukan? Jadi, Anda harus mengharapkan kinerja yang persis sama di C # dan C ++.
BlueRaja - Danny Pflughoeft
@BlueRaja: Ada biaya CPU untuk itu juga, dan memori - terutama pada 360.
DeadMG
Lebih atau kurang, ada sedikit lebih banyak overhead pada lib panggilan grafis daripada kode asli. Di sisi lain, pustaka grafis modern berusaha SANGAT keras untuk mengurangi jumlah panggilan ke driver per frame, karena itu salah satu hambatan utama.
drxzcl