Я недавно сталкивался с этим Q / A и приблизительно год назад, когда я начал путешествовать по этому пути; Я нашел бы это очень хорошим ресурсом и справочной страницей в отношении связанных с этим моих собственных вопросов.
Часть 1:
-Preface-
Немного обо мне:
В середине-конце 80-х, когда я еще учился в начальной школе, я разбирал ненужные стереосистемы, видеомагнитофоны и другие электронные устройства, которые были с 50-х по 80-е годы, смотрел на печатные платы и всегда хотел знать, как они работа ... Как они на самом деле получали сигнал вещания, производили аудио, видео, делали то и это и т. д ... Я мог распознавать отдельные части здесь и там, такие как резистор, конденсатор, диод и транзистор, но не сделал знать, что они делали или как они функционировали в таком молодом возрасте.
На протяжении многих лет я всегда был исключительным в математике, физике и химии. Я в высшей степени понимал математику и даже мог прочитать некоторые простые или базовые схемы из моих школьных и школьных дней, которые пришли позже, но я так и не смог узнать о логических элементах и их построении ... Однако я так и сделал изучать булеву алгебру в старших классах из моего курса «Логика, вероятность и статистика». Все мои уроки математики и естественных наук были классами с отличием. Я не принимал Calculus до второго семестра в местном колледже. Я сдал экзамен по алгебре в колледже и взял курс тригонометрии на курсы повышения квалификации. Мой самый высокий уровень математики в классе - это исчисление II одной переменной.
Я играю в видеоигры с 3 или 4 лет. В детстве у меня были Atari, NES, Sega Genesis и PS1. Когда я стал старше, мне было чуть больше 20 лет, и я приобрел PS2 и SNES с избранными играми. Это также не относится к играм на ПК, которые восходят к Doom!
Я всегда был заядлым игроком в консоль и ПК, и это не относится к пинболу и аркадным играм.
Мой первый компьютер мне дали, когда мне было около 12 лет на Рождество в начале 90-х. Дни DOS 6.0 и либо Win 3.11, либо OS / 2. С тех пор я всегда был знаком с семейством операционных систем Windows, и все системы, которые у меня были, были архитектуры Intel. Я имел ограниченный опыт работы с Apple или Mac из школы или колледжа, но у меня никогда не было привилегии работать на системах Linux. У меня есть Cygwin, и я попробовал свои силы в изучении bash, но я так привык к Dos или синтаксису командной строки.
В начале 90-х я получал одну или две копии PC-World и вводил фрагменты кода в QBasic, который я не очень хорошо знал, и попытался бы заставить эти программы работать. Единственной успешной была программа, которая превращала нажатия клавиш в домашнем ряду клавиш в различные звуки мелодий звонка. Я не имею в виду мелодии звонка на сотовом телефоне, я имею в виду непрерывную частоту, пока вы держите клавишу нажатой.
Моя страсть всегда была не только в том, чтобы хотеть узнать, как электронные устройства работают в цепи на цифровом и логическом уровне, чтобы научиться программировать компьютер, но у меня всегда было желание сделать свое собственное видео. игры. Еще в начале 90-х я хотел сделать игры Frogger и Tetris ...
Это стало моей главной мотивацией и желанием заняться одним из самых сложных видов программирования или разработки программного обеспечения в области компьютерных наук - 3D Game Engine Design. Есть и другие области в области компьютерных наук, которые столь же сложны, однако любые сложные игровые движки, как правило, или обычно включают почти все из них, так как отдельные компоненты или подсистемы требуют своих методов и / или свойств.
У меня был некоторый опыт программирования в школьные годы, но это было ограничено ужасным Visual Basic. Я начал изучать C / C ++ примерно в 2002–2003 годах, и только через несколько лет после того, как окончил среднюю школу в 1999 году. Даже по сей день у меня нет опыта работы в колледже по компьютерным наукам или компьютерным технологиям, но уже через самоотверженность и решительность, я узнал почти все концепции, когда речь идет о компьютерах, оборудовании, программировании, алгоритмах и т. д., и я все еще продолжаю изучать столько, сколько могу ...
В первые дни изучения C / C ++ у меня был доступ к Интернету, но тогда Интернет находился на ранней стадии, таких сайтов, как Amazon, Youtube, Facebook и т. Д., Еще не было, это были времена 56k. наберите модемы, которые убирают вашу телефонную линию, если у вас не было второй выделенной линии. Потребуется несколько минут, чтобы изображение отобразилось на экране, не говоря уже о непрерывном воспроизведении видео.
Поэтому, когда дело дошло до исследований и обучения программированию на C ++, ресурсы были ограничены, и большинство из них были в текстовом формате. Пытаясь заняться проектами с первых дней обучения в Интернете, многие из этих проектов не были полностью завершены, писатели были либо профессионалами, либо студентами колледжа, и они делали много предположений о том, что читатель уже знаком со многими необходимыми понятиями, такими как компиляция , связывание и отладка и интеграция библиотеки.
Для тех, кто ничего не знает об этих темах, они в замешательстве, потому что они не знают, что пошло не так, ни как исправить это, и как заставить это работать должным образом. В те дни у меня было очень много проб и ошибок с очень ограниченными ресурсами. Обращаться за помощью, такой как мы можем теперь с этим сайтом или искать подробные объяснения, которые вы можете найти на cppreference, не было доступно! Если бы вы лично никого не знали, вы бы не обратились за помощью!
С течением времени я кое-где улучшил свои знания, и в конечном итоге интернет перешел на DSL, и теперь высокоскоростной интернет, веб-сайты стали более интерактивными, видео начали появляться, качество видео со временем улучшилось, сайты такие когда начал появляться Youtube, и с исследовательской стороны стало немного легче. Все больше и больше учебных пособий стали доступны, некоторые были хорошими и полезными, в то время как другие учили плохой практике ...
Я также потратил много времени на поиск и приобретение необходимых инструментов для разработки. Мне пришлось изучить синтаксис языка, процесс компиляции и компиляции, компоновку, сборку и отладку. Затем мне пришлось узнать о различных доступных библиотеках и API-интерфейсах, которые существуют, и о том, как настроить мои проекты или решения для связи всех этих зависимостей.
На протяжении многих лет я наблюдал, как язык C ++ рос, развивался и адаптировался с течением времени. В начале он оставался почти таким же на протяжении многих лет, но за последние 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, и теперь я даже попробовал свои силы в Vulkan.
Я создал успешные игровые движки, работающие с различными онлайн-уроками в текстовом и видеоформатах. Я уже говорил, что у меня хороший опыт в математике, но он ограничивался исчислением I и II. Я должен был научить себя Векторному исчислению, о котором у меня были некоторые знания из моего курса физики на основе исчисления в колледже, но что касается линейной алгебры с аффинными преобразованиями и аналитической геометрией, мне пришлось учить их самостоятельно, когда некоторые уравнения, функции, методы, алгоритмы Понятия были необходимы. Затем мне пришлось научиться переводить их в эффективный, читаемый, надежный, многократно используемый код, который был бы по возможности универсальным и не содержал ошибок.
Это было изумительное путешествие, изучающее темы и алгоритмы, которые включают управление памятью, подсчет ссылок, создание экземпляров, рекурсию и многое другое, которые используются во многих, если не во всех компонентах игрового движка, где они обширны. Я мог бы перечислить их все здесь, но этого было бы достаточно, чтобы заполнить 3 или 4 места для ответов. Тем не менее, я включу список общих тем, а не их подтемы.
Здесь представлены темы или список тем, которые состоят из полностью функционального игрового движка, который включает в себя все различные методы рендеринга, настройку конвейеров рендеринга и шейдеров, методы шейдинга и освещения с помощью шейдеров, предварительной и последующей обработки, буферов кадров, обратных буферов. загрузка изображений, загрузка и анализ аудио и моделей, создание примитивных фигур со свойствами цветного материала, текстуры и нормальных координат с ручным отображением текстур, трансформациями объектов, типами камер, иерархиями графов сцен, классами менеджеров для текстур, аудио, шрифтов и шейдеров и управление памятью, система регистрации с обработкой исключений, методы многопоточного и параллельного программирования, сетевое взаимодействие, физический движок, обнаружение столкновений, генератор частиц, анимация, игровой ИИ, генерация ландшафта, небесные рамки и небесные купола, рендеринг воды,листва и многое другое ..., GUI с текстурированным шрифтом для рендеринга текста, наложения HUD, инвентаризации, генерации карт и макросов, системы состояний и конечных автоматов и, наконец, написание синтаксического анализатора для создания собственного языка сценариев для автоматизации большей части этих объектов. возможность изменять значения данных в движке без необходимости перекомпиляции, просто загружая файлы данных, чтобы заполнить объекты данных и структуры в их соответствующих контейнерах при запуске приложения.и, наконец, написание синтаксического анализатора для создания собственного языка сценариев для автоматизации большей части этих объектов, чтобы иметь возможность изменять значения данных в движке без необходимости перекомпиляции, просто загружая файлы данных для заполнения объектов данных и структур в их соответствующих контейнерах при запуске приложения.и, наконец, написание синтаксического анализатора для создания собственного языка сценариев для автоматизации большей части этих объектов, чтобы иметь возможность изменять значения данных в движке без необходимости перекомпиляции, просто загружая файлы данных для заполнения объектов данных и структур в их соответствующих контейнерах при запуске приложения.
В течение многих лет я был заинтригован тем, что хочу изучать ассемблер, из их я хотел узнать о компиляторах, ассемблерах и простых операционных системах, я имею в виду их внутреннюю работу, то, как они создаются и проектируются.
Время шло, а потом я немного отступил и начал изучать аппаратную эмуляцию. Я сосредоточился конкретно на NES, но хотел изучить аппаратную эмуляцию процессоров в целом. Это привело меня к изучению набора инструкций, в котором я уже знал концепцию, и что это было, так как я был до некоторой степени знаком с семейством Intel x86, но теперь мне пришлось изучать набор инструкций 6502.
Тем не менее, углубившись в это, я закончил тем, что провел больше исследований и начал изучать архитектуру набора инструкций с инженерной точки зрения. Это заставило меня узнать о том, как ЦП строится из логических элементов и как логические элементы строятся из транзисторов вместе с другими различными электрическими компонентами. Так что я узнал об этом с двух сторон сверху вниз и снизу вверх. Оба метода были очень эффективными, и я думаю, что изучение обоих помогает создать тот мост или разрыв, где программное обеспечение сочетается с аппаратным обеспечением.
После этого мне пришлось освежить свою булеву алгебру, и в итоге я узнал о K-картах, таблицах импликации, машинах состояний Мили и Мура, а также о многих других вещах, которые связывают двоичную логику и арифметику с физическими логическими элементами и интегральными схемами. И это подводит меня к недавнему прошлому, когда я начал работать с Logisim и начал изучать HDL, VHDL, Verilog и т. Д.
Я изучал все это в свободное время, когда мог, на протяжении последних 15-18 лет.
Вот некоторые сайты и ссылки, которые помогли мне на протяжении многих лет. Многие из них являются недавними, так как многие сайты, с которых я первоначально узнал, либо больше не существуют, я потерял их ссылки и не помню, или поисковые системы выдвинули их в дальний конец своих списков поиска ...
Языки - C ++
Учебники и ресурсы по 3D-графике
В сериалах и каналах Youtube рассказывается о вышеперечисленных темах, а также об оборудовании, компьютерах и электротехнике. Их слишком много, чтобы перечислить, поэтому я перечислю некоторые из них здесь, которые я считаю наиболее полезными и находчивыми. Я не буду предоставлять ссылки, но вы можете искать YouTube для этих каналов.
- 3Blue1Brown - Высшая математика
- Bisqwit - Расширенное программирование на C / C ++ (прикладные проекты) - Эмулятор оборудования NES
- Джейсон Тернер - Продвинутые современные методы программирования на C ++
- javidx9 - Расширенное программирование на C / C ++ (проекты приложений) - Эмулятор оборудования NES / Некоторые сборки
- MIT OpenCourse - курсы колледжа по математике и информатике
- Bilkent Online Courses - Курсы по компьютерным наукам и вычислительной технике (CPU Design MIPS)
- The Cherno - Расширенные темы и приложения для программирования на C / C ++ - Разработка игрового движка
- Ben Eater - Аппаратное обеспечение - Практическое применение через макеты
- Академия Несо - Аппаратная инженерия - Теория и концепции
- Socratica - программирование на Python
- Проще говоря - Аппаратное обеспечение - Теория и концепции
- Побитовый - Advanced C / C ++ Разработка ассемблера с помощью аппаратной эмуляции
- Бо Цянь - C ++ Темы в структурах данных и алгоритмах.
- LineByLine - Вулкан Программирование
- Джошуа Шакер - Вулкан Программирование
- www.MarekKnows.com - C ++, 3D Math и разработка игрового движка
И это не принимает во внимание некоторые из различных моих книг по этим темам.
-Примечание- Пожалуйста, не голосуйте по этому вопросу, так как это всего лишь сообщение читателю моего личного опыта, и оно лишено каких-либо попыток ответить или дать ссылку на исходный вопрос. В следующие пару дней, когда у меня будет время; Я добавлю дополнительный ответ, чтобы высказать свои соображения по поводу вопроса ОП, предоставляя полезные ссылки в качестве справочного материала и набора ресурсов, и я также обновлю этот ответ, чтобы включить некоторые ссылки здесь и изменить эту заметку. Уже поздно, и у меня нет времени, чтобы вычитать и редактировать то, что я уже написал. Я сделаю это, когда смогу ».