Нещодавно я натрапив на це питання / близько року тому або близько того, коли почав подорожувати цією стежкою; Я вважав би це дуже хорошим ресурсом та довідковою сторінкою щодо власних питань.
Частина 1:
-Preface-
Трохи про себе:
У середині та наприкінці 80-х років, коли я ще навчався в початковій школі, я б розібрав непотрібні стереосистеми, відеомагнітофон та інші електронні пристрої, які були з 50-х до 80-х років, і дивився б на плати і завжди хотів знати, як вони робота ... Як вони насправді набували широкомовного сигналу, виробляли звук, відео, робили це та інше тощо ... Я міг розпізнати окремі частини тут і там, наприклад, резистор, конденсатор, діод і транзистор, але не знати, що вони робили або як вони функціонували в такому молодому віці.
Протягом багатьох років я завжди був винятковим у галузі математики, фізики та хімії. Я розумів математику з високою мірою і навіть міг прочитати просту або базову схему з моєї середньої школи та середньої школи, яка настала пізніше, але я ніколи не встигав дізнатися про логічні ворота та те, як вони були побудовані ... Я все-таки зробив вивчити булева алгебра в середній школі з мого класу логіки, ймовірностей та статистики. Усі мої уроки математики та природничих наук були відзнаками. Я не брав обчислення до мого другого семестру в загальноосвітньому коледжі. Я випробував коледж з алгебри і взяв тригонометрію як курси підвищення кваліфікації. Мій найвищий рівень математики в класі - це обчислення II змінної.
Я граю у відеоігри, коли мені було близько 3 чи 4 років. У дитинстві я мав Atari, NES, Sega Genesis та PS1. Коли я дорослішав і в кінці підлітків і на початку 20-х років придбав PS2 і SNES з кращими вибраними назвами. Це також не враховує ігор на ПК, що йде так само, як Doom!
Я завжди був завзятим геймером консолей та ПК, і це не включає ігри в пінбол та аркади.
Перший комп'ютер мені подарували, коли мені було близько 12 років на Різдво на початку 90-х. Дні DOS 6.0 та Win 3.11 або OS / 2. З тих пір я завжди був знайомий із сімейством операційних систем "Windows", і всі системи, які у мене були, були Intel Architecture. Я мав обмежений досвід роботи з Apple чи Mac у школі чи коледжі, але ніколи не мав привілею працювати над системами Linux. У мене є Cygwin, і я спробував свої сили в навчанні башу, але я так звик до Dos або синтаксису командного рядка.
На початку 90-х я отримав би копію або дві програми PC-World і ввів фрагменти коду в QBasic, який я не дуже добре знав, і спробував би зробити так, щоб ці програми працювали. Єдиною, яка була успішною, була програма для перетворення натискань клавіш на домашньому ряду клавіш у різні звуки дзвінка. Я не маю на увазі мелодії дзвінка на мобільному телефоні, я маю на увазі безперервну частоту, доки ви натиснули клавішу.
Мені завжди було захоплення не лише хотіти знати, як працюють електронні пристрої в мікросхемі на цифровому та логічному рівні, щоб навчитися програмувати комп’ютер, але я завжди мав бажання хочу зробити власне відео ігри. Ще на початку 90-х я хотів зробити ігри Frogger та Tetris ...
Це стало моєю провідною мотивацією та бажанням вирішити один із найскладніших типів програмування або розробки програмного забезпечення в галузі комп'ютерних наук, а це - 3D Game Engine Engine. Існують інші сфери в галузі комп'ютерних наук, які є настільки ж жорсткими, однак будь-які складні ігрові двигуни зазвичай або зазвичай включають майже всі з них, оскільки окремі компоненти або допоміжні двигуни вимагають своїх методів та властивостей.
У моїх середніх школах я мав певний досвід програмування, але це було обмежено жахливим Visual Basic. Я почав збирати і вивчати C / C ++ приблизно в 2002 - 2003 роках, лише через кілька років після того, як я закінчив середню школу в 1999 році. Навіть до цього часу я не маю досвіду класу коледжу в галузі комп’ютерних наук або комп'ютерної інженерії, але через відданість і рішучість, я навчився майже будь-якої концепції, що стосується комп'ютерів, апаратних засобів, програмування, алгоритмів тощо, і я все ще продовжую вчитися стільки, скільки можу ...
У перші дні навчання C / C ++ у мене був доступ до Інтернету, але Інтернет тоді був на ранній стадії, веб-сайти, як Amazon, Youtube, Facebook тощо, ще не існували, це були ще дні 56k набирайте модеми, які підтримують вашу телефонну лінію, якщо у вас не було другої спеціальної лінії. Минуло б кілька хвилин, щоб зображення вийшло на екран, незважаючи на постійне відтворення відео.
Тож коли мова зайшла про дослідження та вивчення програми програмування на C ++, ресурси були обмежені, а більшість - у текстовому форматі. Намагаючись вирішити проекти з ранніх навчальних днів в Інтернеті, багато з цих проектів були не повністю завершені, письменники були або професіоналами, або студентами коледжу, і вони зробили багато припущень, що читач уже знайомий з багатьма необхідними поняттями, такими як компіляція. , з'єднання та налагодження та інтеграція бібліотек.
Для тих, хто нічого не знає про ці теми, вони втрачають шкоду, оскільки не знають, що пішло не так, як і як їх виправити, і як змусити його працювати належним чином. У ті дні мені знадобилося багато годин спроб і помилок з дуже обмеженими ресурсами. Попросити про допомогу, таку, яку ми можемо зараз на цьому веб-сайті, або шукати детальні пояснення, які ви можете знайти на cppreference, не було доступно! Якщо ви особисто нікого не знали, то не так багато ви могли б звернутися за допомогою!
З часом я вдосконалював деякі свої знання тут і там, і врешті-решт Інтернет покращився до DSL, і тепер високошвидкісний Інтернет, веб-сайти стали більш інтерактивними, відео почали з’являтися, якість відео з часом покращувалася, сайти такі як Youtube почав з’являтися, і все стало трохи простіше з боку досліджень. Все більше та більше навчальних посібників стали доступними, деякі були хорошими та корисними там, де інші навчали поганій практиці ...
Я також витратив багато часу на пошук та придбання необхідних інструментів для розвитку. Мені довелося вивчити синтаксис мови, процес компіляції та компіляції, зв’язування, побудову та налагодження. Тоді мені довелося дізнатися про різні наявні бібліотеки та API, які існують там, і як налаштувати мої проекти чи рішення для зв'язку всіх цих залежностей.
Протягом багатьох років я спостерігав, як мова С ++ росте, розвивається і адаптується з часом. На початку він залишався майже таким же довгі роки, але за останні 10 років він змінився кардинально за цей короткий проміжок часу з моменту створення.
Я згадую все це, тому що C ++ - це одна з найскладніших мов, яку можна повністю опанувати завдяки своїй універсальності, потужності, багатому набору функцій та можливості дозволяти стріляти собі в ногу! І навіть з усіма його застереженнями, це одна з найпотужніших та бажаних мов, яка використовується у провідній провідної галузі як стандарт для цього типу розробок, тому що, коли це зроблено правильно, це швидко, стисло, надійно і використовує найменший принт ніг.
З тих пір я багато років навчався на C / C ++ з наміром і зосереджуватися на вивченні 3D графічного програмування та дизайну ігрового двигуна. Я вклав від 100 до 1000 годин пошуку, дослідження та багато іншого на читання, вивчення та застосування цих знань у розробці корисних робочих продуктів та додатків. Я завжди мав бажання і бажання хотіти дізнатися більше, щоб удосконалити свої набори навичок та майстерність.
Це був перший етап, тоді я почав читати та працювати з початково DirectX 9.c, що я робив у C / C ++ і навіть C #. Потім я перейшов на DirectX 10 та Legacy OpenGL 1.0. З них прийшли DirectX 11 і OpenGL 3.x - 4.x, і тепер я навіть спробував свої сили у Вулкані.
Я створив успішні ігрові двигуни, що працюють через різні підручники в Інтернеті як у текстовому, так і у відеоформаті. Я вже заявив, що в мене є сильний досвід математики, але це було обмежено обчисленням I & II. Мені довелося навчати себе «Векторний обчислення», про яке я мав деякі знання з мого класу фізики в коледжі, але щодо лінійної алгебри з аффінними перетвореннями та аналітичною геометрією я повинен був вивчити їх самостійно, коли певні рівняння, функції, методи, алгоритми та потрібні були концепції. Тоді мені довелося навчитися переводити їх у ефективний, читабельний, надійний, багаторазовий код, який був загальним та без помилок, вкладаючи сотні та тисячі годин налагодження.
Це дивовижне подорож вивчало теми та алгоритми, які включають управління пам’яттю, підрахунок посилань, інстанціювання, рекурсію та багато іншого, які використовуються в багатьох, якщо не всіх компонентах ігрового двигуна, де їх величезна кількість. Я міг би перерахувати їх усіх тут, але цього було б достатньо інформації, щоб заповнити 3 або 4 місця для відповідей, які варто написати. Однак я включатиму перелік загальних тем, а не їх підтемати.
Ось перелік тем або предметів, що складається з повністю функціонального ігрового двигуна, який включає всі різні методи відтворення, налаштування трубопроводів візуалізації та шейдери, техніка затінення та освітлення за допомогою шейдерів, перед та після обробки, буфери кадрів, зворотні буфери завантаження зображень, завантаження та розбір аудіо та моделей, створення примітивних фігур із властивостями кольорового матеріалу, текстури та нормальних координат із ручним картографуванням текстур, перетворенням об'єктів, типів камер, ієрархіями графічних сцен, класами менеджерів текстур, аудіо, шрифтів та шейдерів та управління пам'яттю, система ведення журналів з обробкою винятків, багатопотокові та паралельні методи програмування, мережа, фізичний двигун, виявлення зіткнень, генератор частинок, анімація, ігровий інтелект, генерація місцевості, небесні коробки та небесні куполи, подача води,листя та інше ..., графічний інтерфейс із текстурованим шрифтом для візуалізації тексту, накладки HUD, товарні запаси, генерація карт та макросів, державна система та державні машини, і нарешті написання аналізатора для створення власної мови сценаріїв для автоматизації більшості цих об'єктів, щоб мати можливість змінювати значення даних всередині двигуна без необхідності перекомпілювати лише завантаженням у файли даних для заповнення об'єктів даних та структур у відповідних контейнерах при запуску програми.і, нарешті, написання аналізатора для створення власної мови сценаріїв для автоматизації більшості цих об'єктів, щоб мати можливість змінювати значення даних всередині двигуна, не потребуючи перекомпіляції, просто завантажуючи у файли даних, щоб заповнити об'єкти даних та структури у відповідних контейнерах при запуску програми.і, нарешті, написання аналізатора для створення власної мови сценаріїв для автоматизації більшості цих об'єктів, щоб мати можливість змінювати значення даних всередині двигуна, не потребуючи перекомпіляції, просто завантажуючи у файли даних, щоб заповнити об'єкти даних та структури у відповідних контейнерах при запуску програми.
Протягом багатьох років і назад я був заінтригований, щоб хотіти вивчити мову складання, з них я хотів дізнатися про компілятори, асемблери та прості операційні системи, я маю на увазі їх внутрішню роботу, те, як вони будуються та проектуються.
Час тривав, і тоді я збоку трохи відступив і почав вникати в емуляцію апаратури. Я спеціально зосередився на NES, але хотів навчитися апаратній емуляції процесора взагалі. Це підштовхнуло мене до вивчення набору інструкцій, в якому я вже знав цю концепцію, і що це таке, оскільки я певною мірою був знайомий з сімейством x86 Intel, але тепер мені довелося вивчити набір інструкцій 6502.
Проте, занурившись у це, я закінчив робити більше досліджень і почав дізнаватися про архітектуру набору інструкцій з інженерної точки зору. Це змусило мене дізнатися про те, як CPU побудований з логічних воріт і як логічні ворота будуються з транзисторів разом з іншими різними електричними компонентами. Тож я довідався про це з двох поглядів зверху вниз і знизу вгору. Обидва методи були дуже ефективними, і я думаю, що навчання з обох допомагає побудувати той міст або прогалину, де програмне забезпечення обробляє обладнання.
Після цього мені довелося оновити свою булеву алгебру, і я закінчив вивчати K-карти, таблиці імпликацій, державні машини і Мелі, і Мура та різні інші речі, які пов’язують бінарну логіку та арифметику з фізичними логічними воротами та інтегральними схемами. І це приводить мене до обуреного минулого, де я почав працювати з Logisim, і почав вивчати HDL, VHDL, Verilog тощо ...
Я все це вчився у вільний час, коли міг протягом останніх 15 - 18 років.
Ось декілька сайтів та посилань, які керували мене протягом багатьох років. Багато з них є останніми, оскільки багато сайтів, про які я спочатку дізнався, або більше не існують, я втратив свої посилання і не пам'ятаю, або пошукові системи підштовхнули їх у далеку списку пошукових списків ...
Мови - C ++
Підручники з 3D графікою та веб-сайти з ресурсами
Серії та канали Youtube стосуються вищезазначених тем, а також обладнання, комп’ютер та електротехніку. Занадто багато їх для переліку, тому я перерахую декілька з них, які я вважаю найбільш корисними та винахідливими. Я не надаватиму посилання, але ви можете шукати на YouTube на цих каналах.
- 3Blue1Brown - Розширена математика
- Bisqwit - Розширене програмування на C / C ++ (прикладні проекти) - апаратний емулятор NES
- Джейсон Тернер - сучасні сучасні методи програмування на C ++
- javidx9 - розширене програмування на C / C ++ (прикладні проекти) - апаратний емулятор NES / деяка збірка
- MIT OpenCourse - Курси коледжу з математики та інформатики
- Онлайн курси Bilkent - Курси коледжів з інформатики та комп'ютерної техніки (MIPS Design MIPS)
- Теми та програми програмування на програмі Cherno - Advanced C / C ++ - Розробка ігрового двигуна
- Ben Eater - Обладнання інженерії - Практичне застосування через Хлібні дошки
- Академія Несо - Обладнання інженерії - теорія та поняття
- Socratica - програмування Python
- Простіше кажучи - Обладнання інженерії - теорія та поняття
- Побітове розширення C / C ++ Проектування асемблера за допомогою апаратної емуляції
- Bo Qian - C ++ Теми в структурах даних та алгоритмах.
- Програмування LineByLine - Вулкан
- Джошуа Шукер - програмування Вулкана
- www.MarekKnows.com - C ++, розробка 3D математики та ігрових механізмів
І вони не враховують деяких книг, які я маю на ці теми.
-Примітка. Будь ласка, не голосуйте з цього приводу, оскільки це лише повідомлення читачеві з мого власного досвіду і не має будь-яких спроб відповісти чи посилатися на оригінальне запитання. У наступні пару днів, коли я маю час; Я додам подальшу відповідь, щоб висловити свої міркування щодо питання ОП, надаючи корисні посилання в якості посилання та набору ресурсів, і я оновлю цю відповідь, щоб також включити тут деякі посилання та змінити цю нотатку. Уже пізно, і в даний час у мене немає часу на вичитування та редагування того, що я вже написав. Я зроблю це, коли зможу ».