Ich bin vor kurzem auf dieses Q / A gestoßen und vor ungefähr einem Jahr, als ich angefangen habe, diesen Weg zu gehen. Ich hätte festgestellt, dass dies eine sehr gute Ressource und Referenzseite in Bezug auf meine eigenen verwandten Fragen ist.
Teil 1:
-Vorbereitung-
Ein bisschen über mich:
Mitte bis Ende der 80er Jahre, als ich noch in der Grundschule war, zerlegte ich Schrott-Stereoanlagen, Videorecorder und andere Elektronengeräte, die in den 50er bis 80er Jahren hergestellt wurden, und schaute auf die Leiterplatten und wollte immer wissen, wie sie waren Arbeit ... Wie haben sie eigentlich das Sendesignal aufgenommen, Audio, Video produziert, dies und das getan usw. ... Ich konnte die einzelnen Teile hier und da erkennen, wie z. B. einen Widerstand, einen Kondensator, eine Diode und einen Transistor, aber nicht wissen, was sie getan haben oder wie sie in einem so jungen Alter funktionierten.
Im Laufe der Jahre war ich immer außergewöhnlich in Mathematik, Physik und Chemie. Ich verstand Mathe zu einem hohen Grad und konnte sogar einige einfache oder grundlegende Schaltkreise aus meiner Mittel- und Oberschulzeit lesen, die später kamen, aber ich habe es nie geschafft, etwas über die Logikgatter und ihren Aufbau zu lernen ... das tat ich jedoch lerne Boolesche Algebra in der High School aus meiner Klasse Logic, Probability and Statistics Honors. Alle meine mathematischen und naturwissenschaftlichen Klassen waren Ehrenklassen. Ich habe Calculus erst in meinem zweiten Semester an einem Community College absolviert. Ich habe die College-Algebra abgeschlossen und Trigonometrie als Auffrischungskurs belegt. Meine höchste Mathematikstufe im Klassenzimmer ist Kalkül II einer einzelnen Variablen.
Ich spiele seit meinem dritten oder vierten Lebensjahr Videospiele. Als Kind hatte ich den Atari, den NES, Sega Genesis und die PS1. Als ich älter wurde und in meine späten Teenager und frühen 20er Jahre kam, hatte ich die PS2 und die SNES mit bevorzugten ausgewählten Titeln erworben. Dies gilt auch nicht für PC-Spiele, die bis zu Doom!
Ich war schon immer ein begeisterter Konsolen- und PC-Spieler und dies schließt keine Flipper- und Arcade-Spiele ein.
Ich bekam meinen ersten PC, als ich zu Weihnachten in den frühen 90ern ungefähr 12 Jahre alt war. Die Tage von DOS 6.0 und entweder Win 3.11 oder OS / 2. Seitdem war ich immer mit der "Windows" -Betriebssystemfamilie vertraut, und alle Systeme, die ich hatte, waren Intel Architecture. Ich hatte von der Schule oder vom College an nur begrenzte Erfahrung mit Apple oder Mac, aber ich hatte nie das Privileg, auf Linux-Systemen zu arbeiten. Ich habe Cygwin und ich habe versucht, Bash zu lernen, aber ich bin so an Dos oder die Eingabeaufforderungssyntax gewöhnt.
In den frühen 90ern bekam ich ein oder zwei Exemplare von PC-World und tippte die Code-Schnipsel in QBasic ein, die ich nicht sehr gut kannte und versuchte, diese Programme zum Laufen zu bringen. Das einzige Programm, das erfolgreich war, war ein Programm, das das Drücken von Schlüsseln in der Haupttastenreihe in verschiedene Klingeltöne umwandelte. Ich meine nicht die Klingeltöne auf einem Handy. Ich meine eine kontinuierliche Frequenz, solange Sie die Taste gedrückt halten.
Es war schon immer meine Leidenschaft, nicht nur wissen zu wollen, wie elektronische Geräte auf digitaler und logischer Ebene funktionieren, sondern auch zu lernen, wie man einen Computer programmiert, sondern ich hatte immer den Wunsch, mein eigenes Video zu machen Spiele. Schon in den frühen 90ern wollte ich die Spiele Frogger und Tetris machen ...
Dies wurde meine Hauptmotivation und mein Wunsch, mich mit einer der härtesten Arten der Programmierung oder Softwareentwicklung auf dem Gebiet der Informatik zu befassen, und das ist 3D Game Engine Design. Es gibt andere Bereiche in der Informatik, die genauso schwierig sind, aber jede hochentwickelte Spiel-Engine wird in der Regel fast alle umfassen, da die einzelnen Komponenten oder Sub-Engines ihre Techniken und / oder Eigenschaften erfordern.
Ich hatte einige Programmierkenntnisse aus meiner High School-Zeit, aber diese beschränkten sich auf das schreckliche Visual Basic. Ich fing an, C / C ++ zwischen 2002 und 2003 zu lernen, und zwar erst ein paar Jahre nachdem ich 1999 mein Abitur gemacht hatte. Bis heute habe ich keine College-Erfahrung in Informatik oder Computertechnik, sondern durch Hingabe und Entschlossenheit, ich habe so gut wie jedes Konzept gelernt, das es gibt, wenn es um Computer, Hardware, Programmierung, Algorithmen usw. geht, und ich lerne immer noch so viel ich kann ...
In den frühen Tagen des Lernens von C / C ++ hatte ich Zugang zum Internet, aber das Internet befand sich noch in den Anfängen, Websites wie Amazon, Youtube, Facebook usw. existierten noch nicht einmal, es waren noch 56.000 Tage Wählmodems, die Ihre Telefonleitung aufrüsten, wenn Sie keine zweite Standleitung haben. Es würde Minuten dauern, bis ein Bild auf dem Bildschirm angezeigt wird, unabhängig von der kontinuierlichen Videowiedergabe.
Wenn es darum ging, in C ++ zu recherchieren und zu lernen, wie man programmiert, waren die Ressourcen begrenzt und die meisten im Textformat. Bei dem Versuch, die Projekte aus den Anfängen des Internet-Tutorials in Angriff zu nehmen, waren viele dieser Projekte nicht vollständig abgeschlossen, die Autoren waren entweder Fachleute oder Studenten und sie gingen in vielerlei Hinsicht davon aus, dass der Leser bereits mit vielen der erforderlichen Konzepte wie der Kompilierung vertraut war , Verlinken und Debuggen und Bibliotheksintegration.
Für jemanden, der nichts über diese Themen weiß, ist er ratlos, weil er nicht weiß, was schief gelaufen ist, wie man es repariert und wie man es richtig zum Laufen bringt. Ich habe in jenen Tagen mit sehr begrenzten Ressourcen viele Stunden des Versuchs und Irrtums gebraucht. Um Hilfe zu bitten, wie wir es jetzt mit dieser Website können, oder nach detaillierten Erklärungen zu suchen, die Sie auf cppreference finden können, war nicht verfügbar! Wenn Sie persönlich niemanden kannten, gab es nicht so viele, an die Sie sich wenden konnten, um Hilfe zu erhalten!
Mit der Zeit verbesserte ich hier und da mein Wissen und schließlich wurde das Internet zu DSL. Jetzt wurde das Hochgeschwindigkeitsinternet interaktiver, Videos wurden angezeigt, die Qualität der Videos wurde mit der Zeit besser, Websites wie z als Youtube auftauchte und die Recherche etwas einfacher wurde. Es wurden immer mehr Tutorials verfügbar, einige waren gut und nützlich, andere lehrten schlechte Praktiken ...
Ich hatte auch viel Zeit damit verbracht, die notwendigen Werkzeuge für die Entwicklung zu finden und zu erwerben. Ich musste die Sprachsyntax, den Compiler und den Kompilierungsprozess, das Verknüpfen, Erstellen und Debuggen lernen. Dann musste ich lernen, welche verschiedenen Bibliotheken und APIs zur Verfügung stehen und wie ich meine Projekte oder Lösungen so konfiguriere, dass all diese Abhängigkeiten verknüpft werden.
Im Laufe der Jahre habe ich beobachtet, wie die C ++ - Sprache im Laufe der Zeit gewachsen ist, sich weiterentwickelt und angepasst hat. Am Anfang blieb es viele Jahre lang fast gleich, aber in den letzten 10 Jahren hat es sich innerhalb dieser kurzen Zeitspanne seit seiner Gründung dramatisch verändert.
Ich erwähne dies alles, weil C ++ eine der schwierigsten Sprachen ist, die es zu beherrschen gilt, da es vielseitig, leistungsstark, mit zahlreichen Funktionen ausgestattet und in der Lage ist, sich selbst in den Fuß zu schießen! Und trotz aller Einschränkungen ist es eine der leistungsstärksten und beliebtesten Sprachen, die in der führenden Industrie als Standard für diese Art der Entwicklung verwendet wird, da es bei korrekter Ausführung schnell, präzise, zuverlässig und unter Verwendung der folgenden Sprachen funktioniert kleinster Fußabdruck.
Seitdem bin ich seit vielen Jahren Autodidakt in C / C ++ mit der Absicht und dem Schwerpunkt, 3D-Grafikprogrammierung und Game-Engine-Design zu erlernen. Ich habe 100 bis 1000 Stunden lang gesucht, recherchiert und vieles mehr in das Lesen, Lernen und Anwenden dieses Wissens für die Gestaltung nützlicher Arbeitsprodukte und -anwendungen gesteckt. Ich hatte immer den Willen und den Wunsch, mehr zu lernen, um meine Fähigkeiten und mein Handwerk zu verbessern.
Dies war die erste Phase, dann begann ich mit DirectX 9.c zu lesen und zu arbeiten, was ich in C / C ++ und sogar in C # getan habe. Dann bin ich auf DirectX 10 und Legacy OpenGL 1.0 umgestiegen. Von ihnen kamen DirectX 11 und OpenGL 3.x - 4.x und jetzt habe ich mich sogar an Vulkan versucht.
Ich habe erfolgreiche Spiele-Engines entwickelt, die in verschiedenen Online-Tutorials sowohl in Text- als auch in Videoformaten arbeiten. Ich habe bereits festgestellt, dass ich einen starken Hintergrund in Mathematik habe, dieser war jedoch auf Kalkül I und II beschränkt. Ich musste mir selbst Vektorrechnung beibringen, die ich aus meiner Physikklasse in Analysis kannte, aber für lineare Algebra mit affinen Transformationen und analytischer Geometrie musste ich sie selbst lernen, wenn bestimmte Gleichungen, Funktionen, Methoden, Algorithmen und Konzepte waren gefragt. Dann musste ich lernen, wie man diese in effizienten, lesbaren, zuverlässigen und wiederverwendbaren Code umsetzt, der generisch und fehlerfrei ist und Hunderte bis Tausende von Stunden Debugging erfordert.
Es war eine wunderbare Reise, die Themen und Algorithmen wie Speicherverwaltung, Referenzzählung, Instanziierung, Rekursion und vieles mehr zu lernen, die in vielen, wenn nicht allen Komponenten einer Spiel-Engine verwendet werden, in denen sie sehr umfangreich sind. Ich könnte alle hier auflisten, aber das wäre genug Information, um 3 oder 4 Antwortfelder zu füllen, die es wert sind, geschrieben zu werden. Ich werde jedoch die Liste der allgemeinen Themen nur nicht ihre Unterthemen enthalten.
Hier finden Sie die Themen oder Themenlisten in einer voll funktionsfähigen Game-Engine, die alle verschiedenen Rendertechniken, das Einrichten der Rendering- und Shader-Pipelines, Shading- und Beleuchtungstechniken über Shader, Pre- und Post-Processing, Frame-Buffer und Back-Buffer umfasst , Laden und Parsen von Bildern, Laden von Audio- und Modelldateien, Erstellen primitiver Formen mit Farbmaterialeigenschaften, Textur- und Normalkoordinaten mit manueller Texturzuordnung, Objekttransformationen, Kameratypen, Szenendiagrammhierarchien, Manager-Klassen für Texturen, Audio, Schriftarten und Shader sowie Speicherverwaltung, Protokollierungssystem mit Ausnahmebehandlung, Multithread- und Parallelprogrammiertechniken, Vernetzung, Physik-Engine, Kollisionserkennung, Partikelgenerator, Animation, Spiel-KI, Geländegenerierung, Sky Boxes und Sky Domes, Wasser-Rendering,Laub und mehr ..., GUIs mit strukturierter Schriftart für Textwiedergabe, HUD-Überlagerungen, Inventare, Karten- und Makrogenerierung, Statussystem und Zustandsautomaten und schließlich Schreiben eines Parsers zum Erstellen Ihrer eigenen Skriptsprache, um einen Großteil dieser Objekte zu automatisieren Die Möglichkeit, Datenwerte innerhalb der Engine zu ändern, ohne dass eine Neukompilierung erforderlich ist, indem die Datendateien geladen werden, um die Datenobjekte und -strukturen in ihren jeweiligen Containern beim Start der Anwendung aufzufüllen.und schließlich schreiben Sie einen Parser, um Ihre eigene Skriptsprache zu erstellen, mit der viele dieser Objekte automatisiert werden können, damit Datenwerte innerhalb der Engine geändert werden können, ohne dass eine Neukompilierung erforderlich ist, indem nur die Datendateien geladen werden, um die Datenobjekte und Strukturen in den jeweiligen Containern aufzufüllen beim Start der Anwendung.und schließlich schreiben Sie einen Parser, um Ihre eigene Skriptsprache zu erstellen, mit der viele dieser Objekte automatisiert werden können, damit Datenwerte innerhalb der Engine geändert werden können, ohne dass eine Neukompilierung erforderlich ist, indem nur die Datendateien geladen werden, um die Datenobjekte und Strukturen in den jeweiligen Containern aufzufüllen beim Start der Anwendung.
Über die Jahre hinweg war ich fasziniert, Assemblersprache lernen zu wollen. Ich wollte etwas über Compiler, Assembler und einfache Betriebssysteme lernen, meine ihre internen Abläufe, wie sie gebaut und entworfen wurden.
Die Zeit verging und dann trat ich ein Stückchen vor und fing an, die Hardware-Emulation zu erlernen. Ich habe mich speziell auf das NES konzentriert, wollte aber die Hardware-Emulation von CPUs im Allgemeinen erlernen. Dies führte mich dazu, etwas über den Befehlssatz zu lernen, in dem ich das Konzept bereits kannte, und über das, was es war, da ich mit der x86-Familie von Intel bereits einigermaßen vertraut war, aber jetzt musste ich den Befehlssatz 6502 lernen.
Indem ich mich damit befasste, machte ich am Ende mehr Nachforschungen und lernte die Befehlssatzarchitektur aus technischer Sicht. Dies brachte mich dazu zu lernen, wie die CPU aus den Logikgattern aufgebaut ist und wie die Logikgatter zusammen mit anderen verschiedenen elektrischen Komponenten aus Transistoren aufgebaut sind. So lernte ich dies aus zwei Perspektiven: von oben nach unten und von unten nach oben. Beide Methoden waren sehr effektiv und ich denke, dass das Lernen von beiden dazu beiträgt, die Brücke oder Lücke zu bauen, in der die Software die Hardware bearbeitet.
Aus diesem Grund musste ich meine Boolesche Algebra auffrischen und lernte schließlich K-Maps, Implikationstabellen, Zustandsmaschinen, sowohl Mealy als auch Moore und verschiedene andere Dinge, die Binärlogik und Arithmetik mit den physikalischen logischen Gattern und integrierten Schaltkreisen in Beziehung setzen. Und das bringt mich in die Vergangenheit zurück, in der ich angefangen habe, mit Logisim zu arbeiten und angefangen habe, HDL, VHDL, Verilog usw. zu lernen.
All das habe ich in meiner Freizeit gelernt, wann immer ich konnte. In den letzten 15 - 18 Jahren.
Hier sind einige der Websites und Links, die mich im Laufe der Jahre geführt haben. Viele davon sind neu, da viele der Websites, von denen ich ursprünglich erfahren habe, nicht mehr existieren, ich ihre Links verloren habe und mich nicht erinnere, oder Suchmaschinen sie ganz hinten in ihre Suchlisten verschoben haben ...
Sprachen - C ++
3D-Grafik-Tutorials und Ressourcen-Websites
Youtube-Serien und Kanäle behandeln die oben genannten Themen sowie Hardware, Computer und Elektrotechnik. Es gibt zu viele, um sie aufzulisten, deshalb werde ich hier einige auflisten, die ich am nützlichsten und einfallsreichsten finde. Ich werde die Links nicht bereitstellen, aber Sie können YouTube nach diesen Kanälen durchsuchen.
- 3Blue1Brown - Fortgeschrittene Mathematik
- Bisqwit - Erweiterte C / C ++ - Programmierung (Anwendungsprojekte) - NES Hardware Emulator
- Jason Turner - Fortgeschrittene moderne C ++ - Programmiertechniken
- javidx9 - Fortgeschrittene C / C ++ Programmierung (Anwendungsprojekte) - NES Hardware Emulator / Some Assembly
- MIT OpenCourse - Hochschulkurse in Mathematik und Informatik
- Bilkent Online Courses - Hochschulkurse in Informatik und Computertechnik (CPU Design MIPS)
- The Cherno - Advanced C / C ++ - Programmierthemen und -anwendungen - Game Engine-Entwicklung
- Ben Eater - Hardware Engineering - Praktische Anwendung über Steckbretter
- Neso Academy - Hardware Engineering - Theorie und Konzepte
- Socratica - Python-Programmierung
- Einfach ausgedrückt - Hardware Engineering - Theorie und Konzepte
- Bitweise - Fortgeschrittenes C / C ++ Entwerfen eines Assemblers über Hardware-Emulation
- Bo Qian - C ++ Themen in Datenstrukturen und Algorithmen.
- LineByLine - Vulkan Programmierung
- Joshua Shucker - Vulkan Programmierung
- www.MarekKnows.com - C ++, 3D Math und Game Engine Entwicklung
Und diese berücksichtigen nicht einige der verschiedenen Bücher, die ich zu diesen Themen habe.
-Hinweis- Bitte stimmen Sie nicht darüber ab, da dies nur eine Nachricht an den Leser meiner persönlichen Erfahrung ist und keine Versuche unternommen werden, die ursprüngliche Frage zu beantworten oder auf sie Bezug zu nehmen. In den nächsten Tagen, wenn ich Zeit habe; Ich werde eine Antwort hinzufügen, um meine Gedanken über die Frage des OP zu äußern und nützliche Links als Referenz und Ressourcen bereitzustellen. Außerdem werde ich diese Antwort aktualisieren, um einige Links hier aufzunehmen und diesen Hinweis zu ändern. Es ist spät und ich habe derzeit keine Zeit, das, was ich bereits geschrieben habe, zu korrigieren und zu bearbeiten. Ich mache das, wenn ich kann ".