Der beste Weg, um C ++ - Berufserfahrung für einen Job in Spielen zu sammeln (von C # kommend) [geschlossen]

19

Ich bin ein Softwareentwickler, der Erfahrung mit C # (5 Jahre Erfahrung) zusammen mit einigen anderen Sprachen hat.

Mein "Traumjob" ist es, als Entwickler in Videospielen zu arbeiten.

Die meisten Jobs erfordern Kenntnisse in C ++, die ich derzeit nicht habe (mit Ausnahme einiger Grundlagen).

Ich habe mich umgesehen und die meisten großen Spielefirmen benötigen 3-5 Jahre Erfahrung mit C ++.

Meine Frage ist - was wäre ein guter Weg, um mich von C # aus auf dieses erforderliche Erfahrungsniveau zu bringen?

Ich habe mir einige Möglichkeiten überlegt:

Erfahren Sie mehr über C ++ in Büchern. Nehmen Sie an Open-Source-Projekten teil, die in C ++ geschrieben sind. Was wäre der beste Weg, um C ++ zu lernen und Erfahrungen auf Arbeitsebene damit zu sammeln, insbesondere für die Spielebranche?

spaceOwl
quelle
1
Danke, ich werde es überprüfen. Obwohl ich nicht sicher bin, ob dies genau die gleiche Frage ist, bin ich kein Anfänger in der Programmierung.
SpaceOwl
3
Es interessiert niemanden, wie oder woher Sie Ihre Erfahrung haben oder ob Sie dafür bezahlt wurden oder nicht. Wenn Sie Erfahrung in C ++ haben möchten, starten Sie die Programmierung von C ++.
Maik Semder
@liortal Repost: Siehe auch Was sind einige gute Tipps für einen Anfänger? (Einige Verrückte haben alle meine Kommentare zu diesem Thread gelöscht).
Bobobobo

Antworten:

29

Als Spieleentwickler würde mein Hauptanliegen, einen C # -Typ einzustellen, ein Mangel an geringen Kenntnissen sein.

Stellen Sie sich also ein Projekt vor, bei dem Ihre Arbeit eine Optimierung auf niedriger Ebene erfordert, z. B. das Umordnen des Datenlayouts von Klassen oder das Umschreiben von Code, um die Vorteile von SIMD-Anweisungen zu nutzen. Nehmen Sie ein C ++ - Open-Source-Spiel, optimieren Sie es und veröffentlichen Sie die Frameratenerhöhung in Ihrem Lebenslauf.

Wenn ich Sie interviewen würde, würde mich das C ++ in Ihrem Lebenslauf weniger interessieren, als vielmehr, ob Sie meine C / C ++ / Low-Level-Interviewfragen beantworten können. Ich werde ein paar Fragen zu Standardinterviews beantworten, mit denen Sie möglicherweise Probleme haben (Warnung: Ich bin kein C # -Experte):

  • Wie werden C ++ - Klassen im Speicher angeordnet? Zeichnen Sie ein Diagramm von Bytes. Fügen Sie vtable-Zeiger und das Auffüllen / Ausrichten von Elementvariablen ein. Was ist mit einer abgeleiteten Klasse? Was ist mit einer multiplikativ abgeleiteten Klasse?
  • Wie erfolgt ein virtueller Funktionsaufruf auf niedriger Ebene? Sprechen Sie über Montagevorgänge wie das Lesen eines Werts im Speicher und das Springen zu einer Adresse.
  • Kenntnisse über C-Cast, static_cast und dynamic_cast zwischen Zeigern auf Typen mit verschiedenen Vererbungsbeziehungen. Zum Beispiel stammen die Klassen B und C beide von Klasse A. Was passiert, wenn Sie versuchen, mit diesen verschiedenen Besetzungen von A * nach B * (oder von B * nach C *) zu casten? (Ich erwähne, weil ich nicht glaube, dass C # diese spezifischen Besetzungen überhaupt zulässt.)
  • Warum ist es schrecklich, einen stl-Vektor nicht als Referenz, sondern als Wert zu übergeben? (Ich erwähne, weil die meisten Typen in C # Referenztypen sind und es daher im Grunde unmöglich ist, diese Art von Fehler in C # zu machen.)
  • Was bedeutet es für eine Struktur oder Funktion, Cache-freundlich zu sein? Warum funktioniert eine Array-Struktur möglicherweise besser als eine Array-Struktur?
  • Grundlegendes zu Heap, Stack und statischem Speicher. Wenn ein Objekt mit new belegt wurde, wo befindet es sich im Speicher des Prozesses? Was ist mit einer lokalen Variablen? Eine globale Variable?
  • Was ist ein Speicherleck? Was sind einige bewährte Methoden, um sie zu vermeiden? (Ich erwähne, weil es kein Löschen in C # gibt!)
  • Wie würden Sie einen Speicherzugriffsverletzungsabsturz debuggen? Was ist, wenn der Absturz in einer Middleware-Bibliothek passiert ist, für die Sie keinen Quellcode haben?
Eric Undersander
quelle
1
Repost: Ich weiß bereits, wie nützlich es ist, zu wissen, wo sich vtable-Zeiger im Speicher befinden, da ich zuvor auf einen Fehler gestoßen bin, der diesen Fehler betraf . Inwiefern ist die zweite Frage überhaupt nützlich? Wie macht man einen kompetenten C ++ - Programmierer, wenn man "Assembler-Operationen wie das Einlesen eines Wertes in den Speicher" kennt?
Bobobobo
Mein Blizzard-Interview für den WoW UI-Praktikanten-Spot hat die Punkte 1, 2, 3 (in geringerem Maße), 5 und 7 berührt. Er stellte auch Fragen zum Debuggen / Testen (ähnlich Punkt 8). Ich denke, diese Antwort ist genau richtig auch im allgemeinen Fall für übergeordnete Spieleentwicklungsunternehmen.
Dean Knight
2
@DeanKnight Das bezweifle ich nicht. Aber ich möchte immer noch wissen, wie das OP diese Art von Frage zu einem guten C ++ - Programmierer macht (die ursprüngliche Frage ist, wie man ein besserer C ++ - Programmierer wird), anstatt nur jemandem zu helfen, die Interviews zu bestehen.
Bobobobo
2
Sie klingen skeptisch, Bobobobo, aber Ihr Link zum Vtable Pointer Bug ist ein gutes Beispiel dafür, wie nützlich es ist, die Interna von virtuellen Funktionsaufrufen zu kennen. Stellen Sie sich einen ähnlichen Fehler vor, bei dem der vtable-Zeiger nicht null ist , sondern Müll . Eine Möglichkeit, um zu erkennen, dass es sich um Müll handelt, besteht darin, den virtuellen Funktionsaufruf zu disassemblieren und zu beobachten, wie Ihr Programm ins Nichts geht, anstatt zu einer gültigen vtable oder einer gültigen Methode zu wechseln.
Eric Undersander
1

Was Eric gesagt hat. Ich würde auch hinzufügen, um "neu" zu vermeiden, wo es nicht notwendig ist. Es ist in C # sehr verbreitet, wird jedoch in C ++ 11 als schlechte Praxis angesehen und ist auch langsamer als die Stapelzuweisung und gefährlicher, da Sie die Zuordnung manuell aufheben müssen.

Ich würde auch vorsichtig mit alten Büchern sein, sie lehren alte Praktiken. Ich persönlich bevorzuge zuverlässige Foren / Websites, Stackoverflow / Isocpp.

Lufi
quelle
Vielen Dank. Ich suchte nach allgemeineren Ratschlägen und Empfehlungen, anstatt nach sprachlichen Besonderheiten, die ich studieren wollte.
SpaceOwl
"Vermeiden new" ist wirklich keine vernünftige Empfehlung. Sie verwenden, newwenn Sie Zeiger haben. Wenn ja class Derived : Base, dann Base var = Derived();ist a illegal, aber Base *var = new Derived();legal. Sie brauchen also Zeiger, damit der Polymorphismus richtig funktioniert.
Bobobobo
Ja, aber Sie können std :: unique_ptr verwenden, um Polymorphismus zu erreichen und den nackten Zeiger zu vermeiden (obwohl Sie das neue Schlüsselwort immer noch im unique_ptr-Konstruktor haben)
Eric B
Es tut mir leid, ich habe im obigen Kommentar einen Fehler gemacht. Base var = Derived() würde funktionieren , aber es würde in Scheiben geschnitten und, ohne dass Sie es merken, Informationen verloren in var. Um das Slicing-Problem zu beheben, können Sie Zeiger verwenden.
Bobobobo