La mejor manera de obtener experiencia laboral en C ++ para un trabajo en juegos (procedente de C #) [cerrado]

19

Soy un desarrollador de software, con experiencia en C # (5 años de experiencia) junto con algunos otros lenguajes.

Mi "trabajo soñado" es trabajar en videojuegos como desarrollador.

La mayoría de los trabajos requieren conocimiento de C ++, que actualmente no tengo (excepto algunos de los conceptos básicos).

He mirado a mi alrededor, y la mayoría de las grandes compañías de juegos requieren algo a lo largo de 3-5 años de experiencia previa con C ++.

Mi pregunta es: ¿cuál sería una buena ruta para llegar a este nivel de experiencia requerido, viniendo de C #?

He pensado en algunas formas posibles de hacerlo:

Obtenga más conocimiento sobre C ++ de los libros. Participe en proyectos de código abierto escritos en C ++. ¿Cuál sería la mejor manera de aprender C ++ y tener experiencia a nivel de trabajo con él, en particular para la industria del juego?

spaceOwl
fuente
1
Gracias, lo comprobaré. Aunque no estoy seguro, esta es exactamente la misma pregunta, ya que no soy un principiante en programación.
spaceOwl
3
A nadie le importa mucho cómo o de dónde obtuvo su experiencia, o si le pagaron o no. Si desea experiencia en C ++, comience a programar C ++.
Maik Semder
@liortal Repost: Consulte también ¿Cuáles son algunos consejos excelentes para un principiante? (Algún bicho raro eliminó todos mis comentarios en este hilo).
bobobobo

Respuestas:

29

Como desarrollador de juegos, mi principal preocupación contratar a un chico C # sería la falta de conocimiento de bajo nivel.

Por lo tanto, considere un proyecto en el que su trabajo implique una optimización de bajo nivel, como reorganizar el diseño de datos de las clases o reescribir el código para aprovechar las instrucciones SIMD. Tome un juego de código abierto C ++, optimícelo y publique el aumento de la velocidad de fotogramas en su currículum.

Si te estuviera entrevistando, me importaría menos el C ++ en tu currículum y más si puedes responder a mis preguntas de C / C ++ / entrevista de bajo nivel. Averiguaré algunas preguntas estándar de la entrevista con las que podría tener problemas (advertencia: no soy un experto en C #):

  • ¿Cómo se presentan las clases de C ++ en la memoria? Dibuja un diagrama de bytes. Incluya punteros vtable y relleno / alineación de variables miembro. ¿Qué pasa con una clase derivada? ¿Qué pasa con una clase de derivación múltiple?
  • ¿Cómo se realiza una llamada de función virtual a un nivel bajo? Hable acerca de las operaciones de ensamblaje, como leer un valor en la memoria y saltar a una dirección.
  • Conozca la conversión de estilo C, static_cast y dynamic_cast entre punteros a tipos con varias relaciones de herencia. Por ejemplo, las clases B y C se derivan de la clase A. ¿Qué sucede cuando intentas lanzar de A * a B * (o B * a C *) usando estos diferentes lanzamientos? (Menciono porque no creo que C # permita siquiera estos lanzamientos específicos).
  • ¿Por qué es terrible pasar un vector stl por valor, en lugar de por referencia? (Menciono porque la mayoría de los tipos en C # son tipos de referencia y, por lo tanto, es básicamente imposible cometer este tipo de error en C #).
  • ¿Qué significa que una estructura o función sea amigable con el caché? ¿Por qué una estructura de matrices puede funcionar mejor que una matriz de estructuras?
  • Comprenda el montón, la pila y la memoria estática. Si un objeto se asignó con nuevo, ¿dónde vive en la memoria del proceso? ¿Qué pasa con una variable local? ¿Una variable global?
  • ¿Qué es una pérdida de memoria? ¿Cuáles son algunas de las mejores prácticas para evitarlos? (¡Menciono porque no hay eliminación en C #!)
  • ¿Cómo depuraría un bloqueo de violación de acceso a memoria? ¿Qué pasa si el bloqueo ocurrió en alguna biblioteca de middleware para la cual no tienes código fuente?
Eric Undersander
fuente
1
Repost: Ya conozco la utilidad de saber dónde están los punteros vtable en la memoria porque me encontré con un error relacionado con eso antes . Sin embargo, ¿cómo es útil la segunda pregunta? ¿Cómo saber "operaciones de nivel de ensamblaje como leer un valor en la memoria" lo convierte a uno en un programador competente de C ++?
bobobobo
Mi entrevista de Blizzard para el puesto interno de WoW UI tocó los puntos 1, 2, 3 (en menor grado), 5 y 7. También hizo preguntas sobre depuración / prueba (similar al punto 8) Creo que esta respuesta es exactamente correcta incluso en el caso general de las empresas de desarrollo de juegos de nivel superior.
Dean Knight
2
@DeanKnight No lo dudo. Pero todavía me gustaría saber cómo piensa el OP que ese tipo de preguntas hace que alguien sea un buen programador de C ++ (la pregunta original es cómo convertirse en un mejor programador de C ++) en lugar de simplemente ayudar a alguien a realizar las entrevistas.
bobobobo
2
Suena escéptico, bobobobo, pero su enlace sobre el error del puntero vtable es un gran ejemplo de cómo es útil conocer las funciones internas de las llamadas a funciones virtuales. Considere un error similar donde, en lugar de que el puntero vtable sea nulo , es basura . Una forma de darse cuenta de que es basura sería pasar por el desensamblaje de la llamada a la función virtual y ver que su programa no vaya a ninguna parte en lugar de ir a una vtable válida o un método válido.
Eric Undersander
1

Lo que dijo Eric. También agregaría para evitar "nuevo" donde no es necesario. Es muy común en C #, pero se considera una mala práctica en C ++ 11 y también es más lenta que la asignación de la pila y más peligrosa porque tiene que desasignarla manualmente.

También sería cuidadoso con los libros antiguos, que enseñan prácticas antiguas. Personalmente prefiero foros / sitios web confiables, stackoverflow / isocpp.

Lufi
fuente
Gracias. Estaba buscando consejos / recomendaciones más amplios y generales sobre qué hacer, en lugar de los detalles del idioma para estudiar.
spaceOwl
"Evitar new" no es realmente una recomendación sensata. Usas newcuando tienes punteros. Si class Derived : Base, entonces a Base var = Derived();es ilegal, pero Base *var = new Derived();es legal. Por lo tanto, necesita punteros para que el polimorfismo funcione correctamente, mucho.
bobobobo
Sí, pero puede usar std :: unique_ptr para lograr el polimorfismo y evitar el puntero desnudo (aunque todavía tendrá la nueva palabra clave en el constructor unique_ptr)
Eric B
Lo siento, cometí un error en el comentario anterior. Base var = Derived() funcionaría , pero se cortaría y, sin que usted lo supiera, la información se perdería var. Para solucionar el problema de corte, puede usar punteros.
bobobobo