나는 최근에이 Q / A와 약 1 년 전에이 길을 여행하기 시작했습니다. 나는 이것이 내 자신의 관련 질문과 관련하여 매우 좋은 자료와 참조 페이지임을 알게 될 것입니다.
1 부 :-
서문-
나 자신에 대해 조금 :
내가 아직도 초등학교에있을 때 80 년대 중반에서 후반에, 나는 50 년대부터 80 년대까지의 정크 스테레오, VCR 및 기타 전자 장치를 분리하고 회로 보드를보고 항상 어떻게 알고 싶었는지 알고 싶었습니다. 작동 ... 실제로 방송 신호를 수집하고, 오디오, 비디오를 생성하고,이 작업을 수행하는 등의 작업을 수행했습니다. 여기에서 저항, 커패시터, 다이오드 및 트랜지스터와 같은 개별 부품을 인식 할 수 있었지만 그렇지 않았습니다. 그들이 어렸을 때 그들이 무엇을했는지, 어떻게 기능했는지 아십시오.
수년 동안 저는 항상 수학, 물리 및 화학 분야에서 탁월했습니다. 나는 수학을 고도로 이해했으며 나중에 온 중학교와 고등학교 시절의 간단한 또는 기본 회로를 읽을 수도 있었지만 논리 게이트와 그 구성 방법에 대해 배우지 못했습니다 ... Logic, Probability and Statistics Honors 클래스에서 고등학교의 부울 대수를 배우십시오. 모든 수학 및 과학 수업은 명예 수업이었습니다. 저는 커뮤니티 칼리지에서 2 학기까지 미적분학을 듣지 않았습니다. 나는 College Algebra에서 시험을 마치고 Trigonometry를 재교육 과정으로 이수했습니다. 교실에서 내 최고 수준의 수학은 단일 변수의 미적분학 II입니다.
3-4 살 정도되었을 때부터 비디오 게임을 해왔습니다. 어린 시절 저는 아타리, NES, 세가 제네시스, PS1을 가졌습니다. 나이가 들었고 10 대 후반과 20 대 초반에 저는 PS2와 SNES를 선호하는 선정 타이틀로 획득했습니다. 이것 또한 Doom!
나는 항상 열렬한 콘솔 및 PC 게이머였으며 여기에는 핀볼 및 아케이드 게임이 포함되지 않습니다.
90 년대 초 크리스마스 때 약 12 세가되었을 때 첫 PC를 받았습니다. DOS 6.0과 Win 3.11 또는 OS / 2의 시대. 그 이후로 저는 항상 "Windows"운영 체제 제품군과 제가 가지고 있던 모든 시스템에 대해 잘 알고있었습니다. 학교 나 대학에서 Apple 또는 Mac에 대한 경험이 제한적이지만 Linux 시스템에서 작업 할 수있는 권한이 없었습니다. 나는 Cygwin을 가지고 있으며 bash를 배우는 데 손을 보았지만 Dos 또는 Command Prompt 구문에 익숙합니다.
90 년대 초반에 PC-World 사본을 두 개나 얻어서 코드 스 니펫을 QBasic에 입력하여 잘 모르고 해당 프로그램을 작동 시키려고했습니다. 성공한 유일한 것은 홈 키의 키 누름을 다른 벨소리로 바꾸는 프로그램이었습니다. 나는 휴대 전화의 벨소리를 의미하지 않는다 나는 당신이 키를 누르고있는 한 연속 주파수를 의미합니다.
전자 장치가 디지털 및 논리 수준의 회로 내에서 어떻게 작동하는지 알고 컴퓨터를 프로그래밍하는 방법을 배우고 싶었지만 항상 내 자신의 비디오를 만들고 싶어했습니다. 계략. 90 년대 초에도 Frogger와 Tetris 게임을 만들고 싶었습니다.
이것은 컴퓨터 과학 분야에서 가장 어려운 프로그래밍 또는 소프트웨어 개발 유형 중 하나 인 3D 게임 엔진 디자인을 해결하려는 저의 동기가되고 욕구가되었습니다. Computer Science에는 다른 어려운 분야도 있지만, 개별 구성 요소 또는 하위 엔진에 기술 및 속성이 필요하므로 복잡한 게임 엔진에는 일반적으로 거의 모든 것이 포함됩니다.
고등학교 시절부터 프로그래밍에 대한 배경 지식이 있었지만 이것은 끔찍한 Visual Basic으로 제한되었습니다. 1999 년 고등학교를 졸업 한 후 몇 년이 지나서야 2002-2003 년경에 C / C ++를 배우고 배우기 시작했습니다. 오늘날까지도 컴퓨터 공학이나 컴퓨터 공학에 대한 대학 수업 경험은 없지만 헌신과 결심, 나는 컴퓨터, 하드웨어, 프로그래밍, 알고리즘 등에 관한 모든 개념에 대해 배웠으며 여전히 가능한 한 많이 배우고 있습니다 ...
C / C ++을 배우는 초기에는 인터넷에 액세스했지만 인터넷은 초기 단계에 있었으며 Amazon, Youtube, Facebook 등의 웹 사이트는 아직 존재하지 않았지만 여전히 56k의 시대였습니다. 두 번째 전용 회선이없는 경우 전화선을 연결하는 모뎀을 다이얼하십시오. 이미지가 화면에 렌더링되는 데 몇 분이 걸리므로 지속적인 비디오 재생은 신경 쓰지 마십시오.
따라서 C ++로 프로그래밍하는 방법을 연구하고 배우는 데있어 리소스는 제한적이며 대부분 텍스트 형식이었습니다. 초창기 인터넷 튜토리얼 시절부터 프로젝트를 수행하려고 할 때, 그 프로젝트의 대부분은 완전하지 않았고, 작가는 전문가이거나 대학생이었으며 독자는 컴파일과 같은 필요한 많은 개념에 이미 익숙했다는 많은 가정을했습니다. , 링크 및 디버깅 및 라이브러리 통합.
이러한 주제에 대해 전혀 모르는 사람은 무엇이 잘못되었는지, 문제를 해결하는 방법 및 올바르게 작동하는 방법을 모르기 때문에 상실됩니다. 자원이 매우 제한적인 당시에는 시행 착오를받는 데 많은 시간이 걸렸습니다. 이 웹 사이트에서 지금 할 수있는 것과 같은 도움을 요청하거나 cppreference 에서 찾을 수있는 자세한 설명을 찾을 수 없었습니다! 당신이 개인적으로 누군가를 모른다면 도움을 청할 사람이 많지 않았습니다!
시간이 지남에 따라 나는 여기저기서 내 지식의 일부를 향상 시켰고 결국 인터넷은 DSL로 향상되었으며 이제는 초고속 인터넷, 웹 사이트가 더 상호 작용하고 비디오가 나타나기 시작했으며 시간이 지남에 따라 비디오 품질이 좋아졌습니다. 유튜브가 나타나기 시작하고 연구 측면에서 일이 조금 쉬워졌습니다. 점점 더 많은 튜토리얼을 쉽게 이용할 수있게되었으며 일부는 다른 사람들이 나쁜 관행을 가르쳤을 때 유용하고 유용했습니다 ...
또한 개발에 필요한 도구를 찾고 획득하는 데 많은 시간을 보냈습니다. 언어 구문, 컴파일러 및 컴파일 프로세스, 링크, 빌드 및 디버깅을 배워야했습니다. 그런 다음 사용 가능한 다양한 라이브러리 및 API와 이러한 종속성을 모두 연결하도록 프로젝트 또는 솔루션을 구성하는 방법에 대해 배워야했습니다.
수년 동안 저는 C ++ 언어가 시간이 지남에 따라 성장하고 발전하며 적응하는 것을 보았습니다. 처음에는 수년 동안 거의 동일하게 유지되었지만, 지난 10 년 동안 처음부터이 짧은 범위 내에서 크게 바뀌 었습니다.
C ++은 다재다능 함, 강력 함, 풍부한 기능 세트 및 발로 자신을 쏠 수있는 능력으로 인해 완전히 마스터하기 가장 어려운 언어 중 하나이기 때문에이 모든 것을 언급합니다! 그리고 모든 경고에도 불구하고,이 유형의 개발에 대한 표준으로 최고의 업계에서 사용되는 가장 강력하고 선호되는 언어 중 하나입니다. 올바르게 수행되면 빠르고 간결하고 신뢰할 수 있으며 가장 작은 발자국.
그 이후로 3D 그래픽 프로그래밍 및 게임 엔진 디자인을 배우려는 의도와 집중으로 수년 동안 C / C ++에서 자체 교육을 받았습니다. 나는 100 ~ 1,000 시간의 검색, 연구 및 그 밖의 지식을 읽고, 배우고, 유용한 작업 제품 및 응용 프로그램의 설계에 적용하는 것에 더 많은 시간을 투자했습니다. 나는 항상 기술과 기술을 향상시키기 위해 더 많은 것을 배우고 싶어하는 의지와 열망을 가지고있었습니다.
이것은 첫 번째 단계였으며 C / C ++ 및 C #에서 수행 한 DirectX 9.c를 처음부터 읽고 작업하기 시작했습니다. 그런 다음 DirectX 10 및 레거시 OpenGL 1.0으로 옮겼습니다. DirectX 11과 OpenGL 3.x-4.x에서 왔으며 이제는 Vulkan에서 손을 even습니다.
텍스트와 비디오 형식의 다양한 온라인 자습서를 통해 성공적인 게임 엔진을 구축했습니다. 나는 이미 수학에 대해 강한 배경을 가지고 있다고 말했지만 그것은 미적분학 I & II로 제한되었습니다. 나는 대학에서 내 Calculus 기반 물리학 수업에 대해 약간의 지식을 가지고있는 Vector Calculus를 가르쳐야했지만 Affine Transformations and Analytical Geometry가있는 Linear Algebra에 관해서는 특정 방정식, 함수, 방법, 알고리즘 및 개념이 필요했습니다. 그런 다음 그것들을 효율적이고 읽기 쉽고 신뢰할 수 있고 재사용 가능한 코드로 변환하여 수백에서 수천 시간의 디버깅을 가능하게하는 일반적이고 버그가없는 코드로 변환하는 방법을 배워야했습니다.
메모리 관리, 레퍼런스 카운팅, 인스 턴싱, 재귀 등을 포함하는 주제와 알고리즘을 배우는 것은 놀라운 여정이었습니다. 방대한 게임 엔진의 모든 구성 요소는 아니지만 많은 부분에서 사용됩니다. 여기에 그것들을 모두 나열 할 수는 있지만 3 또는 4 개의 답변 공간을 채울 수있는 충분한 정보입니다. 그러나 하위 주제가 아닌 일반 주제 목록을 포함시킬 것입니다.
다음은 모든 다양한 렌더링 기술, 렌더링 및 쉐이더 파이프 라인 설정, 쉐이더를 통한 음영 및 조명 기술, 사전 및 사후 처리, 프레임 버퍼, 백 버퍼를 포함하는 모든 기능을 갖춘 게임 엔진으로 구성된 주제 또는 주제 목록입니다. , 이미지 로딩, 오디오 및 모델 로딩 및 구문 분석, 수동 재질 매핑, 객체 변환, 카메라 유형, 장면 그래프 계층 구조, 텍스처, 오디오, 글꼴 및 셰이더 및 메모리 관리, 예외 처리 기능이있는 로깅 시스템, 멀티 스레드 및 병렬 프로그래밍 기술, 네트워킹, 물리 엔진, 충돌 감지, 입자 생성기, 애니메이션, 게임 AI, 지형 생성, 스카이 박스 및 스카이 돔, 워터 렌더링,폴리 지 및 기타 ..., 텍스트 렌더링, HUD 오버레이, 인벤토리, 맵 및 매크로 생성, 상태 시스템 및 상태 시스템을위한 텍스처 글꼴이있는 GUI, 마지막으로 파서를 작성하여 자체 스크립트 언어를 작성하여 이러한 오브젝트를 자동화 응용 프로그램 시작시 데이터 컨테이너에 데이터 개체와 구조를 채우도록 데이터 파일을로드하기 만하면 다시 컴파일하지 않고도 엔진 내에서 데이터 값을 변경할 수 있습니다.마지막으로 구문 분석기를 작성하여 자체 스크립트 언어를 작성하여 이러한 오브젝트의 많은 부분을 자동화하여 데이터 파일에로드하여 데이터 오브젝트 및 구조를 해당 컨테이너에 채우는 것만으로 다시 컴파일하지 않고도 엔진 내에서 데이터 값을 변경할 수 있습니다. 응용 프로그램 시작시.마지막으로 구문 분석기를 작성하여 자체 스크립트 언어를 작성하여 이러한 오브젝트의 많은 부분을 자동화하여 데이터 파일에로드하여 데이터 오브젝트 및 구조를 해당 컨테이너에 채우는 것만으로 다시 컴파일하지 않고도 엔진 내에서 데이터 값을 변경할 수 있습니다. 응용 프로그램 시작시.
몇 년 동안 나는 컴파일러, 어셈블러 및 간단한 운영 체제에 대해 배우고 싶었던 어셈블리 언어를 배우고 싶어했습니다. 내부 작업, 빌드 및 설계 방법을 의미합니다.
시간이 흐른 다음 나는 조금씩 물러서서 하드웨어 에뮬레이션을 배우기 시작했습니다. 나는 특히 NES에 초점을 맞추었지만 일반적으로 CPU의 하드웨어 에뮬레이션을 배우고 싶었습니다. 이를 통해 이미 개념을 알고있는 명령어 세트와 인텔 x86 제품군에 어느 정도 익숙해졌지만 6502 명령어 세트를 배워야했습니다.
그러나 이것으로 뛰어 들면서 더 많은 연구를했고 엔지니어링 관점에서 Instruction Set Architecture에 대해 배우기 시작했습니다. 이를 통해 로직 게이트에서 CPU를 구축하는 방법과 다른 다양한 전기 부품과 함께 트랜지스터로 로직 게이트를 구축하는 방법을 배울 수있었습니다. 그래서 나는 위에서 아래로 두 가지 관점에서 이것에 대해 배우게되었습니다. 두 방법 모두 매우 효과적이었으며 두 가지 방법 모두 소프트웨어를 통해 하드웨어를 강화하는 다리나 틈새를 만드는 데 도움이된다고 생각합니다.
이것으로부터 나는 불리언 대수를 새로 고쳐야했고, K-Maps, Implication Tables, State Machines Mealy와 Moore 그리고 이진 논리와 산술과 물리 논리 게이트와 집적 회로와 관련된 다양한 것들에 대해 배우게되었습니다. 그리고 이것은 내가 Logisim과 함께 일하기 시작했고 HDL, VHDL, Verilog 등을 배우기 시작한 최근의 저에게로 돌아갑니다.
나는 지난 15-18 년 동안 여가 시간에이 모든 것을 배우고 있습니다.
몇 년 동안 나를 안내해 준 사이트와 링크는 다음과 같습니다. 내가 처음부터 배운 많은 사이트가 더 이상 존재하지 않거나 링크를 잃어 버렸거나 기억하지 못하거나 검색 엔진이 검색 목록의 맨 뒤로 검색을 밀어 넣었을 때 이러한 사이트 중 대부분은 최근에 ...
그리고 이것들은 내가이 주제에 대해 가지고있는 다양한 책들 중 일부를 고려하지 않습니다.
-참고-이 내용은 본인의 개인적인 경험을 읽은 독자에게만 전달되는 메시지이므로 원래 질문에 답변하거나 언급하려는 시도는 없습니다. 내가 시간이있는 다음 며칠 동안; 유용한 링크를 참조 및 리소스 집합으로 제공하면서 OP의 질문에 대한 내 생각을 제공하기 위해 후속 답변을 추가하고 여기에 링크를 포함 하고이 메모를 수정하기 위해이 답변을 업데이트합니다. 늦었고 현재 이미 작성한 것을 교정하고 편집 할 시간이 없습니다. 할 수있을 때 할게요 "