Berapa banyak perakitan yang benar-benar digunakan dalam kode game modern? [Tutup]


21

Rata-rata, seberapa sering perakitan digunakan dalam kode game modern?

Khususnya pada platform yang sudah memiliki kompiler C ++ yang bagus, seperti x86, PPC, atau ARM - karena saya menganggap game pada sistem embedded menggunakan banyak rakitan.


4
C ++ tidak dikompilasi ke perakitan - ia mengkompilasi ke kode mesin. Bahasa assembly adalah cara menentukan secara langsung kode mesin apa yang ingin Anda hasilkan.
Kylotan

6
C ++ (umumnya) sebenarnya tidak dikompilasi untuk perakitan, itu dikompilasi langsung ke kode mesin. Pertanyaannya mungkin merujuk pada seberapa banyak perakitan tulisan tangan terkait dengan proyek atau ditulis sebagai perakitan inline.

1
Bagaimanapun, saya tidak berpikir ada jawaban yang praktis dan berguna untuk pertanyaan ini. Ini pada dasarnya tergantung pada sejenis faktor, banyak di antaranya bersifat subjektif (yaitu, pendapat penulis kode).

1
Tidak begitu banyak tulisan yang penting saat ini, dengan beberapa pengecualian seperti pemrograman SPU, tetapi dapat membacanya penting untuk menganalisis crash dumps
Maik Semder

4
@Legion - Anda dapat menyebabkan kompiler / IDE untuk memancarkan perakitan, tetapi itu tidak berarti bahwa kompiler menghasilkan perakitan sebagai bagian dari proses kompilasi yang normal. Tidak perlu untuk melakukannya dan akibatnya, kebanyakan tidak.

Jawaban:


29

Jawabannya sedikit tergantung pada apa yang Anda maksud dengan "permainan", dan "digunakan". Saya akan menganggap "digunakan" berarti "ditulis selama proyek permainan tertentu".

Dalam pengalaman dan data anekdotal saya dari orang yang saya ajak bicara:

  • dalam game berbasis browser? Tidak ada
  • dalam game PC biasa? Tidak ada (Tapi Anda mungkin melihat beberapa di perpustakaan tingkat rendah.)
  • di game iOS dan Android? Tidak ada
  • Gim PC "AAA" dan gim konsol? Mungkin sedikit, mungkin 0,05% dari basis kode. (Dengan sedikit lebih banyak di perpustakaan.)

Pengetahuan tentang bahasa assembly tidak diharapkan untuk bekerja di industri game, tetapi tergantung pada jenis game yang Anda buat, itu mungkin menguntungkan.

Dulu ada argumen bahwa kompiler melakukan pekerjaan yang lebih baik dalam mengoptimalkan kode C daripada manusia dengan perakitan tulisan tangan. Biasanya itu benar, kadang itu salah. Tetapi akhir-akhir ini kombinasi dari kompleksitas CPU yang terus tumbuh dan kebutuhan untuk skala 'keluar' (yaitu untuk memisahkan prosesor) berarti bahwa upaya optimasi biasanya dihabiskan di tempat lain.

Dalam beberapa tahun terakhir, satu-satunya waktu saya melihat perakitan dalam kode permainan adalah __asm int 3pernyataan untuk memaksa breakpoint, dan satu-satunya penggunaan pribadi saya pada perakitan adalah dalam melihat pembongkaran fungsi untuk mendiagnosis bug kecelakaan yang tidak biasa.


1
Bagaimana dengan instruksi SSE?
Legiun

4
@Legion, orang biasanya menulis kode SSE baik menggunakan intrinsik, atau perpustakaan matematika yang membungkus barang-barang SSE, atau dalam bahasa mini khusus yang dirancang khusus untuk dikompilasi ke SSE, seperti ispc . Perakitan menulis secara langsung masih sangat langka.
Nathan Reed

1
Mengenai Game iOS: Jika saya ingat dengan benar, perpustakaan 3D / Math Oolong menggunakan beberapa unit ARM inline. Itu tidak lagi diperlukan sejak Apple merilis kerangka kerja Accelerate.
Nicolas Miari

Setuju dengan Nathan - SSE dan optimisasi spesifik instruksi serupa biasanya ada di perpustakaan (karena biasanya hanya tempat-tempat di mana total manfaat yang didapat sebanding dengan upaya yang dilakukan).
Kylotan

26

Sebagian besar kode kinerja tinggi dalam game konsol modern ditulis menggunakan semacam jalan tengah antara perakitan dan C ++: kompiler intrinsik . Konstruk ini terlihat dan diurai seperti fungsi C ++, tetapi sebenarnya diterjemahkan ke dalam instruksi mesin tunggal . Jadi, misalnya, saya "menjepit setiap nilai vektor V menjadi> = a dan <= b" fungsi seperti

// for each v.x, ensure v.x >= a.x && v.x <= b.x
inline __m128 ClampSIMD( const __m128 &v, const __m128 & a, const __m128 & b )
{
    return _mm_max_ps( a, _mm_min_ps( v, b ) );
}

Dalam fungsi seperti ini saya masih berpikir dalam hal instruksi mesin khusus , tetapi saya memiliki kemudahan untuk menuliskannya dalam C sehingga saya tidak perlu khawatir tentang pewarnaan register dan penjadwalan dan memuat ops dan detail membosankan lainnya.

Anda masih perlu mengetahui instruksi apa yang didukung CPU, terutama karena kompiler modern sangat buruk dalam mengkode kode, dibandingkan dengan seberapa baik manusia pintar dapat melakukan pekerjaan itu. Terkadang detail halus tentang bagaimana Anda mengatur kode Anda dapat memiliki implikasi besar untuk kinerja yang tidak jelas tanpa memahami apa yang dilakukan mesin.

Meskipun kami tidak dapat membuat kode dalam perakitan, kami masih banyak melakukan debug dalam perakitan. Mengoptimalkan kompiler secara agresif mengatur ulang kode dengan cara yang tidak bisa diikuti oleh para debugger, sehingga seringkali ketika men-debug "mode pelepasan" membangun hal terbaik untuk dilakukan adalah membuka pembongkaran dan menelusuri kode dengan cara itu. Pembicaraan GDC ini pada "Forensik Debugging" dari crash menggambarkan banyak dari mengapa dan bagaimana debug pada level itu.


3
Memberi +1 hanya karena Crashworks terkenal di SO sebagai "orang yang menulis kode optimalisasi level rendah untuk game" - jika ada yang tahu tentang topik ini, itu dia.
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft "Terkenal"? Aku tersanjung! =) Suatu kebetulan yang lucu, mengingat komentar Nathan Reed, adalah bahwa saya belajar banyak dari keterampilan pengoptimalan tingkat rendah saya di Naughty Dog.
Crashworks

Di tempat lain saya juga mendengar pentingnya berkumpul dalam debugging. Jadi saya akan mempelajarinya. Terima kasih atas wawasan dan tautannya.
Legiun

7

Masalah yang biasanya membutuhkan perakitan linting tangan semakin sedikit jumlahnya. Apa yang Anda "mungkin" peroleh dalam kecepatan yang Anda kehilangan dalam keterbacaan dan kemampuan untuk debug. Itu juga harus dilakukan hanya sebagai salah satu langkah optimasi terakhir pada bagian kode karena dalam banyak kasus masalah kecepatan bukanlah sesuatu yang tidak dapat dibuat lebih baik dengan perakitan. Saat ini CPU telah menjadi jauh lebih cepat sementara kecepatan memori belum, seringkali lebih penting untuk mengontrol bagaimana data mengalir melalui CPU daripada yang lain.

Dengan kompiler modern, mereka juga merasa sulit untuk mengoptimalkan kode perakitan karena mereka harus berurusan dengan register apa pun yang telah Anda sentuh dan mereka biasanya tidak dapat memesan ulang instruksi dalam kode kerajinan tangan Anda. Untuk mengurangi kebutuhan perakitan, sekarang ada intrinsik yang membantu untuk mendapatkan akses ke konsep tingkat rendah, tetapi dengan cara yang ramah kompiler dan memungkinkan mereka untuk bekerja dengan Anda daripada menentang.

Dengan itu, SPU pada PS3 adalah salah satu area di mana orang masih harus menggunakan perakitan untuk mendapatkan hasil maksimal dari prosesor, dengan pipelining instruksi manual misalnya seperti yang dijelaskan di sini .


1
Bahkan di PS3, orang biasanya tidak cukup program dalam perakitan telanjang. Ada alat yang memungkinkan Anda menulis kode dalam sintaksis yang mirip perakitan, tempat Anda menentukan instruksi mesin, tetapi melakukan alokasi register, penjadwalan instruksi, dan loop pipelining untuk Anda. Yah, mungkin Anjing Nakal benar-benar melakukan semuanya dengan tangan, tetapi bahkan sebagian besar pengembang PS3 SPU tidak menurut pengalaman saya. :)
Nathan Reed

1
@NathanReed Pada hari-hari PS2, pipelining loop manual sebenarnya adalah bagian dari wawancara programmer Naughty Dog.
Crashworks

-1

Faktanya adalah kita hidup di dunia multi platform, dan bagian dari kode permainan kita harus disesuaikan dengan platform lokal - yah tidak harus, tetapi ada manfaatnya jika kita mengambil keuntungan dari hal-hal perangkat keras lokal!

Ini bukan tentang permainan atau logika game, ini tentang lokalitas perangkat keras untuk kinerja optimal dari kode di mana logika permainan bergantung, kita memang dapat membungkus bagian kode, misalnya menggunakan makro, sehingga ada satu kode sumber, yang dijalankan dengan baik pada Platform itu dibangun melawan.

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.