Recentemente, deparei-me com essa pergunta e mais ou menos um ano atrás, quando comecei a percorrer esse caminho; Eu teria achado que este é um recurso muito bom e uma página de referência em relação às minhas próprias questões relacionadas.
Parte 1:
-Preface-
Um pouco sobre mim:
Em meados do final dos anos 80, quando eu ainda estava na escola, eu desmontava aparelhos de som, videocassetes e outros aparelhos eletrônicos que estavam entre os anos 50 e 80 e olhava para as placas de circuito e sempre quis saber como eles funcionavam. trabalho ... Como eles realmente adquiriram o sinal de transmissão, produzem áudio, vídeo, fazem isso e aquilo etc ... Eu reconhecia as partes individuais aqui e ali, como resistores, capacitores, diodos e transistores, mas não saber o que eles fizeram ou como eles funcionaram em uma idade tão jovem.
Ao longo dos anos, sempre fui excepcional em Matemática, Física e Química. Eu entendia matemática bastante e até conseguia ler alguns circuitos simples ou básicos do ensino médio e do ensino médio que vieram mais tarde, mas nunca consegui aprender sobre os portões lógicos e como eles foram construídos ... aprenda Álgebra Booleana no ensino médio com minha turma de Honras em lógica, probabilidade e estatística. Todas as minhas aulas de matemática e ciências eram honras. Não fiz Cálculo até meu segundo semestre em uma faculdade comunitária. Eu testei fora da faculdade de Álgebra e tomei Trigonometria como um curso de reciclagem. Meu nível mais alto de matemática da sala de aula é o Cálculo II de uma única variável.
Eu jogo videogame desde os 3 ou 4 anos de idade. Quando criança, eu tinha o Atari, o NES, o Sega Genesis e o PS1. Quando fiquei mais velho, entre o final da adolescência e o início dos 20, adquiri o PS2 e o SNES com títulos selecionados preferidos. Isso também não conta para jogos de PC que remontam ao Doom!
Eu sempre fui um ávido jogador de console e PC e isso não inclui jogos de pinball e arcade.
Recebi meu primeiro PC quando tinha cerca de 12 anos no Natal, no início dos anos 90. Os dias do DOS 6.0 e Win 3.11 ou OS / 2. Desde então, eu sempre estive familiarizado com a família de sistemas operacionais "Windows" e todos os sistemas que tive eram da arquitetura Intel. Eu tive uma experiência limitada com Apple ou Mac da escola ou faculdade, mas nunca tive o privilégio de trabalhar em sistemas Linux. Eu tenho o Cygwin e já tentei aprender bash, mas estou tão acostumado ao Dos ou à sintaxe do prompt de comando.
No início dos anos 90, eu pegava uma ou duas cópias do PC-World e digitava os trechos de código no QBasic que eu não conhecia muito bem e tentava fazer esses programas funcionarem. O único que obteve sucesso foi um programa para transformar as teclas pressionadas na linha inicial de teclas em diferentes sons de toque. Não quero dizer os toques de um telefone celular, quero dizer uma frequência contínua, desde que você mantenha a tecla pressionada.
Sempre foi uma paixão minha não apenas querer saber como os dispositivos eletrônicos funcionavam dentro da circunferência nos níveis digital e lógico, aprender a programar um computador, mas sempre tive o desejo de fazer meu próprio vídeo jogos Mesmo no início dos anos 90, eu queria fazer os jogos Frogger e Tetris ...
Essa se tornou minha principal motivação e desejo de enfrentar um dos tipos mais difíceis de programação ou desenvolvimento de software no campo da Ciência da Computação, que é o 3D Game Engine Design. Existem outros campos na Ciência da Computação que são igualmente difíceis, no entanto, qualquer mecanismo de jogo sofisticado incluirá normalmente ou quase todos eles, já que os componentes ou sub-motores individuais exigem suas técnicas e / ou propriedades.
Eu tinha alguma experiência em programação nos meus dias do ensino médio, mas isso estava limitado ao horrível Visual Basic. Comecei a aprender C / C ++ por volta de 2002 - 2003 até poucos anos depois de me formar no ensino médio, em 1999. Até hoje, não tenho nenhuma experiência na faculdade em Ciência da Computação ou Engenharia de Computação, mas através de dedicação e determinação, aprendi quase todos os conceitos existentes em computadores, hardware, programação, algoritmos, etc. e continuo aprendendo o máximo que posso ...
Durante os primeiros dias de aprendizado de C / C ++, eu tinha acesso à Internet, mas a Internet estava em seus estágios iniciais, sites como Amazon, Youtube, Facebook etc. ainda não existiam, ainda eram os dias de 56k modems dial-up que aumentam sua linha telefônica se você não tiver uma segunda linha dedicada. Levaria alguns minutos apenas para uma imagem renderizar na tela, não importa a reprodução contínua de vídeo.
Portanto, quando se tratava de pesquisar e aprender a programar em C ++, os recursos eram limitados e a maioria estava em formato de texto. Ao tentar abordar os projetos desde os primeiros dias de tutoriais na Internet, muitos desses projetos não estavam totalmente completos, os escritores eram profissionais ou estudantes universitários e fizeram muitas suposições de que o leitor já estava familiarizado com muitos dos conceitos necessários, como compilação , vinculação e depuração e integração de biblioteca.
Para alguém que não sabe nada sobre esses tópicos, fica perplexo porque não sabe o que deu errado, nem como corrigi-lo e como fazê-lo funcionar corretamente. Levei muitas horas de tentativa e erro naqueles dias com recursos muito limitados. Pedir ajuda, como podemos agora, com este site ou procurar explicações detalhadas que você pode encontrar na cppreference, não estava disponível! Se você, pessoalmente, não conhecia ninguém, não havia tantos que você poderia pedir ajuda!
À medida que o tempo passava, aprimorei alguns dos meus conhecimentos aqui e ali, e, eventualmente, a Internet melhorou para DSL, e agora a Internet de alta velocidade, os sites se tornaram mais interativos, os vídeos começaram a aparecer, a qualidade dos vídeos melhorou com o tempo, sites como como o YouTube começou a aparecer e as coisas se tornaram um pouco mais fáceis no lado da pesquisa. Mais e mais tutoriais se tornaram disponíveis, alguns eram bons e úteis onde outros ensinavam más práticas ...
Também passei bastante tempo encontrando e adquirindo as ferramentas necessárias para o desenvolvimento. Eu tive que aprender a sintaxe da linguagem, o compilador e o processo de compilação, vinculação, construção e depuração. Então tive que aprender sobre as diferentes bibliotecas e APIs disponíveis e como configurar meus projetos ou soluções para vincular todas essas dependências.
Ao longo dos anos, observei a linguagem C ++ crescer, evoluir e se adaptar ao longo do tempo. No começo, permaneceu praticamente o mesmo por muitos anos, mas nos últimos 10 anos mudou drasticamente nesse curto espaço desde o início.
Menciono tudo isso porque o C ++ é uma das linguagens mais difíceis de dominar por causa de sua versatilidade, poder, rico conjunto de recursos e a capacidade de permitir que você atinja seu próprio pé! E mesmo com todas as suas ressalvas, é uma das linguagens mais poderosas e preferidas usadas nos principais líderes do setor como padrão para esse tipo de desenvolvimento, porque quando é feita corretamente, é rápida, concisa, confiável e usa o menor pegada.
Desde então, sou autodidata em C / C ++ há muitos anos, com a intenção e o foco em aprender programação de gráficos 3D e design de mecanismos de jogos. Eu dediquei de 100 a 1.000 horas de pesquisa, pesquisa e muito mais na leitura, aprendizagem e aplicação desse conhecimento na criação de produtos e aplicativos úteis. Eu sempre tive vontade e desejo de aprender mais para melhorar minhas habilidades e habilidades.
Esse foi o primeiro estágio, então eu comecei a ler e trabalhar com o DirectX 9.c, o que fiz em C / C ++ e até C #. Então mudei para o DirectX 10 e o Legacy OpenGL 1.0. A partir deles vieram o DirectX 11 e o OpenGL 3.x - 4.xe agora tentei a minha mão no Vulkan.
Criei mecanismos de jogos bem-sucedidos, trabalhando com vários tutoriais on-line, tanto nos formatos de texto quanto de vídeo. Eu já afirmei que tinha uma sólida formação em matemática, mas estava limitada ao Cálculo I e II. Eu tive que me ensinar Vector Calculus, que eu tinha algum conhecimento da minha aula de Física baseada em cálculo na faculdade, mas quanto à Álgebra Linear com Transformações Afins e Geometria Analítica, eu tive que aprendê-las por conta própria quando certas equações, funções, métodos, algoritmos e conceitos eram necessários. Depois, tive que aprender a traduzi-los em código eficiente, legível, confiável e reutilizável, genérico e sem erros, possível, colocando centenas a milhares de horas de depuração.
Foi uma jornada maravilhosa aprender os tópicos e algoritmos que incluem gerenciamento de memória, contagem de referência, instanciação, recursão e muito mais que são usados em muitos, senão em todos os componentes de um mecanismo de jogo onde eles são vastos. Eu poderia listar todos eles aqui, mas isso seria informação suficiente para preencher 3 ou 4 respostas em espaço de resposta. No entanto, incluirei a lista dos tópicos gerais, não apenas os sub-tópicos.
Aqui estão os tópicos ou a lista de assuntos do que consiste em um mecanismo de jogo totalmente funcional, que inclui todas as várias técnicas de renderização, configurando os pipelines de renderização e sombreador, técnicas de sombreamento e iluminação via sombreadores, pré e pós-processamento, buffers de quadro, buffers de volta , carregamento de imagem, carregamento e análise de áudio e modelo, criando formas primitivas com propriedades de material de cor, textura e coordenadas normais com mapeamento manual de texturas, transformações de objetos, tipos de câmera, hierarquias de gráficos de cena, classes de gerente para texturas, áudio, fontes e shaders e gerenciamento de memória, sistema de registro com tratamento de exceções, técnicas de programação multithread e paralela, rede, mecanismo físico, detecção de colisão, gerador de partículas, animação, IA de jogo, geração de terreno, caixas de céu e domos de céu, renderização de água,folhagem e muito mais ..., GUIs com fonte texturizada para renderização de texto, sobreposições de HUD, inventários, geração de mapas e macro, sistema de estado e máquinas de estado e, finalmente, escrevendo um analisador para criar sua própria linguagem de script para automatizar muitos desses objetos a capacidade de alterar valores de dados no mecanismo sem precisar recompilar apenas carregando os arquivos de dados para preencher os objetos e estruturas de dados em seus respectivos contêineres na inicialização do aplicativo.e, finalmente, gravando um analisador para criar sua própria linguagem de script para automatizar muitos desses objetos e alterar os valores dos dados no mecanismo sem precisar recompilar apenas carregando nos arquivos de dados para preencher os objetos e estruturas de dados em seus respectivos contêineres na inicialização do aplicativo.e, finalmente, gravando um analisador para criar sua própria linguagem de script para automatizar muitos desses objetos e alterar os valores dos dados no mecanismo sem precisar recompilar apenas carregando nos arquivos de dados para preencher os objetos e estruturas de dados em seus respectivos contêineres na inicialização do aplicativo.
Ao longo dos anos, fiquei intrigado em querer aprender a linguagem assembly, pelo que eu queria aprender sobre compiladores, montadores e sistemas operacionais simples, quero dizer o funcionamento interno, como eles são construídos e projetados.
O tempo passou e então eu dei um passo para o lado e comecei a aprender a emulação de hardware. Eu me concentrei especificamente no NES, mas queria aprender a emulação de hardware de CPUs em geral. Isso me levou a aprender sobre o conjunto de instruções em que eu já conhecia o conceito e o que era, já que eu já estava familiarizado com a família x86 da Intel até certo ponto, mas agora eu tinha que aprender o conjunto de instruções 6502.
No entanto, mergulhando nisso, acabei fazendo mais pesquisas e comecei a aprender sobre a arquitetura do conjunto de instruções da perspectiva da engenharia. Isso me levou a aprender sobre como a CPU é construída a partir das portas lógicas e como as portas lógicas são construídas a partir de transistores junto com outros vários componentes elétricos. Acabei aprendendo sobre isso de duas perspectivas, de cima para baixo e de baixo para cima. Ambos os métodos foram muito eficazes e acho que aprender com os dois ajuda a criar essa ponte ou lacuna onde o software consome o hardware.
A partir disso, tive que atualizar minha Álgebra Booleana e acabei aprendendo sobre K-Maps, Tabelas de Implicação, Máquinas de Estado Mealy e Moore e várias outras coisas que relacionam Lógica Binária e Aritmética aos Portões Lógicos Físicos e Circuitos Integrados. E isso me leva ao passado ressentido, onde comecei a trabalhar com o Logisim e comecei a aprender HDL, VHDL, Verilog, etc.
Eu tenho aprendido tudo isso no meu tempo livre, quando pude nos últimos 15 a 18 anos.
Aqui estão alguns dos sites e links que me guiaram ao longo dos anos. Muitos desses sites são recentes, já que muitos dos sites de que aprendi originalmente não existem mais, perdi os links e não me lembro, ou os mecanismos de pesquisa os colocaram no fundo de suas listas de pesquisa ...
Idiomas - C ++
Tutoriais de gráficos 3D e sites de recursos
As séries e canais do YouTube cobrem os tópicos acima, além de hardware, computador e engenharia elétrica. Há muitos para listar, por isso vou listar alguns deles que acho mais úteis e úteis. Não fornecerei os links, mas você pode pesquisar no YouTube por esses canais.
- 3Blue1Brown - Matemática Avançada
- Bisqwit - Programação Avançada em C / C ++ (Projetos de Aplicação) - Emulador de Hardware NES
- Jason Turner - Técnicas de programação avançadas avançadas em C ++
- javidx9 - Programação avançada em C / C ++ (projetos de aplicativos) - Emulador de hardware NES / alguma montagem
- MIT OpenCourse - Cursos Universitários em Matemática e Ciência da Computação
- Bilkent Online Courses - Cursos da faculdade em Ciência da Computação e Engenharia da Computação (CPU Design MIPS)
- The Cherno - Tópicos e aplicativos avançados de programação C / C ++ - Desenvolvimento de Game Engine
- Ben Eater - Engenharia de Hardware - Aplicação Prática em Breadboards
- Neso Academy - Engenharia de Hardware - Teoria e Conceitos
- Socratica - Programação em Python
- Simplificando - Engenharia de Hardware - Teoria e Conceitos
- Bitwise - C / C ++ avançado projetando um assembler via emulação de hardware
- Bo Qian - C ++ Tópicos em estruturas de dados e algoritmos.
- LineByLine - Programação Vulkan
- Joshua Shucker - Programação Vulkan
- www.MarekKnows.com - C ++, matemática 3D e desenvolvimento de mecanismos de jogos
E isso não leva em consideração alguns dos vários livros que tenho sobre esses tópicos.
-Nota- Não vote nisto, pois isso é apenas uma mensagem para o leitor de minha própria experiência pessoal e é nulo de qualquer tentativa de responder ou fazer referência à pergunta original. Nos próximos dias, quando eu tiver tempo; Vou adicionar uma resposta de acompanhamento para refletir sobre a pergunta do OP, fornecendo links úteis como referência e conjunto de recursos, e atualizarei essa resposta para incluir alguns links aqui e modificar esta nota. É tarde e, atualmente, não tenho tempo para revisar e editar o que já escrevi. Eu farei isso quando puder ".