Melhor maneira de obter experiência de trabalho em C ++ para um emprego em jogos (vindo de C #) [fechado]

19

Sou desenvolvedor de software, experiente em C # (5 anos de experiência), juntamente com alguns outros idiomas.

Meu "emprego dos sonhos" está trabalhando em videogames como desenvolvedor.

A maioria dos trabalhos requer conhecimento de C ++, que atualmente não tenho (exceto alguns princípios básicos).

Eu olhei em volta e a maioria das grandes empresas de jogos exige algo em 3-5 anos de experiência anterior com C ++.

Minha pergunta é: qual seria um bom caminho para chegar a esse nível de experiência exigido, vindo de C #?

Eu pensei em algumas maneiras possíveis de fazer isso:

Obtenha mais conhecimento sobre C ++ nos livros. Participe de projetos de código aberto escritos em C ++. Qual seria a melhor maneira de aprender C ++ e ter experiência em nível de trabalho, especialmente para a indústria de jogos?

spaceOwl
fonte
1
Obrigado, vou verificar. Embora eu não tenha certeza de que esta seja exatamente a mesma pergunta, não sou iniciante em programação.
spaceOwl
3
Ninguém se importa com como ou de onde você tirou sua experiência, ou se você foi pago por isso ou não. Se você deseja experiência em C ++, inicie a programação em C ++.
Maik Semder
@liortal Repost: Veja também Quais são algumas dicas excelentes para iniciantes? (alguns esquisitos deletaram todos os meus comentários neste tópico).
precisa saber é o seguinte

Respostas:

29

Como desenvolvedor de jogos, minha principal preocupação em contratar um cara de C # seria a falta de conhecimento de baixo nível.

Portanto, considere um projeto em que seu trabalho acarreta otimização de baixo nível, como reorganizar o layout dos dados das classes ou reescrever o código para aproveitar as instruções do SIMD. Faça um jogo de código aberto em C ++, otimize-o e publique o aumento da taxa de quadros em seu currículo.

Se eu estivesse entrevistando você, eu me importaria menos com o C ++ em seu currículo e mais sobre se você pode responder às minhas perguntas de entrevista em nível C / C ++ / baixo. Vou examinar algumas perguntas padrão da entrevista com as quais você pode ter problemas (aviso: não sou especialista em C #):

  • Como as classes C ++ são dispostas na memória? Desenhe um diagrama de bytes. Inclua ponteiros vtable e preenchimento / alinhamento de variáveis ​​de membro. E uma classe derivada? Que tal uma classe derivada de multiplicação?
  • Como acontece uma chamada de função virtual, em um nível baixo? Fale sobre operações de montagem, como ler um valor na memória e pular para um endereço.
  • Conheça sobre conversão em estilo C, static_cast e dynamic_cast entre ponteiros para tipos com vários relacionamentos de herança. Por exemplo, as classes B e C derivam da classe A. O que acontece quando você tenta transmitir de A * para B * (ou B * para C *) usando esses vários lançamentos? (Mencionei porque acho que o C # não permitiria esses lançamentos específicos.)
  • Por que é terrível passar um vetor stl por valor, e não por referência? (Menciono porque a maioria dos tipos em C # são tipos de referência e, portanto, é basicamente impossível cometer esse tipo de erro em C #.)
  • O que significa uma estrutura ou função ser amigável ao cache? Por que uma estrutura de matrizes pode ter um desempenho melhor que uma matriz de estruturas?
  • Entenda a pilha, pilha e memória estática. Se um objeto foi alocado com new, onde ele fica na memória do processo? E uma variável local? Uma variável global?
  • O que é um vazamento de memória? Quais são algumas das práticas recomendadas para evitá-las? (Menciono porque não há exclusão em C #!)
  • Como você depuraria uma falha de violação de acesso à memória? E se a falha ocorreu em alguma biblioteca de middleware para a qual você não possui código fonte?
Eric Undersander
fonte
1
Repost: Eu já sei a utilidade de saber onde os ponteiros do vtable estão na memória porque eu encontrei um bug envolvendo isso antes . No entanto, como a segunda pergunta é útil? Como o conhecimento de "operações no nível de assembly, como a leitura de um valor na memória", torna um programador C ++ competente?
bobobobo
Minha entrevista na Blizzard para o local de estagiário da interface do usuário do WoW tocou nos pontos 1, 2, 3 (em menor grau), 5 e 7. Ele também fez perguntas sobre depuração / teste (semelhante ao ponto 8). Acho que essa resposta está exatamente correta mesmo no caso geral de empresas de desenvolvimento de jogos de nível superior.
Dean Cavaleiro
2
@ DeanKnight Eu não duvido disso. Mas eu ainda gostaria de saber como o OP pensa que esse tipo de pergunta torna alguém um bom programador de C ++ (a pergunta original é sobre como se tornar um melhor programador de C ++) em vez de apenas ajudar alguém a aceitar as entrevistas.
bobobobo
2
Você parece cético, bobobobo, mas seu link sobre o bug do ponteiro da vtable é um ótimo exemplo de como é útil o conhecimento interno das chamadas de função virtual. Considere um bug semelhante onde, em vez de o ponteiro vtable ser nulo , é um lixo . Uma maneira de perceber o que é lixo é passar pela desmontagem da chamada de função virtual e ver seu programa ir para lugar nenhum, em vez de ir para uma vtable ou um método válido.
precisa saber é o seguinte
1

O que Eric disse. Eu também adicionaria para evitar "novo" onde não é necessário. É muito comum em C #, mas é considerado uma má prática no C ++ 11 e também mais lento que a alocação de pilha e mais perigoso, porque você precisa desalocá-lo manualmente.

Eu também teria cuidado com livros antigos, eles ensinam práticas antigas. Pessoalmente, prefiro fóruns / sites confiáveis, stackoverflow / isocpp.

Lufi
fonte
Obrigado. Eu estava procurando conselhos / recomendações mais amplos e gerais sobre o que fazer, em vez de detalhes específicos sobre o idioma para estudar.
spaceOwl
"Evitar new" não é realmente uma recomendação sensata. Você usa newquando você tem ponteiros. Se class Derived : Base, então a Base var = Derived();é ilegal, mas Base *var = new Derived();é legal. Então você precisa de indicadores para fazer com que o polimorfismo funcione muito, muito.
precisa saber é o seguinte
Sim, mas você pode usar std :: unique_ptr para realizar polimorfismo e evitar o ponteiro nu (embora você ainda terá a nova palavra-chave no construtor unique_ptr)
Eric B
Sinto muito, cometi um erro no comentário acima. Base var = Derived() funcionaria , mas seria fatiado e, sem o seu conhecimento, as informações perdidas var. Para corrigir o problema de fatiar, você pode usar ponteiros.
bobobobo