Il modo migliore per acquisire esperienza lavorativa in C ++ per un lavoro nei giochi (proveniente da C #) [chiuso]


19

Sono uno sviluppatore di software, con esperienza in C # (5 anni di esperienza) insieme ad alcune altre lingue.

Il mio "lavoro da sogno" sta lavorando ai videogiochi come sviluppatore.

La maggior parte dei lavori richiede la conoscenza del C ++, che attualmente non ho (ad eccezione di alcune delle basi).

Mi sono guardato intorno e la maggior parte delle grandi società di giochi ha bisogno di qualcosa in 3-5 anni di esperienza precedente con C ++.

La mia domanda è: quale sarebbe una buona strada per arrivare a questo livello di esperienza richiesto, proveniente da C #?

Ho pensato ad alcuni modi possibili per farlo:

Ottieni maggiori informazioni sul C ++ dai libri. Partecipa a progetti open source scritti in C ++. Quale sarebbe il modo migliore per imparare il C ++ e avere esperienza a livello di lavoro con esso, in particolare per l'industria dei giochi?


1
Grazie lo controllerò. Anche se non sono sicuro che questa sia esattamente la stessa domanda in quanto non sono un principiante nella programmazione.
spaceOwl

3
A nessuno importa molto di come o da dove hai avuto la tua esperienza, o se sei stato pagato o meno. Se vuoi esperienza in C ++, inizia a programmare C ++.
Maik Semder,

@liortal Repost: vedi anche Quali sono alcuni ottimi consigli per un principiante? (alcuni weirdo hanno eliminato tutti i miei commenti su questa discussione).
bobobobo,

Risposte:


29

Come sviluppatore di giochi, la mia principale preoccupazione nell'assumere un ragazzo C # sarebbe la mancanza di conoscenze di basso livello.

Quindi, considera un progetto in cui il tuo lavoro comporta un'ottimizzazione di basso livello come la riorganizzazione del layout dei dati delle classi o la riscrittura del codice per trarre vantaggio dalle istruzioni SIMD. Prendi un gioco open source C ++, ottimizzalo e pubblica l'aumento del framerate sul tuo curriculum.

Se ti intervistassi, mi preoccuperei meno del C ++ sul tuo curriculum e più se puoi rispondere alle mie domande di intervista C / C ++ / di basso livello. Mi occuperò di alcune domande di intervista standard con cui potresti avere problemi (avviso: non sono un esperto di C #):

  • Come sono disposte in memoria le classi C ++? Disegna un diagramma di byte. Includi puntatori vtable e riempimento / allineamento delle variabili membro. Che dire di una classe derivata? Che dire di una classe derivata da moltiplicazioni?
  • Come avviene una chiamata di funzione virtuale a basso livello? Parla di operazioni di assemblaggio come leggere un valore in memoria e passare a un indirizzo.
  • Informazioni sul cast di tipo C, static_cast e dynamic_cast tra puntatori a tipi con varie relazioni di ereditarietà. Ad esempio, le classi B e C derivano entrambe dalla classe A. Cosa succede quando provi a lanciare da A * a B * (o da B * a C *) usando questi vari cast? (Cito perché non credo che C # consentirebbe nemmeno questi cast specifici.)
  • Perché è terribile passare un vettore stl per valore, anziché per riferimento? (Cito perché la maggior parte dei tipi in C # sono tipi di riferimento e quindi è praticamente impossibile commettere questo tipo di errore in C #.)
  • Cosa significa che una struttura o una funzione sono compatibili con la cache? Perché una struttura di array può funzionare meglio di una matrice di strutture?
  • Comprendi heap, stack e memoria statica. Se un oggetto è stato allocato con nuovo, dove vive nella memoria del processo? Che dire di una variabile locale? Una variabile globale?
  • Che cos'è una perdita di memoria? Quali sono alcune delle migliori pratiche per evitarle? (Cito perché non c'è cancellazione in C #!)
  • Come eseguire il debug di un arresto anomalo della violazione di accesso alla memoria? Che dire se il crash si è verificato in una libreria middleware per la quale non si dispone di codice sorgente?

1
Repost: conosco già l'utilità di sapere dove si trovano i puntatori vtable perché mi sono imbattuto in un bug che lo riguardava prima . Tuttavia, in che modo la seconda domanda è utile? In che modo la conoscenza di "operazioni a livello di assembly come la lettura di un valore in memoria" rende un programmatore C ++ competente?
Bobobobo,

La mia intervista alla Blizzard per il tirocinante dell'interfaccia utente di WoW ha toccato i punti 1, 2, 3 (in misura minore), 5 e 7. Ha anche posto domande sul debug / test (simile al punto 8) Penso che questa risposta sia esattamente esatta anche nel caso generale di società di sviluppo di giochi di livello superiore.
Dean Knight,

2
@DeanKnight Non ne dubito. Ma mi piacerebbe ancora sapere come l'OP pensa che quel tipo di domanda rende qualcuno un buon programmatore C ++ (la domanda originale è su come diventare un programmatore C ++ migliore) invece di aiutare qualcuno a completare le interviste.
bobobobo,

2
Sembri scettico, bobobobo, ma il tuo link sul bug puntatore vtable è un ottimo esempio di come sia utile conoscere gli interni delle chiamate di funzione virtuali. Considera un bug simile in cui, invece che il puntatore vtable sia nullo , è spazzatura . Un modo per rendersi conto che è spazzatura sarebbe quello di passare attraverso lo smontaggio della chiamata di funzione virtuale e vedere il tuo programma andare nel nulla invece di andare su una vtable valida o un metodo valido.
Eric Undersander il

1

Quello che ha detto Eric. Vorrei anche aggiungere per evitare "nuovi" dove non è necessario. È molto comune in C # ma considerato come una cattiva pratica in C ++ 11 e anche più lento dell'allocazione dello stack e più pericoloso perché devi deallocare manualmente.

Starei attento anche ai libri antichi, insegnano vecchie pratiche. Personalmente preferisco forum / siti Web affidabili, stackoverflow / isocpp.


Grazie. Stavo cercando consigli / raccomandazioni più ampi e più generali su cosa fare, piuttosto che specifici linguistici da studiare.
spaceOwl

"Evitare new" non è davvero una raccomandazione sensata. Usi newquando hai puntatori. Se class Derived : Base, quindi a Base var = Derived();è illegale, ma Base *var = new Derived();è legale. Quindi hai bisogno di indicazioni per far funzionare il polimorfismo nel modo giusto, molto.
Bobobobo,

Sì, ma puoi usare std :: unique_ptr per realizzare il polimorfismo ed evitare il puntatore nudo (anche se avrai ancora la nuova parola chiave nel costruttore unique_ptr)
Eric B

Mi dispiace, ho fatto un errore nel commento sopra. Base var = Derived() avrebbe funzionato , ma sarebbe stato suddiviso e, a tua insaputa, le informazioni perse var. Per risolvere il problema di slicing, è possibile utilizzare i puntatori.
bobobobo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.