Recientemente me encontré con este Q / A y hace aproximadamente un año cuando comencé a recorrer este camino; Habría encontrado que este es un muy buen recurso y una página de referencia con respecto a mis propias preguntas relacionadas.
Parte 1:
-Prefacio-
Un poco sobre mi:
A mediados y finales de los 80, cuando todavía estaba en la escuela primaria, desarmaba equipos de música basura, videograbadoras y otros dispositivos electrónicos que eran de los años 50 a los 80 y miraba las placas de circuitos y siempre quería saber cómo funcionaban. trabajo ... ¿Cómo adquirieron realmente la señal de transmisión, produjeron audio, video, hicieron esto y aquello, etc.? Podía reconocer las partes individuales aquí y allá, como una resistencia, un condensador, un diodo y un transistor, pero no lo hice. saber qué hicieron o cómo funcionaron a una edad tan temprana.
A lo largo de los años, siempre he sido excepcional en Matemáticas, Física y Química. Entendí las matemáticas en un alto grado e incluso pude leer algunos circuitos simples o básicos de mis días de secundaria y preparatoria que vinieron después, pero nunca llegué a aprender sobre las puertas lógicas y cómo se construyeron ... Sin embargo, lo hice aprender álgebra booleana en la escuela secundaria de mi clase de honores de lógica, probabilidad y estadística. Todas mis clases de matemáticas y ciencias fueron clases de honor. No tomé Cálculo hasta mi segundo semestre en un colegio comunitario. Hice una prueba de álgebra universitaria y tomé la trigonometría como un curso de actualización. Mi nivel más alto de matemáticas en el aula es el cálculo II de una sola variable.
He estado jugando videojuegos desde que tenía 3 o 4 años. Cuando era niño tuve el Atari, el NES, Sega Genesis y la PS1. A medida que crecía y llegaba a los últimos años de mi adolescencia y principios de los 20, adquirí la PS2 y la SNES con títulos seleccionados preferidos. ¡Esto tampoco tiene en cuenta los juegos de PC que se remontan a Doom!
Siempre he sido un ávido jugador de consolas y PC y esto no incluye juegos de pinball y arcade.
Me regalaron mi primera PC cuando tenía unos 12 años para Navidad a principios de los 90. Los días de DOS 6.0 y Win 3.11 o OS / 2. Desde entonces, siempre he estado familiarizado con la familia de sistemas operativos "Windows" y todos los sistemas que he tenido fueron Arquitectura Intel. He tenido una experiencia limitada con Apple o Mac en la escuela o la universidad, pero nunca tuve el privilegio de trabajar en sistemas Linux. Tengo Cygwin y he intentado aprender bash, pero estoy tan acostumbrado a Dos o la sintaxis del símbolo del sistema.
A principios de los 90 recibía una o dos copias de PC-World y escribía los fragmentos de código en QBasic, que no conocía muy bien e intentaba hacer que esos programas funcionaran. El único que tuvo éxito fue un programa para convertir las pulsaciones de teclas en la fila de teclas de inicio en diferentes tonos de llamada. No me refiero a los tonos de llamada en un teléfono celular, me refiero a una frecuencia continua siempre que mantenga presionada la tecla.
Siempre ha sido una pasión mía no solo querer saber cómo funcionan los dispositivos electrónicos dentro del circuito a nivel digital y lógico, aprender a programar una computadora, sino que siempre he tenido el deseo de querer hacer mi propio video juegos. Incluso a principios de los 90 quería hacer los juegos Frogger y Tetris ...
Esto se convirtió en mi principal motivación y deseo de abordar uno de los tipos más difíciles de desarrollo de programación o software dentro del campo de la informática y es el diseño de motores de juegos en 3D. Hay otros campos en Ciencias de la Computación que son igual de difíciles, sin embargo, cualquier motor de juego sofisticado generalmente o casi todos los incluirá, ya que los componentes individuales o submotores requieren sus técnicas y / o propiedades.
Tenía algo de experiencia en programación desde mis días de escuela secundaria, pero esto se limitó al horrible Visual Basic. Comencé a aprender y aprender C / C ++ alrededor de 2002 - 2003 no hasta unos años después de graduarme de la escuela secundaria en 1999. Incluso hasta el día de hoy no tengo ninguna experiencia de clase universitaria en Ciencias de la Computación o Ingeniería en Computación, sino a través de dedicación y determinación, he aprendido casi todos los conceptos que existen cuando se trata de computadoras, hardware, programación, algoritmos, etc. y aún sigo aprendiendo todo lo que puedo ...
Durante los primeros días de aprendizaje de C / C ++, tuve acceso a Internet, pero Internet estaba en sus primeras etapas, sitios web como Amazon, Youtube, Facebook, etc., aún no existían, todavía eran los días de 56k módems de acceso telefónico que aumentan su línea telefónica si no tuviera una segunda línea dedicada. Tomaría unos minutos para que una imagen se muestre en la pantalla, sin importar la reproducción continua de video.
Entonces, cuando se trataba de investigar y aprender a programar en C ++, los recursos eran limitados y la mayoría estaban en formato de texto. Al intentar abordar los proyectos de los primeros días de tutoría en Internet, muchos de esos proyectos no estaban completamente completos, los escritores eran profesionales o estudiantes universitarios e hicieron muchas suposiciones de que el lector ya estaba familiarizado con muchos de los conceptos necesarios, como la compilación , vinculación y depuración e integración de bibliotecas.
Para alguien que no sabe nada sobre esos temas, está perdido porque no sabe qué salió mal, ni cómo solucionarlo y cómo hacer que funcione correctamente. Me llevó muchas horas de prueba y error en esos días con recursos muy limitados. ¡Pedir ayuda como podemos ahora con este sitio web o buscar explicaciones detalladas que pueda encontrar en cppreference no estaba disponible! Si personalmente no conocía a nadie, ¡no había tantos a los que pudiera recurrir para obtener ayuda!
A medida que pasó el tiempo, mejoré algunos de mis conocimientos aquí y allá, y finalmente Internet mejoró a DSL, y ahora Internet de alta velocidad, los sitios web se volvieron más interactivos, los videos comenzaron a aparecer, la calidad de los videos mejoró con el tiempo, sitios como a medida que Youtube comenzó a aparecer y las cosas se volvieron un poco más fáciles en el lado de la investigación. Más y más tutoriales estuvieron disponibles, algunos eran buenos y útiles, mientras que otros enseñaban malas prácticas ...
También pasé mucho tiempo buscando y adquiriendo las herramientas necesarias para el desarrollo. Tuve que aprender la sintaxis del lenguaje, el compilador y el proceso de compilación, vinculación, construcción y depuración. Luego tuve que aprender sobre las diferentes bibliotecas y API disponibles que hay y cómo configurar mis proyectos o soluciones para vincular todas esas dependencias.
A lo largo de los años, he visto crecer, evolucionar y adaptarse el lenguaje C ++ con el tiempo. Al principio se mantuvo casi igual durante muchos años, pero en los últimos 10 años ha cambiado drásticamente en este corto lapso desde su inicio.
Menciono todo esto porque C ++ es uno de los lenguajes más difíciles de dominar por completo debido a su versatilidad, potencia, rico conjunto de características y la capacidad de permitirte dispararte en el pie. E incluso con todas sus advertencias, es uno de los lenguajes más potentes y preferidos que se utiliza en la industria líder como estándar para este tipo de desarrollo porque, cuando se hace correctamente, es rápido, conciso, confiable y utiliza el huella de pie más pequeña.
Desde entonces, he sido autodidacta en C / C ++ durante muchos años con la intención y el enfoque en aprender programación de gráficos 3D y diseño de motores de juegos. He dedicado de 100 a 1,000 horas de búsqueda, investigación y mucho más en lectura, aprendizaje y aplicación de ese conocimiento en el diseño de productos y aplicaciones de trabajo útiles. Siempre he tenido la voluntad y el deseo de querer aprender más para mejorar mis habilidades y habilidades.
Esta fue la primera etapa, luego comencé a leer y trabajar inicialmente con DirectX 9.c, lo que hice en C / C ++ e incluso C #. Luego me mudé a DirectX 10 y Legacy OpenGL 1.0. De ellos vinieron DirectX 11 y OpenGL 3.x - 4.xy ahora incluso he probado suerte en Vulkan.
He creado motores de juegos exitosos trabajando a través de varios tutoriales en línea, tanto en formato de texto como de video. Ya dije que tenía una sólida formación en matemáticas, pero se limitaba al cálculo I y II. Tuve que enseñarme a mí mismo Cálculo vectorial del que tenía conocimiento de mi clase de Física basada en Cálculo en la universidad, pero en cuanto a Álgebra lineal con transformaciones afines y geometría analítica, tuve que aprenderlos por mi cuenta cuando ciertas ecuaciones, funciones, métodos, algoritmos y Se necesitaban conceptos. Luego tuve que aprender a traducirlos en un código eficiente, legible, confiable y reutilizable que fuera genérico y libre de errores lo más posible, lo que supondría cientos de miles de horas de depuración.
Ha sido un viaje maravilloso aprender los temas y algoritmos que incluyen administración de memoria, conteo de referencias, creación de instancias, recursión y mucho más que se utilizan en muchos, si no en todos, los componentes de un motor de juego donde son vastos. Podría enumerarlos todos aquí, pero eso sería suficiente información para llenar 3 o 4 espacios de respuesta por escrito. Sin embargo, incluiré la lista de temas generales, pero no sus subtemas.
Aquí están los temas o la lista de temas en lo que consiste en un motor de juego completamente funcional que incluye todas las diversas técnicas de desgarrado, configuración de las tuberías de renderizado y sombreado, técnicas de sombreado e iluminación a través de sombreadores, procesamiento previo y posterior, amortiguadores de cuadros, amortiguadores posteriores , carga de imágenes, carga y análisis de audio y modelos, creación de formas primitivas con propiedades de material de color, textura y coordenadas normales con mapeo manual de texturas, transformaciones de objetos, tipos de cámara, jerarquías de gráficos de escena, clases de administrador para texturas, audio, fuentes y sombreadores y gestión de memoria, sistema de registro con manejo de excepciones, técnicas de programación de subprocesos múltiples y paralelos, redes, motor de física, detección de colisión, generador de partículas, animación, IA del juego, generación de terreno, cajas de cielo y domos de cielo, representación de agua,follaje y más ..., GUI con fuente texturizada para la representación de texto, superposiciones de HUD, inventarios, generación de mapas y macros, sistema de estado y máquinas de estado, y finalmente escribir un analizador para crear su propio lenguaje de secuencias de comandos para automatizar gran parte de estos objetos. la capacidad de cambiar los valores de datos dentro del motor sin tener que volver a compilar simplemente cargando los archivos de datos para llenar los objetos y estructuras de datos dentro de sus respectivos contenedores al inicio de la aplicación.y finalmente escribir un analizador para crear su propio lenguaje de secuencias de comandos para automatizar gran parte de estos objetos para tener la capacidad de cambiar los valores de datos dentro del motor sin tener que volver a compilar simplemente cargando los archivos de datos para llenar los objetos y estructuras de datos dentro de sus respectivos contenedores al inicio de la aplicación.y finalmente escribir un analizador para crear su propio lenguaje de secuencias de comandos para automatizar gran parte de estos objetos para tener la capacidad de cambiar los valores de datos dentro del motor sin tener que volver a compilar simplemente cargando los archivos de datos para llenar los objetos y estructuras de datos dentro de sus respectivos contenedores al inicio de la aplicación.
A lo largo de los años, me ha intrigado querer aprender lenguaje ensamblador, de ellos quería aprender sobre compiladores, ensambladores y sistemas operativos simples, me refiero a su funcionamiento interno, cómo se construyen y diseñan.
Pasó el tiempo y luego me aparté un poco y comencé a aprender a emular hardware. Me centré específicamente en el NES pero quería aprender la emulación de hardware de las CPU en general. Esto me llevó a aprender sobre el conjunto de instrucciones en el que ya conocía el concepto y lo que era, ya que estaba familiarizado con la familia x86 de Intel hasta cierto punto, pero ahora tenía que aprender el Conjunto de instrucciones 6502.
Sin embargo, al sumergirme en esto, terminé investigando más y comencé a aprender sobre la arquitectura del conjunto de instrucciones desde una perspectiva de ingeniería. Esto me llevó a aprender sobre cómo se construye la CPU a partir de las puertas lógicas y cómo se construyen las puertas lógicas a partir de los transistores junto con otros diversos componentes eléctricos. Así que terminé aprendiendo sobre esto desde dos perspectivas de arriba hacia abajo y de abajo hacia arriba. Ambos métodos fueron muy efectivos y creo que aprender de ambos ayuda a construir ese puente o brecha donde el software se une al hardware.
A partir de esto, tuve que actualizar mi Álgebra booleana y terminé aprendiendo sobre K-Maps, Tablas de implicación, Máquinas de estado tanto Mealy como Moore y varias otras cosas que relacionan la lógica binaria y la aritmética con las puertas lógicas físicas y los circuitos integrados. Y esto me lleva al pasado resentido donde comencé a trabajar con Logisim y comencé a aprender HDL, VHDL, Verilog, etc.
He estado aprendiendo todo esto en mi tiempo libre cuando pude durante los últimos 15-18 años.
Estos son algunos de los sitios y enlaces que me han guiado a lo largo de los años. Muchos de estos son recientes, ya que muchos de los sitios de los que aprendí originalmente ya no existen, he perdido sus enlaces y no recuerdo, o los motores de búsqueda los empujaron al final de sus listas de búsqueda ...
Lenguajes - C ++
Tutoriales de gráficos 3D y sitios web de recursos
Las series y canales de Youtube cubren los temas anteriores, así como hardware, informática e ingeniería eléctrica. Hay demasiados para enumerar, así que enumeraré algunos de ellos aquí que encuentro más útiles e ingeniosos. No proporcionaré los enlaces, pero puedes buscar en YouTube estos canales.
- 3Blue1Brown - Matemáticas avanzadas
- Bisqwit - Programación avanzada C / C ++ (Proyectos de aplicación) - Emulador de hardware NES
- Jason Turner - Técnicas avanzadas de programación moderna en C ++
- javidx9 - Programación avanzada C / C ++ (Proyectos de aplicación) - Emulador de hardware NES / Algunos ensamblajes
- MIT OpenCourse - Cursos universitarios en matemáticas y ciencias de la computación
- Bilkent Online Courses - Cursos universitarios en informática e ingeniería informática (diseño de CPU MIPS)
- The Cherno - Temas y aplicaciones avanzados de programación C / C ++ - Desarrollo de motores de juegos
- Ben Eater - Ingeniería de hardware - Aplicación práctica a través de paneles de pruebas
- Neso Academy - Ingeniería de hardware - Teoría y conceptos
- Socratica - Programación en Python
- En pocas palabras - Ingeniería de hardware - Teoría y conceptos
- Bitwise - C / C ++ avanzado Diseño de un ensamblador mediante emulación de hardware
- Bo Qian - C ++ Temas en estructuras de datos y algoritmos.
- LineByLine - Programación Vulkan
- Joshua Shucker - Programación Vulkan
- www.MarekKnows.com - C ++, Matemáticas 3D y Desarrollo de motores de juegos
Y estos no tienen en cuenta algunos de los varios libros que tengo sobre estos temas.
-Nota- Por favor no vote sobre esto, ya que este es solo un mensaje para el lector de mi propia experiencia personal y no tiene ningún intento de responder o hacer referencia a la pregunta original. En los próximos días cuando tenga tiempo; Agregaré una respuesta de seguimiento para dar mi opinión sobre la pregunta del OP mientras proporciono enlaces útiles como referencia y conjunto de recursos y actualizaré esta respuesta también para incluir algunos enlaces aquí y modificar esta nota. Es tarde y actualmente no tengo tiempo para revisar y editar lo que ya he escrito. Lo haré cuando pueda ".