Di recente mi sono imbattuto in questo Q / A e circa un anno fa circa quando ho iniziato a percorrere questo percorso; Avrei trovato questa un'ottima risorsa e una pagina di riferimento per quanto riguarda le mie domande correlate.
Parte 1:
-Preface-
Un po 'di me:
Dalla metà alla fine degli anni '80, quando ero ancora alla scuola elementare, smontavo stereo stereo, videoregistratore e altri dispositivi elettronici che andavano dagli anni '50 agli anni '80 e guardavano i circuiti stampati e volevo sempre sapere come facevano lavoro ... Come hanno effettivamente acquisito il segnale di trasmissione, prodotto audio, video, fatto questo e quello ecc ... Ho potuto riconoscere le singole parti qua e là come un resister, un condensatore, un diodo e un transistor, ma non lo hanno fatto sapere cosa hanno fatto o come hanno funzionato in così giovane età.
Nel corso degli anni sono sempre stato eccezionale in matematica, fisica e chimica. Ho compreso la matematica in larga misura e ho anche potuto leggere alcuni circuiti semplici o di base della mia scuola media e dei giorni del liceo che sono arrivati dopo, ma non sono mai riuscito a conoscere le porte logiche e il modo in cui sono state costruite ... imparo Algebra booleana al liceo dalla mia lezione di Logica, Probabilità e Statistica. Tutte le mie lezioni di matematica e scienze erano lezioni d'onore. Non ho preso Calculus fino al mio secondo semestre in un college della comunità. Ho provato al College Algebra e ho preso la Trigonometria come corso di aggiornamento. Il mio più alto livello di matematica dalla classe è Calcolo II di una singola variabile.
Gioco ai videogiochi da quando avevo circa 3 o 4 anni. Da bambino avevo Atari, NES, Sega Genesis e PS1. Quando sono cresciuto e ho iniziato la mia adolescenza e all'inizio degli anni 20 avevo acquisito la PS2 e la SNES con titoli scelti preferiti. Anche questo non tiene conto dei giochi per PC che risalgono a Doom!
Sono sempre stato un appassionato giocatore di console e PC e questo non include i giochi di flipper e arcade.
Mi è stato dato il mio primo PC quando avevo circa 12 anni per Natale nei primi anni '90. I giorni di DOS 6.0 e Win 3.11 o OS / 2. Da allora ho sempre avuto familiarità con la famiglia di sistemi operativi "Windows" e tutti i sistemi che ho avuto erano Intel Architecture. Ho avuto un'esperienza limitata con Apple o Mac da scuola o college, ma non ho mai avuto il privilegio di lavorare su sistemi Linux. Ho Cygwin e ho provato a imparare bash, ma sono così abituato a Dos o alla sintassi del prompt dei comandi.
All'inizio degli anni '90 avrei ottenuto una copia o due di PC-World e avrei inserito i frammenti di codice in QBasic che non conoscevo molto bene e che avrei provato a far funzionare quei programmi. L'unico successo è stato un programma per trasformare i tasti premuti sulla riga di tasti home in diversi suoni di suoneria. Non intendo le suonerie su un telefono cellulare, intendo una frequenza continua finché si tiene premuto il tasto.
È sempre stata una mia passione non solo voler sapere come funzionavano i dispositivi elettronici all'interno della circolazione a livello digitale e logico, imparare a programmare un computer, ma ho sempre avuto il desiderio di voler realizzare il mio video Giochi. Già nei primi anni '90 volevo realizzare i giochi Frogger e Tetris ...
Questa è diventata la mia motivazione principale e il desiderio di affrontare uno dei tipi più difficili di programmazione o sviluppo software nel campo dell'Informatica e questo è il 3D Game Engine Design. Ci sono altri campi in Informatica che sono altrettanto difficili, tuttavia qualsiasi motore di gioco sofisticato in genere o di solito li include quasi tutti poiché i singoli componenti o motori secondari richiedono le loro tecniche e proprietà.
Ho avuto un po 'di esperienza nella programmazione dai miei giorni di scuola superiore, ma questo era limitato all'orribile Visual Basic. Ho iniziato a studiare e imparare C / C ++ tra il 2002 e il 2003 non fino a pochi anni dopo essermi diplomato al liceo nel 1999. Ancora oggi non ho alcuna esperienza universitaria in Informatica o Ingegneria Informatica, ma attraverso dedizione e determinazione, ho imparato quasi ogni concetto che esiste quando si tratta di computer, hardware, programmazione, algoritmi, ecc. e continuo ancora ad imparare il più possibile ...
Durante i primi giorni di apprendimento del C / C ++, avevo accesso a Internet ma Internet era nelle sue fasi iniziali, siti web come Amazon, Youtube, Facebook ecc. Non esistevano ancora, erano ancora i giorni di 56k comporre modem che ottimizzano la linea telefonica se non si dispone di una seconda linea dedicata. Occorrerebbero pochi minuti solo per il rendering di un'immagine sullo schermo, per non parlare della riproduzione video continua.
Quindi, quando si trattava di ricerca e apprendimento su come programmare in C ++, le risorse erano limitate e la maggior parte erano in formato testo. Quando hanno tentato di affrontare i progetti fin dai primi giorni di esercitazione su Internet, molti di questi progetti non erano completamente completi, gli scrittori erano professionisti o studenti universitari e hanno fatto molte ipotesi che il lettore avesse già familiarità con molti dei concetti necessari come la compilazione , collegamento e debug e integrazione della libreria.
Per qualcuno che non sa nulla di quegli argomenti, sono in perdita perché non sanno cosa è andato storto, né come risolverlo, e come farlo funzionare correttamente. Mi ci sono volute molte ore di tentativi ed errori in quei giorni con risorse molto limitate. Chiedere aiuto come possiamo ora con questo sito Web o cercare spiegazioni dettagliate che puoi trovare su cppreference non era disponibile! Se personalmente non conoscevi nessuno, non ce n'erano così tanti a cui rivolgersi per ricevere assistenza!
Col passare del tempo ho migliorato alcune delle mie conoscenze qua e là, e alla fine Internet è migliorato con DSL, e ora Internet ad alta velocità, i siti Web sono diventati più interattivi, i video hanno iniziato a comparire, la qualità dei video è migliorata con il tempo, siti come quando Youtube ha iniziato a mostrarsi e le cose sono diventate un po 'più facili dal punto di vista della ricerca. Sempre più tutorial diventarono prontamente disponibili, alcuni erano buoni e utili dove altri insegnavano cattive pratiche ...
Avevo anche dedicato molto tempo alla ricerca e all'acquisizione degli strumenti necessari per lo sviluppo. Ho dovuto imparare la sintassi del linguaggio, il compilatore e il processo di compilazione, collegamento, costruzione e debug. Quindi ho dovuto imparare a conoscere le diverse librerie e API disponibili che sono disponibili e come configurare i miei progetti o soluzioni per collegare tutte queste dipendenze.
Nel corso degli anni ho visto il linguaggio C ++ crescere, evolversi e adattarsi nel tempo. All'inizio è rimasto quasi lo stesso per molti anni, ma negli ultimi 10 anni è cambiato radicalmente in questo breve arco sin dal suo inizio.
Cito tutto questo perché il C ++ è uno dei linguaggi più difficili da padroneggiare completamente per la sua versatilità, potenza, ricco set di funzionalità e la capacità di permettervi di spararvi ai piedi! E anche con tutti i suoi avvertimenti, è uno dei linguaggi più potenti e preferiti che viene utilizzato nel settore leader come standard per questo tipo di sviluppo perché quando fatto correttamente è veloce, conciso, affidabile e utilizza il impronta del piede più piccola.
Da allora sono autodidatta in C / C ++ da molti anni con l'intento e il focus sull'apprendimento della programmazione grafica 3D e del Game Engine Design. Ho impiegato da 100 a 1.000 ore di ricerca, ricerca e molto altro nella lettura, nell'apprendimento e nell'applicazione di tali conoscenze nella progettazione di utili prodotti e applicazioni utili. Ho sempre avuto la volontà e il desiderio di voler saperne di più per migliorare le mie abilità e abilità.
Questo è stato il primo stadio, quindi ho iniziato a leggere e lavorare inizialmente con DirectX 9.c, che ho fatto in C / C ++ e persino in C #. Quindi sono passato a DirectX 10 e Legacy OpenGL 1.0. Dal loro sono usciti DirectX 11 e OpenGL 3.x - 4.x e ora ho persino provato la mia mano su Vulkan.
Ho creato motori di gioco di successo lavorando attraverso vari tutorial online sia in formato testo che video. Ho già affermato di avere una solida preparazione in matematica, ma era limitata al Calcolo I e II. Ho dovuto insegnare a me stesso il calcolo vettoriale di cui avevo una certa conoscenza dalla mia classe di fisica basata sul calcolo al college, ma per quanto riguarda l'algebra lineare con trasformazioni affine e geometria analitica ho dovuto impararli da solo quando certe equazioni, funzioni, metodi, algoritmi e erano necessari concetti. Quindi ho dovuto imparare a tradurli in un codice efficiente, leggibile, affidabile e riutilizzabile che fosse generico e privo di bug, impiegando centinaia o migliaia di ore di debug.
È stato un viaggio meraviglioso imparare gli argomenti e gli algoritmi che includono la gestione della memoria, il conteggio dei riferimenti, l'istanziazione, la ricorsione e molto altro che vengono utilizzati all'interno di molti, se non tutti, i componenti di un motore di gioco in cui sono vasti. Potrei elencarli tutti qui, ma sarebbero sufficienti per riempire 3 o 4 spazi di risposta che vale la pena scrivere. Tuttavia, includerò l'elenco degli argomenti generali, non solo i loro argomenti secondari.
Ecco gli argomenti o l'elenco degli argomenti in ciò che consiste in un motore di gioco completamente funzionale che include tutte le varie tecniche di rendering, impostazione di pipeline di rendering e shader, tecniche di ombreggiatura e illuminazione tramite shader, pre e post elaborazione, frame buffer, back buffer , caricamento delle immagini, caricamento e analisi dell'audio e del modello, creazione di forme primitive con proprietà del materiale di colore, trama e coordinate normali con mappatura manuale delle trame, trasformazioni di oggetti, tipi di videocamera, gerarchie di grafici di scena, classi manager per trame, audio, caratteri e shader e gestione della memoria, sistema di registrazione con gestione delle eccezioni, tecniche di programmazione multi-thread e parallele, collegamento in rete, motore fisico, rilevamento delle collisioni, generatore di particelle, animazione, AI del gioco, generazione del terreno, sky box e sky-dome, rendering dell'acqua,fogliame e altro ancora ..., GUI con font strutturato per il rendering del testo, overlay HUD, inventari, generazione di mappe e macro, sistema statale e macchine a stati, e infine scrivere un parser per creare il proprio linguaggio di scripting per automatizzare gran parte di questi oggetti la possibilità di modificare i valori dei dati all'interno del motore senza dover ricompilare semplicemente caricando i file di dati per popolare gli oggetti dati e le strutture all'interno dei rispettivi contenitori all'avvio dell'applicazione.e infine scrivere un parser per creare il proprio linguaggio di scripting per automatizzare gran parte di questi oggetti per avere la possibilità di modificare i valori dei dati all'interno del motore senza dover ricompilare semplicemente caricando i file di dati per popolare gli oggetti e le strutture dei dati nei rispettivi contenitori all'avvio dell'applicazione.e infine scrivere un parser per creare il proprio linguaggio di scripting per automatizzare gran parte di questi oggetti per avere la possibilità di modificare i valori dei dati all'interno del motore senza dover ricompilare semplicemente caricando i file di dati per popolare gli oggetti e le strutture dei dati nei rispettivi contenitori all'avvio dell'applicazione.
Nel corso degli anni sono stato incuriosito dalla voglia di imparare il linguaggio degli assemblaggi, dai loro volevo conoscere compilatori, assemblatori e semplici sistemi operativi, intendo il loro funzionamento interno, come sono costruiti e progettati.
Il tempo è passato e poi ho fatto un passo un po 'di lato e ho iniziato a studiare l'emulazione hardware. Mi sono concentrato in particolare sul NES ma volevo imparare l'emulazione hardware delle CPU in generale. Questo mi ha portato a conoscere il set di istruzioni in cui già conoscevo il concetto e quello che era poiché conoscevo già in qualche modo la famiglia x86 di Intel, ma ora ho dovuto imparare il set di istruzioni 6502.
Eppure, immergendomi in questo, ho finito per fare ulteriori ricerche e ho iniziato a conoscere l'architettura del set di istruzioni da una prospettiva ingegneristica. Questo mi ha portato a imparare come è costruita la CPU dalle porte logiche e come sono costruite le porte logiche dai transistor insieme ad altri vari componenti elettrici. Così ho finito per imparare questo da due prospettive dall'alto verso il basso e dal basso verso l'alto. Entrambi i metodi sono stati molto efficaci e penso che imparare da entrambi aiuti a costruire quel ponte o gap in cui il software batte l'hardware.
Da questo, ho dovuto rinfrescarmi sulla mia algebra booleana e ho finito per conoscere K-Maps, le tabelle delle implicazioni, le macchine statali sia Mealy e Moore e varie altre cose che collegano la logica binaria e l'aritmetica alle porte logiche fisiche e ai circuiti integrati. E questo mi porta al passato risentito in cui ho iniziato a lavorare con Logisim e ho iniziato a studiare HDL, VHDL, Verilog ecc ...
Ho imparato tutto questo nel mio tempo libero, quando ho potuto negli ultimi 15-18 anni.
Ecco alcuni dei siti e dei collegamenti che mi hanno guidato negli anni. Molti di questi sono recenti poiché molti dei siti da cui ho imparato originariamente non esistono più, ho perso i loro collegamenti e non ricordo, oppure i motori di ricerca li hanno spinti in fondo alle loro liste di ricerca ...
Lingue - C ++
Tutorial sulla grafica 3D e siti Web di risorse
Le serie e i canali di Youtube trattano gli argomenti sopra, nonché hardware, computer ed ingegneria elettrica. Ce ne sono troppi da elencare, quindi ne elencherò alcuni qui che trovo più utili e pieni di risorse. Non fornirò i link ma puoi cercare su YouTube questi canali.
- 3Blue1Brown - Matematica avanzata
- Bisqwit - Programmazione C / C ++ avanzata (progetti applicativi) - Emulatore hardware NES
- Jason Turner - Tecniche avanzate di programmazione C ++ moderna
- javidx9 - Programmazione C / C ++ avanzata (progetti applicativi) - Emulatore hardware NES / Some Assembly
- MIT OpenCourse - Corsi universitari in matematica e informatica
- Corsi online Bilkent - Corsi universitari in informatica e ingegneria informatica (CPU Design MIPS)
- The Cherno - Temi e applicazioni di programmazione avanzata C / C ++ - Sviluppo di motori di gioco
- Ben Eater - Hardware Engineering - Applicazione pratica tramite breadboard
- Neso Academy - Ingegneria Hardware - Teoria e concetti
- Socratica - Programmazione Python
- In poche parole - Ingegneria hardware - Teoria e concetti
- Bitwise : Advanced C / C ++ Progettazione di un assemblatore tramite emulazione hardware
- Bo Qian - C ++ Argomenti su strutture dati e algoritmi.
- LineByLine - Programmazione Vulkan
- Joshua Shucker - Programmazione Vulkan
- www.MarekKnows.com - Sviluppo C ++, 3D Math e Game Engine
E questi non tengono conto di alcuni dei vari libri che ho su questi argomenti.
-Nota- Per favore, non votare su questo in quanto questo è solo un messaggio per il lettore della mia esperienza personale ed è privo di qualsiasi tentativo di rispondere o fare riferimento alla domanda originale. Nei prossimi due giorni quando avrò il tempo; Aggiungerò una risposta di follow-up per esprimere la mia opinione sulla domanda del PO fornendo al contempo collegamenti utili come riferimento e insieme di risorse e aggiornerò anche questa risposta per includere alcuni collegamenti qui e modificare questa nota. È tardi e al momento non ho il tempo di correggere e modificare ciò che ho già scritto. Lo farò quando posso ".