Ostatnio natknąłem się na to pytanie i mniej więcej rok temu, kiedy zacząłem podróżować tą ścieżką; Uważam, że jest to bardzo dobra strona z materiałami źródłowymi i referencyjnymi w odniesieniu do moich własnych pytań pokrewnych.
Część 1:
Wstęp
Trochę o sobie:
W połowie lat 80., kiedy jeszcze byłem w szkole podstawowej, rozbierałem śmieciowe zestawy stereo, magnetowid i inne urządzenia elektroniczne, które były od lat 50. do 80. i patrzyły na płytki drukowane i zawsze chciałem wiedzieć, jak to zrobiły praca ... W jaki sposób faktycznie uzyskali sygnał transmisji, wyprodukowali audio, wideo, zrobili to i tamto itd. Mogłem rozpoznać poszczególne części tu i tam, takie jak rezystor, kondensator, dioda i tranzystor, ale nie wiedzieć, co zrobili lub jak funkcjonowali w tak młodym wieku.
Przez lata zawsze byłem wyjątkowy w matematyce, fizyce i chemii. Zrozumiałem matematykę w dużym stopniu i potrafiłem nawet czytać proste lub podstawowe układy z moich gimnazjów i liceów, które przyszły później, ale nigdy nie udało mi się dowiedzieć o bramkach logicznych i o tym, jak zostały zbudowane ... uczyć się algebry Boolean w liceum z mojej klasy logiki, prawdopodobieństwa i statystyki z wyróżnieniem. Wszystkie moje zajęcia z matematyki i przedmiotów ścisłych były zajęciami z wyróżnieniem. Nie wziąłem rachunku do drugiego semestru na uniwersytecie. Testowałem z College Algebra i wziąłem Trygonometrię jako kurs odświeżający. Mój najwyższy poziom matematyki w klasie to Rachunek II jednej zmiennej.
Gram w gry wideo od około 3 lub 4 lat. Jako dziecko miałem Atari, NES, Sega Genesis i PS1. W miarę jak dorastałem i do moich późnych nastolatków i wczesnych lat 20-tych, nabyłem PS2 i SNES z preferowanymi wybranymi tytułami. Nie uwzględnia to również gier komputerowych, które sięgają nawet Dooma!
Zawsze byłem zagorzałym graczem konsolowym i PC, a to nie obejmuje gier typu pinball i zręcznościowych.
Pierwszy komputer dostałem, gdy miałem około 12 lat na Boże Narodzenie na początku lat 90-tych. Dni DOS 6.0 i Windows 3.11 lub OS / 2. Od tego czasu zawsze znałem rodzinę systemów operacyjnych „Windows”, a wszystkie systemy, które miałem, to architektura Intel. Miałem ograniczone doświadczenie z Apple lub Mac ze szkoły lub college'u, ale nigdy nie miałem przywileju pracy na systemach Linux. Mam Cygwina i próbowałem swoich sił w nauce bash, ale jestem tak przyzwyczajony do Dos lub składni Command Prompt.
Na początku lat 90-tych dostałem kopię PC-World i wpisałem fragmenty kodu w QBasic, których nie znałem zbyt dobrze i starałem się, aby te programy działały. Jedynym, który odniósł sukces, był program zmieniający naciśnięcia klawiszy w głównym rzędzie klawiszy na różne dźwięki dzwonka. Nie mam na myśli dzwonków na telefonie komórkowym, mam na myśli ciągłą częstotliwość tak długo, jak długo przytrzymujesz klawisz.
Zawsze moją pasją było nie tylko chcieć wiedzieć, jak działają urządzenia elektroniczne w cyrkulacji na poziomie cyfrowym i logicznym, aby nauczyć się programować komputer, ale zawsze chciałem zrobić własne wideo Gry. Już na początku lat 90. chciałem tworzyć gry Frogger i Tetris ...
Stało się to moją wiodącą motywacją i chęcią zmierzenia się z jednym z najtrudniejszych rodzajów programowania lub rozwoju oprogramowania w dziedzinie informatyki, czyli 3D Game Engine Design. Istnieją inne dziedziny informatyki, które są równie trudne, jednak każdy wyrafinowany silnik gry zazwyczaj lub zwykle obejmuje prawie wszystkie z nich, ponieważ poszczególne komponenty lub silniki podrzędne wymagają ich technik i / lub właściwości.
Miałem trochę doświadczenia w programowaniu od czasów liceum, ale było to ograniczone do okropnego Visual Basic. Zacząłem podnosić i uczyć się C / C ++ w latach 2002 - 2003, dopiero kilka lat po ukończeniu liceum w 1999 roku. Do dziś nie mam żadnego doświadczenia na studiach informatycznych ani inżynierii komputerowej, ale poprzez poświęcenie i determinacja, nauczyłem się prawie każdej koncepcji związanej z komputerami, sprzętem, programowaniem, algorytmami itp. i nadal uczę się tak dużo, jak tylko mogę ...
W pierwszych dniach nauki C / C ++ miałem dostęp do Internetu, ale internet był w początkowej fazie, strony takie jak Amazon, Youtube, Facebook itp. Jeszcze nie istniały, wciąż były dni 56 tys. modemów telefonicznych, które podnoszą linię telefoniczną, jeśli nie masz drugiej linii dedykowanej. Renderowanie obrazu na ekranie zajęłoby kilka minut, nie mówiąc już o ciągłym odtwarzaniu wideo.
Więc jeśli chodzi o badania i naukę programowania w C ++, zasoby były ograniczone i większość z nich miała format tekstowy. Próbując poradzić sobie z projektami od wczesnych dni samouczków internetowych, wiele z tych projektów nie było w pełni ukończonych, pisarze byli profesjonalistami lub studentami i przyjęli wiele założeń, że czytelnik jest już zaznajomiony z wieloma potrzebnymi pojęciami, takimi jak kompilacja , łączenie i debugowanie oraz integracja biblioteki.
Dla kogoś, kto nie wie nic o tych tematach, jest zagubiony, ponieważ nie wie, co poszło źle, ani jak to naprawić i jak sprawić, aby działał poprawnie. W tych dniach zajęło mi wiele godzin prób i błędów przy bardzo ograniczonych zasobach. Prośba o pomoc, taką jak możemy teraz w tej witrynie lub szukanie szczegółowych wyjaśnień, które można znaleźć na stronie preferencji, nie była dostępna! Jeśli osobiście nikogo nie znałeś, nie było tylu, do których mógłbyś zwrócić się o pomoc!
Z biegiem czasu poprawiłem swoją wiedzę tu i tam, a ostatecznie Internet poprawił się do DSL, a teraz Internet High Speed, strony internetowe stały się bardziej interaktywne, filmy zaczęły się wyświetlać, jakość filmów poprawiła się z czasem, strony takie gdy Youtube zaczął się pojawiać, a sprawy stały się trochę łatwiejsze po stronie badawczej. Coraz więcej samouczków stało się łatwo dostępnych, niektóre były dobre i przydatne tam, gdzie inni uczyli złych praktyk ...
Spędziłem też dużo czasu na poszukiwaniu i nabywaniu niezbędnych narzędzi do rozwoju. Musiałem nauczyć się składni języka, kompilatora i procesu kompilacji, łączenia, budowania i debugowania. Następnie musiałem dowiedzieć się o różnych dostępnych bibliotekach i interfejsach API oraz o tym, jak skonfigurować moje projekty lub rozwiązania, aby połączyć wszystkie te zależności.
Przez lata obserwowałem rozwój, ewolucję i adaptację języka C ++ w miarę upływu czasu. Na początku pozostawał prawie taki sam przez wiele lat, ale w ciągu ostatnich 10 lat zmienił się dramatycznie w tym krótkim okresie od jego powstania.
Wspominam o tym wszystkim, ponieważ C ++ jest jednym z najtrudniejszych języków do opanowania ze względu na jego wszechstronność, moc, bogaty zestaw funkcji i możliwość strzelania sobie w stopę! I nawet ze wszystkimi zastrzeżeniami, jest to jeden z najpotężniejszych i preferowanych języków, który jest używany w wiodącej branży jako standard dla tego rodzaju rozwoju, ponieważ gdy jest wykonany poprawnie, jest szybki, zwięzły, niezawodny i wykorzystuje najmniejszy odcisk stopy.
Od tego czasu jestem samoukiem w C / C ++ od wielu lat z zamiarem skupienia się na programowaniu grafiki 3D i projektowaniu silnika gry. Włożyłem od 100 do 1000 godzin poszukiwań, badań i wiele więcej w czytanie, uczenie się i stosowanie tej wiedzy do projektowania użytecznych działających produktów i aplikacji. Zawsze miałem ochotę i chęć dowiedzieć się więcej, aby poprawić swoje umiejętności i umiejętności rzemieślnicze.
To był pierwszy etap, potem zacząłem czytać i pracować początkowo z DirectX 9.c, co zrobiłem w C / C ++, a nawet w C #. Potem przeszedłem na DirectX 10 i Legacy OpenGL 1.0. Z ich pochodził DirectX 11 i OpenGL 3.x - 4.x, a teraz nawet spróbowałem swoich sił w Vulkan.
Zbudowałem odnoszące sukcesy silniki gier, wykorzystując różne samouczki online, zarówno w formacie tekstowym, jak i wideo. Powiedziałem już, że mam silne doświadczenie matematyczne, ale było to ograniczone do rachunku I i II. Musiałem nauczyć się rachunku wektorowego, o którym miałem wiedzę z mojej klasy fizyki opartej na rachunku, ale jeśli chodzi o algebrę liniową z transformacjami afinicznymi i geometrią analityczną, musiałem się uczyć samodzielnie, gdy pewne równania, funkcje, metody, algorytmy i potrzebne były koncepcje. Potem musiałem nauczyć się tłumaczyć je na wydajny, czytelny, niezawodny, wielokrotnego użytku kod, który był ogólny i wolny od błędów, jak to możliwe, wprowadzając setki do tysięcy godzin debugowania.
To była cudowna podróż, która nauczyła się tematów i algorytmów obejmujących zarządzanie pamięcią, liczenie referencji, tworzenie instancji, rekurencję i wiele innych, które są używane w wielu, jeśli nie we wszystkich elementach silnika gry, gdzie są one ogromne. Mógłbym wymienić je wszystkie tutaj, ale byłoby to wystarczające informacje, aby wypełnić 3 lub 4 pola odpowiedzi warte napisania. Dołączę jednak listę ogólnych tematów, a nie ich podtematy.
Oto tematy lub lista tematów składająca się z w pełni funkcjonalnego silnika gry, który obejmuje wszystkie różne techniki renderowania, konfigurowanie potoków renderowania i cieniowania, techniki cieniowania i oświetlenia za pomocą shaderów, przetwarzania wstępnego i końcowego, buforów ramek, buforów tylnych , ładowanie obrazu, ładowanie i analizowanie modelu i dźwięku, tworzenie prymitywnych kształtów z właściwościami koloru, tekstury i normalnych współrzędnych z ręcznym mapowaniem tekstur, transformacjami obiektów, typami kamer, hierarchiami wykresów scen, klasami menedżerów dla tekstur, audio, czcionek i shaderów oraz zarządzanie pamięcią, system rejestrowania z obsługą wyjątków, wielowątkowe i równoległe techniki programowania, tworzenie sieci, silnik fizyki, wykrywanie kolizji, generator cząstek, animacja, sztuczna inteligencja, generowanie terenu, skrzynki na niebo i kopuły nieba, renderowanie wody,listowie i więcej ..., GUI z teksturowaną czcionką do renderowania tekstu, nakładki HUD, inwentaryzacje, generowanie map i makr, system stanów i automaty stanów, a na koniec napisanie parsera do stworzenia własnego języka skryptowego do automatyzacji wielu z tych obiektów możliwość zmiany wartości danych w silniku bez konieczności ponownej kompilacji poprzez załadowanie plików danych w celu zapełnienia obiektów danych i struktur w odpowiednich kontenerach podczas uruchamiania aplikacji.i na koniec napisanie parsera w celu stworzenia własnego języka skryptowego w celu automatyzacji wielu z tych obiektów, aby mieć możliwość zmiany wartości danych w silniku bez konieczności ponownej kompilacji poprzez ładowanie plików danych w celu zapełnienia obiektów danych i struktur w ich odpowiednich kontenerach przy uruchomieniu aplikacji.i na koniec napisanie parsera w celu stworzenia własnego języka skryptowego w celu automatyzacji wielu z tych obiektów, aby mieć możliwość zmiany wartości danych w silniku bez konieczności ponownej kompilacji poprzez ładowanie plików danych w celu zapełnienia obiektów danych i struktur w ich odpowiednich kontenerach przy uruchomieniu aplikacji.
Przez te wszystkie lata intrygowało mnie to, że chcę uczyć się języka asemblera, od ich chciałem dowiedzieć się o kompilatorach, asemblerach i prostych systemach operacyjnych, mam na myśli ich wewnętrzne funkcjonowanie, sposób ich budowy i projektowania.
Czas mijał, a potem zrobiłem krok i zacząłem się uczyć emulacji sprzętu. Skoncentrowałem się szczególnie na NES, ale ogólnie chciałem nauczyć się emulacji sprzętowej procesorów. Doprowadziło mnie to do zapoznania się z zestawem instrukcji, w którym znałem już tę koncepcję i czym ona była, ponieważ do pewnego stopnia znałem rodzinę x86 Intela do pewnego stopnia, ale teraz musiałem nauczyć się zestawu instrukcji 6502.
Jednak nurkując w to, skończyłem robić więcej badań i zacząłem uczyć się o architekturze zestawu instrukcji z perspektywy inżynierii. To pozwoliło mi dowiedzieć się, jak procesor jest zbudowany z bramek logicznych i jak bramki logiczne są zbudowane z tranzystorów wraz z innymi różnymi komponentami elektrycznymi. Skończyło się na tym, że dowiedziałem się o tym z dwóch perspektyw: od góry do dołu i od dołu do góry. Obie metody były bardzo skuteczne i myślę, że uczenie się od obu pomaga zbudować ten most lub lukę, w której oprogramowanie przebija sprzęt.
Odtąd musiałem odświeżyć moją algebrę boolowską i ostatecznie skończyłem uczyć się o K-Mapach, Tabelach Implikacji, Maszynach Stanowych zarówno Mealy, jak i Moore'a oraz różnych innych rzeczach, które wiążą Logikę Binarną i Arytmetykę z Bramkami Logicznymi Fizycznymi i Układami Scalonymi. I to prowadzi mnie do niechęci do przeszłości, w której zacząłem pracować z Logisimem i zacząłem uczyć się HDL, VHDL, Verilog itp.
Nauczyłem się tego wszystkiego w wolnym czasie, kiedy mogłem przez ostatnie 15 - 18 lat.
Oto niektóre strony i linki, które prowadziły mnie przez lata. Wiele z nich jest aktualnych, ponieważ wiele witryn, z których pierwotnie się nauczyłem, już nie istnieje, straciłem ich linki i nie pamiętam, lub wyszukiwarki pchnęły je z tyłu ich list wyszukiwania ...
Języki - C ++
Samouczki grafiki 3D i strony z zasobami
Serie i kanały Youtube obejmują powyższe tematy, a także sprzęt komputerowy i inżynierię elektryczną. Jest ich zbyt wiele, by wymienić, więc wymienię kilka z nich, które uważam za najbardziej przydatne i zaradne. Nie podam linków, ale możesz wyszukać te kanały na youtube.
- 3Blue1Brown - Advanced Mathematics
- Bisqwit - Zaawansowane programowanie w C / C ++ (projekty aplikacji) - Emulator sprzętu NES
- Jason Turner - Zaawansowane nowoczesne techniki programowania w C ++
- javidx9 - Zaawansowane programowanie w C / C ++ (projekty aplikacji) - Emulator sprzętu NES / Some Assembly
- MIT OpenCourse - College College in Mathematics and Computer Science
- Bilkent Online Courses - Kursy dla studentów informatyki i inżynierii komputerowej (procesory MIPS)
- The Cherno - Zaawansowane tematy programowania C / C ++ i aplikacje - Rozwój silnika gry
- Ben Eater - Inżynieria sprzętu - Praktyczne zastosowanie za pomocą paneli
- Neso Academy - Inżynieria sprzętu - Teoria i koncepcje
- Socratica - programowanie w języku Python
- Mówiąc najprościej - Inżynieria sprzętu - Teoria i koncepcje
- Bitwise - Advanced C / C ++ Projektowanie asemblera za pomocą emulacji sprzętowej
- Bo Qian - C ++ Tematy w strukturach danych i algorytmach.
- LineByLine - Programowanie Vulkan
- Joshua Shucker - Programowanie wulkaniczne
- www.MarekKnows.com - C ++, 3D Math and Engine Engine Development
I nie biorą one pod uwagę niektórych książek, które mam na te tematy.
-Uwaga- Proszę nie głosować w tej sprawie, ponieważ jest to tylko wiadomość dla czytelnika z moim własnym doświadczeniem i jest pozbawiona jakichkolwiek prób odpowiedzi lub odniesienia do pierwotnego pytania. W ciągu następnych kilku dni, kiedy będę miał czas; Dodam odpowiedź uzupełniającą, aby wyrazić swoje przemyślenia na temat pytania PO, podając przydatne linki jako odniesienie i zestaw zasobów, a także zaktualizuję tę odpowiedź, aby uwzględnić tutaj linki i zmodyfikować tę notatkę. Jest późno i obecnie nie mam czasu na poprawianie i edytowanie tego, co już napisałem. Zrobię to, kiedy będę mógł ”.