J'ai récemment rencontré ce Q / R et il y a environ un an environ quand j'ai commencé à voyager dans cette voie; J'aurais trouvé que c'était une très bonne ressource et une page de référence en ce qui concerne mes propres questions.
Partie 1:
-Préface-
Un peu de moi:
Entre le milieu et la fin des années 80, alors que j'étais encore à l'école primaire, je démontais les stéréos indésirables, les magnétoscopes et autres appareils à électrons des années 50 aux années 80 et je regardais les circuits imprimés et je voulais toujours savoir comment travailler ... Comment ont-ils réellement acquis le signal de diffusion, produit de l'audio, de la vidéo, fait ceci et cela, etc. savent ce qu'ils ont fait ou comment ils ont fonctionné à un si jeune âge.
Au fil des ans, j'ai toujours été exceptionnel en mathématiques, physique et chimie. J'ai compris les mathématiques à un haut degré et je pouvais même lire des circuits simples ou basiques de mes années de collège et de lycée qui sont venus plus tard, mais je n'ai jamais réussi à en apprendre davantage sur les portes logiques et comment elles ont été construites ... apprendre l'algèbre booléenne au lycée de mon cours de logique, probabilités et statistiques. Tous mes cours de mathématiques et de sciences étaient des cours de spécialisation. Je n'ai pas pris de calcul avant mon deuxième semestre dans un collège communautaire. J'ai testé le Collège d'Algèbre et pris la Trigonométrie comme un cours de recyclage. Mon plus haut niveau de mathématiques en classe est le calcul II d'une seule variable.
Je joue aux jeux vidéo depuis l'âge de 3 ou 4 ans. Enfant, j'avais l'Atari, la NES, la Sega Genesis et la PS1. En vieillissant et à la fin de mon adolescence et au début de la vingtaine, j'avais acquis la PS2 et la SNES avec des titres sélectionnés préférés. Cela ne tient pas compte non plus des jeux sur PC qui remontent à Doom!
J'ai toujours été un passionné de console et de PC et cela n'inclut pas les jeux de flipper et d'arcade.
On m'a donné mon premier PC quand j'avais environ 12 ans pour Noël au début des années 90. Les jours de DOS 6.0 et Win 3.11 ou OS / 2. Depuis lors, j'ai toujours été familier avec la famille de systèmes d'exploitation "Windows" et tous les systèmes que j'ai eu étaient Intel Architecture. J'ai eu une expérience limitée avec Apple ou Mac de l'école ou du collège, mais je n'ai jamais eu le privilège de travailler sur des systèmes Linux. J'ai Cygwin et j'ai essayé d'apprendre bash, mais je suis tellement habitué à Dos ou à la syntaxe d'invite de commandes.
Au début des années 90, j'obtenais une copie ou deux de PC-World et je tapais les extraits de code dans QBasic que je ne connaissais pas très bien et j'essayais de faire fonctionner ces programmes. Le seul qui a réussi a été un programme pour transformer les appuis sur les touches de la rangée de touches principale en différents sons de sonnerie. Je ne veux pas dire les sonneries sur un téléphone portable, je veux dire une fréquence continue tant que vous maintenez la touche enfoncée.
Ça a toujours été une passion pour moi non seulement de vouloir savoir comment les appareils électroniques fonctionnaient au sein de la circuité au niveau numérique et logique, d'apprendre à programmer un ordinateur, mais j'ai toujours eu le désir de vouloir faire ma propre vidéo Jeux. Même au début des années 90, je voulais faire les jeux Frogger et Tetris ...
Cela est devenu ma principale motivation et mon désir d'aborder l'un des types de programmation ou de développement de logiciels les plus difficiles dans le domaine de l'informatique, à savoir la conception de moteurs de jeux 3D. Il existe d'autres domaines en informatique qui sont tout aussi difficiles, mais tous les moteurs de jeu sophistiqués les incluront généralement ou généralement presque tous, car les composants ou sous-moteurs individuels nécessitent leurs techniques et / ou leurs propriétés.
J'avais des antécédents en programmation depuis mes jours de lycée, mais cela se limitait à l'horrible Visual Basic. J'ai commencé à apprendre et à apprendre le C / C ++ vers 2002 - 2003, seulement quelques années après avoir obtenu mon diplôme d'études secondaires en 1999. Même à ce jour, je n'ai aucune expérience universitaire en informatique ou en génie informatique, mais grâce à dévouement et détermination, j'ai appris à peu près tous les concepts qui existent en matière d'ordinateurs, de matériel, de programmation, d'algorithmes, etc. et je continue d'apprendre autant que je peux ...
Au tout début de l'apprentissage du C / C ++, j'avais accès à Internet mais Internet n'en était qu'à ses débuts, des sites comme Amazon, Youtube, Facebook etc. n'existaient même pas encore, c'était encore l'époque du 56k composez des modems qui marchent votre ligne téléphonique si vous n'avez pas de deuxième ligne dédiée. Cela prendrait des minutes juste pour qu'une image soit rendue à l'écran, sans parler de la lecture vidéo continue.
Ainsi, en ce qui concerne la recherche et l'apprentissage de la programmation en C ++, les ressources étaient limitées et la plupart étaient au format texte. En tentant de s'attaquer aux projets dès les premiers jours du didacticiel sur Internet, bon nombre de ces projets n'étaient pas entièrement terminés, les auteurs étaient soit des professionnels, soit des étudiants et ils avaient fait de nombreuses hypothèses selon lesquelles le lecteur connaissait déjà bon nombre des concepts nécessaires tels que la compilation , liaison et débogage et intégration de bibliothèque.
Pour quelqu'un qui ne sait rien de ces sujets, ils sont perdus parce qu'ils ne savent pas ce qui s'est mal passé, ni comment y remédier, ni comment le faire fonctionner correctement. Cela m'a pris de nombreuses heures d'essais et d'erreurs à cette époque avec des ressources très limitées. Demander de l'aide telle que nous pouvons maintenant avec ce site Web ou chercher des explications détaillées que vous pouvez trouver sur cppreference n'était pas disponible! Si vous ne connaissiez personnellement personne, vous ne pouviez pas vous adresser à beaucoup pour obtenir de l'aide!
Au fil du temps, j'ai amélioré certaines de mes connaissances ici et là, et finalement Internet s'est amélioré en DSL, et maintenant Internet haute vitesse, les sites Web sont devenus plus interactifs, les vidéos ont commencé à apparaître, la qualité des vidéos s'est améliorée avec le temps, des sites tels que lorsque Youtube a commencé à apparaître et que les choses sont devenues un peu plus faciles du côté de la recherche. De plus en plus de tutoriels sont devenus facilement disponibles, certains étaient bons et utiles là où d'autres enseignaient les mauvaises pratiques ...
J'avais également passé beaucoup de temps à trouver et à acquérir les outils nécessaires au développement. J'ai dû apprendre la syntaxe du langage, le compilateur et le processus de compilation, la liaison, la construction et le débogage. Ensuite, j'ai dû en apprendre davantage sur les différentes bibliothèques et API disponibles et comment configurer mes projets ou solutions pour lier toutes ces dépendances.
Au fil des ans, j'ai vu le langage C ++ grandir, évoluer et s'adapter au fil du temps. Au début, il est resté presque le même pendant de nombreuses années, mais au cours des 10 dernières années, il a radicalement changé au cours de cette courte période depuis sa création.
Je mentionne tout cela parce que C ++ est l'un des langages les plus difficiles à maîtriser pleinement en raison de sa polyvalence, de sa puissance, de ses nombreuses fonctionnalités et de sa capacité à vous permettre de vous tirer une balle dans le pied! Et même avec toutes ses mises en garde, il s'agit de l'un des langages les plus puissants et préférés qui est utilisé dans le top de l'industrie comme standard pour ce type de développement parce que lorsqu'il est fait correctement, il est rapide, concis, fiable et utilise le plus petite empreinte de pied.
Depuis lors, je suis autodidacte en C / C ++ depuis de nombreuses années avec l'intention et la concentration sur l'apprentissage de la programmation graphique 3D et de la conception du moteur de jeu. J'ai investi de 100 à 1 000 heures de recherche, de recherche et bien plus encore dans la lecture, l'apprentissage et l'application de ces connaissances dans la conception de produits et d'applications de travail utiles. J'ai toujours eu la volonté et le désir de vouloir en savoir plus pour améliorer mes compétences et mon métier.
C'était la première étape, puis j'avais commencé à lire et à travailler avec initialement DirectX 9.c, ce que j'ai fait en C / C ++ et même en C #. Ensuite, je suis passé à DirectX 10 et à Legacy OpenGL 1.0. De leur vient DirectX 11 et OpenGL 3.x - 4.x et maintenant j'ai même essayé Vulkan.
J'ai construit des moteurs de jeu performants à travers différents didacticiels en ligne à la fois au format texte et vidéo. J'ai déjà déclaré que j'avais une solide formation en mathématiques, mais cela se limitait au calcul I et II. J'ai dû m'enseigner le calcul vectoriel dont j'avais quelques connaissances dans mon cours de physique basé sur le calcul à l'université, mais comme pour l'algèbre linéaire avec les transformations affines et la géométrie analytique, j'ai dû les apprendre par moi-même lorsque certaines équations, fonctions, méthodes, algorithmes et des concepts étaient nécessaires. Ensuite, j'ai dû apprendre à les traduire en un code efficace, lisible, fiable et réutilisable qui était générique et sans bogue autant que possible, mettant des centaines à des milliers d'heures de débogage.
Ce fut un merveilleux voyage pour apprendre les sujets et les algorithmes qui incluent la gestion de la mémoire, le comptage des références, l'instanciation, la récursivité et bien plus encore qui sont utilisés dans de nombreux sinon tous les composants d'un moteur de jeu où ils sont vastes. Je pourrais les énumérer tous ici, mais ce serait suffisamment d'informations pour remplir 3 ou 4 espaces de réponses qui méritent d'être écrits. Cependant, je vais inclure la liste des sujets généraux mais pas leurs sous-sujets.
Voici les sujets ou la liste des sujets dans ce qui consiste en un moteur de jeu entièrement fonctionnel qui comprend toutes les diverses techniques de rendu, la configuration des pipelines de rendu et de shader, les techniques d'ombrage et d'éclairage via les shaders, le pré et post-traitement, les tampons de cadre, les tampons de retour , chargement d'image, chargement et analyse audio et de modèle, création de formes primitives avec des propriétés de matériau de couleur, texture et coordonnées normales avec mappage de texture manuel, transformations d'objet, types de caméra, hiérarchies de graphiques de scène, classes de gestionnaire pour les textures, l'audio, les polices et les shaders et gestion de la mémoire, système de journalisation avec gestion des exceptions, techniques de programmation multithread et parallèle, mise en réseau, moteur physique, détection de collision, générateur de particules, animation, IA de jeu, génération de terrain, boîtiers ciel et dômes ciel, rendu d'eau,feuillage et plus ..., des interfaces graphiques avec une police texturée pour le rendu de texte, des superpositions HUD, des inventaires, la génération de cartes et de macros, un système d'état et des machines d'état, et enfin l'écriture d'un analyseur pour créer votre propre langage de script pour automatiser la plupart de ces objets à avoir la possibilité de modifier les valeurs des données dans le moteur sans avoir à recompiler simplement en chargeant dans les fichiers de données pour remplir les objets de données et les structures dans leurs conteneurs respectifs au démarrage de l'application.et enfin écrire un analyseur pour créer votre propre langage de script pour automatiser une grande partie de ces objets pour avoir la possibilité de modifier les valeurs des données dans le moteur sans avoir à recompiler simplement en chargeant dans les fichiers de données pour remplir les objets et les structures de données dans leurs conteneurs respectifs au démarrage de l'application.et enfin écrire un analyseur pour créer votre propre langage de script pour automatiser une grande partie de ces objets pour avoir la possibilité de modifier les valeurs des données dans le moteur sans avoir à recompiler simplement en chargeant dans les fichiers de données pour remplir les objets et les structures de données dans leurs conteneurs respectifs au démarrage de l'application.
Au fil des années, j'ai été intrigué de vouloir apprendre le langage d'assemblage, de leur je voulais en savoir plus sur les compilateurs, les assembleurs et les systèmes d'exploitation simples, je veux dire leur fonctionnement interne, comment ils sont construits et conçus.
Le temps a passé, puis j'ai fait un petit pas et j'ai commencé à apprendre l'émulation matérielle. Je me suis concentré spécifiquement sur la NES mais je voulais apprendre l'émulation matérielle des CPU en général. Cela m'a amené à en apprendre davantage sur le jeu d'instructions dans lequel je connaissais déjà le concept et ce que c'était car j'étais déjà familier avec la famille x86 d'Intel dans une certaine mesure, mais maintenant je devais apprendre le jeu d'instructions 6502.
Pourtant, en plongeant dans ce domaine, j'ai fini par faire plus de recherches et j'ai commencé à en apprendre davantage sur l'architecture du jeu d'instructions du point de vue de l'ingénierie. Cela m'a permis d'apprendre comment le CPU est construit à partir des portes logiques et comment les portes logiques sont construites à partir de transistors avec d'autres composants électriques divers. J'ai donc fini par apprendre à ce sujet sous deux angles: de haut en bas et de bas en haut. Les deux méthodes ont été très efficaces et je pense que l'apprentissage des deux aide à créer ce pont ou cet écart où le logiciel alimente le matériel.
À partir de cela, j'ai dû rafraîchir mon algèbre booléenne et j'ai fini par en apprendre davantage sur K-Maps, les tables d'implication, les machines d'état à la fois Mealy et Moore et diverses autres choses qui relient la logique binaire et l'arithmétique aux portes logiques physiques et aux circuits intégrés. Et cela m'amène au passé de ressentiment où j'ai commencé à travailler avec Logisim, et commencé à apprendre le HDL, le VHDL, Verilog etc ...
J'ai appris tout cela pendant mon temps libre quand je le pouvais au cours des 15 à 18 dernières années.
Voici quelques sites et liens qui m'ont guidé au fil des ans. Beaucoup d'entre eux sont récents, car bon nombre des sites que j'ai appris à l'origine n'existent plus, j'ai perdu leurs liens et je ne m'en souviens pas, ou les moteurs de recherche les ont poussés au fond de leurs listes de recherche ...
Langages - C ++
Tutoriels graphiques 3D et sites Web de ressources
La série et les chaînes Youtube couvrent les sujets ci-dessus ainsi que le génie matériel, informatique et électrique. Il y en a trop pour les énumérer, je vais donc en énumérer quelques-unes ici que je trouve les plus utiles et les plus ingénieuses. Je ne fournirai pas les liens, mais vous pouvez rechercher sur YouTube ces chaînes.
- 3Blue1Brown - Mathématiques avancées
- Bisqwit - Programmation C / C ++ avancée (projets d'application) - Emulateur matériel NES
- Jason Turner - Techniques de programmation C ++ modernes avancées
- javidx9 - Programmation C / C ++ avancée (projets d'application) - émulateur matériel NES / certains assemblages
- MIT OpenCourse - Cours collégiaux en mathématiques et informatique
- Cours en ligne Bilkent - Cours collégiaux en informatique et génie informatique (CPU Design MIPS)
- The Cherno - Thèmes et applications de programmation C / C ++ avancée - Développement de moteur de jeu
- Ben Eater - Ingénierie matérielle - Application pratique via des maquettes
- Neso Academy - Ingénierie matérielle - Théorie et concepts
- Socratica - Programmation Python
- En termes simples - Ingénierie matérielle - Théorie et concepts
- Bitwise - Conception C / C ++ avancée d'un assembleur via une émulation matérielle
- Bo Qian - C ++ Sujets en structures de données et algorithmes.
- LineByLine - Programmation Vulkan
- Joshua Shucker - Programmation Vulkan
- www.MarekKnows.com - Développement C ++, 3D Math et moteur de jeu
Et ceux-ci ne tiennent pas compte de certains des différents livres que j'ai sur ces sujets.
-Note- S'il vous plaît ne votez pas sur ce point car il ne s'agit que d'un message au lecteur de ma propre expérience personnelle et est dénué de toute tentative de réponse ou de référence à la question d'origine. Dans les prochains jours, quand j'aurai le temps; Je vais ajouter une réponse de suivi pour donner mon avis sur la question du PO tout en fournissant des liens utiles comme référence et un ensemble de ressources et je mettrai également à jour cette réponse pour inclure quelques liens ici et pour modifier cette note. Il est tard et je n'ai actuellement pas le temps de relire et d'éditer ce que j'ai déjà écrit. Je ferai ça quand je pourrai ".