Oyunlarda bir iş için C ++ çalışma deneyimi kazanmanın en iyi yolu (C # 'dan geliyor) [kapalı]


19

Diğer birkaç dilin yanında C # (5 yıllık deneyim) ile deneyimli bir yazılım geliştiricisiyim.

"Rüya işim", video oyunlarında geliştirici olarak çalışıyor.

Çoğu iş şu anda sahip değil C ++, bilgi gerektirir (bazı temel dışında).

Etrafa baktım ve çoğu büyük oyun şirketi C ++ ile 3-5 yıl önceki deneyim boyunca bir şeye ihtiyaç duyuyor.

Benim sorum - kendimi C # gelen bu gerekli deneyim seviyesine almak için iyi bir yol ne olurdu?

Bunu yapmanın bazı olası yollarını düşündüm:

Kitaplardan C ++ hakkında daha fazla bilgi edinin. C ++ ile yazılmış açık kaynaklı projelere katılın. Özellikle oyun endüstrisi için C ++ öğrenmenin ve onunla çalışma düzeyinde deneyime sahip olmanın en iyi yolu nedir?


1
Teşekkürler ben kontrol edeceğim. Her ne kadar bu programlama bir acemi değilim aynı soru olduğundan emin değilim.
spaceOwl

3
Kimse, deneyiminizi nereden veya nereden aldığınız ya da bunun için ödeme alıp almadığınız konusunda fazla bir şey umurunda değil. C ++ deneyimi istiyorsanız, C ++ programlamaya başlayın.
Maik Semder

@liortal Repost: Ayrıca bkz. Yeni başlayanlar için bazı harika ipuçları nelerdir? (bazı tuhaflıklar bu konudaki tüm yorumlarımı sildi).
bobobobo

Yanıtlar:


29

Bir oyun geliştiricisi olarak, bir C # adamla çalışmamın temel kaygısı, düşük seviyeli bilgi eksikliği olacaktır.

Bu nedenle, çalışmanızın SIMD talimatlarından yararlanmak için sınıfların veri düzenini yeniden düzenlemek veya kodu yeniden yazmak gibi düşük seviyeli optimizasyon gerektiren bir projeyi düşünün. C ++ açık kaynaklı bir oyun alın, optimize edin ve kare hızındaki artışı özgeçmişinizde yayınlayın.

Seninle röportaj yapsaydım, özgeçmişinde C ++ ve C / C ++ / düşük seviyeli görüşme sorularıma cevap verip veremeyeceğimi umursamıştım. Sorun yaşayabileceğiniz bazı standart görüşme sorularına bir göz atacağım (uyarı: C # uzmanı değilim):

  • C ++ sınıfları bellekte nasıl düzenlenir? Bayt diyagramı çizin. Vtable işaretçileri ve üye değişkenlerin doldurulmasını / hizalanmasını içerir. Türetilmiş bir sınıfa ne dersiniz? Çok türetilmiş bir sınıfa ne dersiniz?
  • Sanal işlev çağrısı düşük bir seviyede nasıl olur? Bellekteki bir değeri okumak ve bir adrese atlamak gibi montaj işlemleri hakkında konuşun.
  • Çeşitli kalıtım ilişkilerine sahip türlere işaretçiler arasındaki C stili yayın, statik_ yayın ve dinamik_ yayın hakkında bilgi edinin. Örneğin, B ve C sınıflarının her ikisi de A sınıfından türetilir. Bu çeşitli yayınları kullanarak A * - B * (veya B * - C *) 'yi yayınlamaya çalıştığınızda ne olur? (C # 'ın bu özel yayınlara bile izin vereceğini düşünmüyorum.)
  • Bir stl vektörünü referans yerine değer olarak iletmek neden korkunç? (C # türündeki çoğu tür referans türü olduğundan ve bu nedenle C # 'da bu tür bir hata yapmak temel olarak imkansız olduğundan söz ediyorum.)
  • Bir yapının veya fonksiyonun önbellek dostu olması ne anlama gelir? Dizilerin yapısı neden bir yapı dizisinden daha iyi performans gösterebilir?
  • Yığın, yığın ve statik belleği anlama. Bir nesneye yeni tahsis edilmişse, işlemin belleğinde nerede yaşar? Yerel bir değişken ne olacak? Global bir değişken mi?
  • Bellek sızıntısı nedir? Onlardan kaçınmak için en iyi uygulamalar nelerdir? (Bahsettiğim için C # 'da silme yok !)
  • Bellek erişimi ihlali kilitlenmesinde nasıl hata ayıklarsınız? Kaynak koduna sahip olmadığınız bazı ara katman yazılım kitaplığında kilitlenme olursa ne olur?

1
Repost: Vtable işaretçilerin bellekte nerede olduğunu bilmenin faydasını zaten biliyorum çünkü daha önce bunu içeren bir hata ile karşılaştım . Ancak, 2. soru nasıl faydalıdır? "Belleğe bir değer okumak gibi birleştirme düzeyi işlemleri" bilmek nasıl yetkin bir C ++ programcısı yapar?
bobobobo

WoW UI stajyer spotu için Blizzard röportajım 1, 2, 3 (daha düşük bir dereceye kadar), 5 ve 7'ye dokundu. Ayrıca hata ayıklama / test hakkında sorular sordu (8. noktaya benzer) Bence bu cevap tam olarak yerinde üst düzey oyun geliştirme şirketleri için bile.
Dean Knight

2
@DeanKnight Bundan şüphe etmiyorum. Ama yine de OP'nin bu tür bir sorunun nasıl birini iyi bir C ++ programcısı yaptığını (orijinal soru daha iyi bir C ++ programcısı olmakla ilgili olduğunu) sadece birinin röportajlara yardım etmesinin aksine nasıl düşündüğünü bilmek istiyorum .
bobobobo

2
Şüpheci, bobobobo gibi görünüyorsunuz, ancak vtable pointer hatasıyla ilgili bağlantınız, sanal işlev çağrılarının içselliğini bilmenin ne kadar yararlı olduğuna harika bir örnektir. Yerine vtable işaretçi varlık içinde, benzer bir hata nerede düşünün boş 's, çöp . Çöpünü fark etmenin bir yolu , sanal işlev çağrısının sökülmesine adım atmak ve programınızın geçerli bir vtable veya geçerli bir yönteme gitmek yerine hiçbir yere gitmediğini görmek olacaktır.
Eric Undersander

1

Eric ne dedi. Ben de neccesarly olmadığı yerde "yeni" önlemek için eklemek istiyorum. C # 'da çok yaygındır ancak C ++ 11'de kötü uygulama olarak kabul edilir ve yığın tahsisinden daha yavaştır ve daha tehlikeli çünkü manuel olarak yeniden yerleştirmeniz gerekir.

Eski kitaplara da dikkat ederdim, eski uygulamaları öğretirler. Şahsen güvenilir forumları / web sitelerini, stackoverflow / isocpp'i tercih ederim.


Teşekkürler. Çalışılacak dil özelliklerinden ziyade ne yapacağım konusunda daha geniş, daha genel tavsiye / öneriler arıyordum.
spaceOwl

"Kaçınma new" gerçekten mantıklı bir öneri değildir. newİşaretçileriniz olduğunda kullanın . Eğer class Derived : Base, o zaman a Base var = Derived();yasa dışıdır, ancak Base *var = new Derived();yasaldır. Bu nedenle, polimorfizmin doğru bir şekilde çalışmasını sağlamak için işaretçilere ihtiyacınız var.
bobobobo

Evet, ancak polimorfizmi gerçekleştirmek ve çıplak işaretçiden kaçınmak için std :: unique_ptr komutunu kullanabilirsiniz (yine de unique_ptr yapıcısında yeni anahtar kelimeye sahip olacaksınız)
Eric B

Üzgünüm, yukarıdaki yorumda bir hata yaptım. Base var = Derived() işe yarayacaktır , ancak dilimlenecek ve sizin haberiniz olmadan bilgi kaybedilecektir var. Dilimleme sorununu gidermek için işaretçiler kullanabilirsiniz.
bobobobo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.