Cara terbaik untuk mendapatkan pengalaman kerja C ++ untuk pekerjaan dalam game (berasal dari C #) [ditutup]

19

Saya seorang pengembang perangkat lunak, berpengalaman dengan C # (pengalaman 5 tahun) bersama beberapa bahasa lainnya.

"Pekerjaan impian" saya bekerja di video game sebagai pengembang.

Sebagian besar pekerjaan membutuhkan pengetahuan tentang C ++, yang saat ini tidak saya miliki (kecuali untuk beberapa dasar-dasarnya).

Saya telah melihat-lihat, dan sebagian besar perusahaan game besar membutuhkan sesuatu selama 3-5 tahun pengalaman sebelumnya dengan C ++.

Pertanyaan saya adalah - rute apa yang baik untuk mencapai tingkat pengalaman yang diperlukan ini, yang berasal dari C #?

Saya telah memikirkan beberapa cara yang mungkin untuk melakukannya:

Dapatkan lebih banyak pengetahuan tentang C ++ dari buku. Berpartisipasi dalam proyek sumber terbuka yang ditulis dalam C ++. Apa yang akan menjadi cara terbaik untuk belajar C ++ dan memiliki pengalaman tingkat kerja dengannya, khususnya untuk industri game?

spaceOwl
sumber
1
Terima kasih saya akan memeriksanya. Meskipun saya tidak yakin ini adalah pertanyaan yang sama persis karena saya bukan pemula dalam pemrograman.
spaceOwl
3
Tidak ada yang peduli bagaimana atau dari mana Anda mendapatkan pengalaman, atau apakah Anda dibayar untuk itu atau tidak. Jika Anda ingin pengalaman dalam C ++, mulai pemrograman C ++.
Maik Semder
@liortal Repost: Lihat juga Apa saja tips bagus untuk pemula? (beberapa orang aneh menghapus semua komentar saya di utas ini).
bobobobo

Jawaban:

29

Sebagai pengembang game, perhatian utama saya mempekerjakan seorang pria C # adalah kurangnya pengetahuan tingkat rendah.

Jadi, pertimbangkan sebuah proyek di mana pekerjaan Anda memerlukan optimasi tingkat rendah seperti mengatur ulang tata letak data kelas atau menulis ulang kode untuk mengambil keuntungan dari instruksi SIMD. Ambil game sumber terbuka C ++, optimalkan, dan posting peningkatan framerate di resume Anda.

Jika saya mewawancarai Anda, saya tidak akan terlalu peduli tentang C ++ di resume Anda dan lebih banyak tentang apakah Anda dapat menjawab pertanyaan wawancara C / C ++ / tingkat rendah saya. Saya akan coba-coba beberapa pertanyaan wawancara standar yang mungkin bermasalah dengan Anda (peringatan: Saya bukan pakar C #):

  • Bagaimana kelas C ++ diletakkan dalam memori? Gambar diagram byte. Sertakan pointer vtable dan padding / alignment variabel anggota. Bagaimana dengan kelas turunan? Bagaimana dengan kelas yang diturunkan banyak kali?
  • Bagaimana panggilan fungsi virtual terjadi, pada level rendah? Bicara tentang operasi perakitan seperti membaca nilai dalam memori dan melompat ke alamat.
  • Ketahui tentang pemeran gaya-C, static_cast, dan dynamic_cast antara pointer ke tipe dengan berbagai hubungan pewarisan. Sebagai contoh, kelas B dan C keduanya berasal dari kelas A. Apa yang terjadi ketika Anda mencoba untuk melemparkan dari A * ke B * (atau B * ke C *) menggunakan berbagai gips ini? (Saya sebutkan karena saya pikir C # bahkan tidak akan mengizinkan gips khusus ini.)
  • Mengapa mengerikan untuk melewatkan vektor stl berdasarkan nilai, bukan dengan referensi? (Saya sebutkan karena kebanyakan tipe dalam C # adalah tipe referensi dan karenanya pada dasarnya tidak mungkin untuk membuat kesalahan semacam ini dalam C #.)
  • Apa artinya struktur atau fungsi menjadi cache-friendly? Mengapa struktur-susunan-array berkinerja lebih baik daripada susunan-susunan-struktur?
  • Memahami tumpukan, tumpukan, dan memori statis. Jika suatu objek dialokasikan dengan yang baru, di mana ia hidup dalam memori proses? Bagaimana dengan variabel lokal? Variabel global?
  • Apa itu kebocoran memori? Apa praktik terbaik untuk menghindarinya? (Saya sebutkan karena tidak ada penghapusan dalam C #!)
  • Bagaimana Anda men-debug crash pelanggaran akses memori? Bagaimana jika crash terjadi di beberapa perpustakaan middleware yang Anda tidak memiliki kode sumber?
Eric Undersander
sumber
1
Repost: Saya sudah tahu kegunaan mengetahui di mana pointer vtable berada dalam memori karena saya mengalami bug yang melibatkan itu sebelumnya . Namun, bagaimana pertanyaan kedua bermanfaat sama sekali? Bagaimana mengetahui "operasi tingkat perakitan seperti membaca nilai ke dalam memori" menjadikannya seorang programmer C ++ yang kompeten?
bobobobo
Wawancara Blizzard saya untuk tempat magang WoW UI menyentuh pada poin 1, 2, 3 (pada tingkat yang lebih rendah), 5, dan 7. Dia juga mengajukan pertanyaan tentang debugging / pengujian (mirip dengan poin 8) Saya pikir jawaban ini persis tepat bahkan dalam kasus umum untuk perusahaan pengembangan game tingkat atas.
Dean Knight
2
@DeanKnight saya tidak meragukannya. Tapi saya masih ingin tahu bagaimana OP berpikir bahwa pertanyaan semacam itu membuat seseorang menjadi programmer C ++ yang baik (pertanyaan awal tentang bagaimana menjadi programmer C ++ yang lebih baik) sebagai lawan dari hanya membantu seseorang mendapatkan wawancara.
bobobobo
2
Anda terdengar skeptis, bobobobo, tetapi tautan Anda tentang bug pointer vtable adalah contoh yang bagus tentang bagaimana mengetahui internal panggilan fungsi virtual berguna. Pertimbangkan bug serupa di mana, alih-alih pointer vtable menjadi nol , ini adalah sampah . Salah satu cara untuk menyadari itu adalah sampah akan melalui pembongkaran panggilan fungsi virtual dan melihat program Anda pergi ke mana-mana alih-alih pergi ke vtable yang valid atau metode yang valid.
Eric Undersander
1

Apa yang Eric katakan. Saya juga akan menambahkan untuk menghindari "baru" di mana itu tidak perlu. Ini sangat umum di C # tetapi dianggap sebagai praktik buruk di C ++ 11 dan juga lebih lambat dari alokasi tumpukan dan lebih berbahaya karena Anda harus secara manual mengalokasikannya.

Saya juga akan berhati-hati dengan buku-buku tua, mereka mengajarkan praktik lama. Saya pribadi lebih suka forum / situs web yang dapat diandalkan, stackoverflow / isocpp.

Lufi
sumber
Terima kasih. Saya mencari saran / rekomendasi yang lebih umum dan lebih umum tentang apa yang harus dilakukan, daripada belajar bahasa secara spesifik.
spaceOwl
"Menghindari new" adalah rekomendasi yang benar-benar tidak masuk akal. Anda gunakan newketika Anda memiliki pointer. Jika class Derived : Base, maka Base var = Derived();itu ilegal, tetapi Base *var = new Derived();legal. Jadi Anda perlu petunjuk untuk membuat polimorfisme bekerja dengan benar, banyak.
bobobobo
Ya, tetapi Anda dapat menggunakan std :: unique_ptr untuk menyelesaikan polimorfisme dan menghindari penunjuk telanjang (meskipun Anda masih memiliki kata kunci baru dalam konstruktor unique_ptr)
Eric B
Maaf, saya membuat kesalahan dalam komentar di atas. Base var = Derived() akan bekerja , tetapi itu akan diiris dan, tanpa Anda ketahui, informasi hilang var. Untuk memperbaiki masalah pemotongan, Anda bisa menggunakan pointer.
bobobobo