Meilleure façon d'acquérir une expérience de travail C ++ pour un travail dans les jeux (provenant de C #) [fermé]

19

Je suis développeur de logiciels, expérimenté en C # (5 ans d'expérience) aux côtés de quelques autres langages.

Mon "job de rêve" travaille dans les jeux vidéo en tant que développeur.

La plupart des emplois nécessitent une connaissance de C ++, que je n'ai pas actuellement (à l'exception de certaines bases).

J'ai regardé autour de moi, et la plupart des grandes sociétés de jeux requièrent de 3 à 5 années d'expérience précédente avec C ++.

Ma question est - quelle serait une bonne voie pour atteindre ce niveau d'expérience requis, venant de C #?

J'ai pensé à quelques façons possibles de le faire:

Obtenez plus de connaissances sur C ++ à partir de livres. Participez à des projets open-source écrits en C ++. Quelle serait la meilleure façon d'apprendre le C ++ et d'avoir une expérience de travail avec lui, en particulier pour l'industrie du jeu?

spaceOwl
la source
1
Merci je vais le vérifier. Bien que je ne suis pas sûr que ce soit exactement la même question que je ne suis pas un débutant en programmation.
spaceOwl
3
Personne ne se soucie beaucoup de savoir comment ou où vous avez acquis votre expérience, ni si vous avez été payé pour cela ou non. Si vous voulez de l'expérience en C ++, commencez à programmer C ++.
Maik Semder
@liortal Repost: Voir aussi Quels sont les bons conseils pour un débutant? (certains bizarres ont supprimé tous mes commentaires sur ce fil).
bobobobo

Réponses:

29

En tant que développeur de jeux, mon principal souci d'embaucher un gars C # serait un manque de connaissances de bas niveau.

Considérez donc un projet où votre travail implique une optimisation de bas niveau, comme la réorganisation de la disposition des données des classes ou la réécriture du code pour tirer parti des instructions SIMD. Prenez un jeu open-source C ++, optimisez-le et publiez l'augmentation de la fréquence d'images sur votre CV.

Si je vous interviewais, je me soucierais moins du C ++ sur votre CV et plus de savoir si vous pouvez répondre à mes questions d'entrevue C / C ++ / bas niveau. Je vais essayer quelques questions d'entrevue standard avec lesquelles vous pourriez avoir des problèmes (avertissement: je ne suis pas un expert C #):

  • Comment les classes C ++ sont-elles disposées en mémoire? Dessinez un diagramme d'octets. Inclure des pointeurs vtables et un remplissage / alignement des variables membres. Et une classe dérivée? Qu'en est-il d'une classe dérivée multipliée?
  • Comment se passe un appel de fonction virtuelle, à un niveau bas? Parlez des opérations d'assemblage comme la lecture d'une valeur en mémoire et le saut vers une adresse.
  • Connaître la conversion de style C, la diffusion statique et la diffusion dynamique entre des pointeurs vers des types avec diverses relations d'héritage. Par exemple, les classes B et C dérivent toutes les deux de la classe A. Que se passe-t-il lorsque vous essayez de convertir de A * en B * (ou B * en C *) à l'aide de ces différents modèles? (Je mentionne parce que je ne pense pas que C # permettrait même ces transtypages spécifiques.)
  • Pourquoi est-il terrible de passer un vecteur stl par valeur, plutôt que par référence? (Je le mentionne car la plupart des types en C # sont des types de référence et il est donc fondamentalement impossible de faire ce genre d'erreur en C #.)
  • Que signifie qu'une structure ou une fonction est compatible avec le cache? Pourquoi une structure de tableaux fonctionne-t-elle mieux qu'un tableau de structures?
  • Comprendre le tas, la pile et la mémoire statique. Si un objet a été alloué avec new, où réside-t-il dans la mémoire du processus? Et une variable locale? Une variable globale?
  • Qu'est-ce qu'une fuite de mémoire? Quelles sont les meilleures pratiques pour les éviter? (Je le mentionne car il n'y a pas de suppression en C #!)
  • Comment débogueriez-vous un plantage de violation d'accès à la mémoire? Et si le crash se produisait dans une bibliothèque de middleware pour laquelle vous n'avez pas de code source?
Eric Undersander
la source
1
Republier: Je sais déjà l'utilité de savoir où les pointeurs vtable sont en mémoire car j'ai rencontré un bogue impliquant cela auparavant . Cependant, en quoi la deuxième question est-elle utile? Comment la connaissance des «opérations au niveau de l'assemblage comme la lecture d'une valeur en mémoire» fait-elle d'un programmeur C ++ compétent?
bobobobo
Mon interview Blizzard pour le stagiaire de WoW UI a abordé les points 1, 2, 3 (dans une moindre mesure), 5 et 7. Il a également posé des questions sur le débogage / test (similaire au point 8) Je pense que cette réponse est exactement sur même dans le cas général des sociétés de développement de jeux de haut niveau.
Dean Knight
2
@DeanKnight Je n'en doute pas. Mais j'aimerais quand même savoir comment l'OP pense que ce genre de question fait de quelqu'un un bon programmeur C ++ (la question originale étant de savoir comment devenir un meilleur programmeur C ++) au lieu d'aider simplement quelqu'un à réussir les entretiens.
bobobobo
2
Vous semblez sceptique, bobobobo, mais votre lien sur le bogue du pointeur vtable est un excellent exemple de la façon dont la connaissance des internes des appels de fonction virtuelle est utile. Considérez un bogue similaire où, au lieu que le pointeur vtable soit nul , ce sont des ordures . Une façon de réaliser que c'est de la foutaise serait de passer par le démontage de l'appel de fonction virtuelle et de voir votre programme aller nulle part au lieu d'aller vers une table ou une méthode valide.
Eric Undersander
1

Ce qu'Eric a dit. J'ajouterais également pour éviter les "nouveaux" là où ce n'est pas forcément le cas. C'est très courant en C # mais considéré comme une mauvaise pratique en C ++ 11 et aussi plus lent que l'allocation de pile et plus dangereux car vous devez le désallouer manuellement.

Je serais aussi prudent avec les vieux livres, ils enseignent les vieilles pratiques. Personnellement, je préfère les forums / sites Web fiables, stackoverflow / isocpp.

Lufi
la source
Merci. Je cherchais des conseils / recommandations plus larges et plus généraux sur ce qu'il faut faire, plutôt que des spécificités linguistiques à étudier.
spaceOwl
«Éviter new» n'est vraiment pas une recommandation sensée. Vous utilisez newlorsque vous avez des pointeurs. Si class Derived : Base, alors a Base var = Derived();est illégal, mais Base *var = new Derived();est légal. Vous avez donc besoin de pointeurs pour que le polymorphisme fonctionne correctement.
bobobobo
Oui, mais vous pouvez utiliser std :: unique_ptr pour accomplir le polymorphisme et éviter le pointeur nu (bien que vous ayez toujours le nouveau mot-clé dans le constructeur unique_ptr)
Eric B
Je suis désolé, j'ai fait une erreur dans le commentaire ci-dessus. Base var = Derived() fonctionnerait , mais il serait découpé en tranches et, à votre insu, les informations perdues var. Pour résoudre le problème de découpage, vous pouvez utiliser des pointeurs.
bobobobo