Gần đây tôi đã bắt gặp Q / A này và khoảng một năm trước khi tôi bắt đầu đi trên con đường này; Tôi sẽ thấy đây là một trang tham khảo và tài nguyên rất tốt liên quan đến các câu hỏi liên quan của riêng tôi.
Phần 1:
-Preface-
Một chút về bản thân:
Vào giữa đến cuối thập niên 80 khi tôi còn học tiểu học, tôi sẽ tách các dàn âm thanh nổi, VCR và các thiết bị điện tử khác từ thập niên 50 đến thập niên 80 và nhìn vào bảng mạch và luôn muốn biết chúng đã làm thế nào hoạt động ... Làm thế nào mà họ thực sự thu được tín hiệu phát sóng, sản xuất âm thanh, video, làm điều này và v.v ... Tôi có thể nhận ra các bộ phận riêng lẻ ở đây và ở đó như resister, tụ điện, diode và bóng bán dẫn, nhưng không biết những gì họ đã làm hoặc làm thế nào họ hoạt động ở độ tuổi trẻ như vậy.
Trong suốt những năm qua, tôi luôn luôn xuất sắc về Toán học, Vật lý và Hóa học. Tôi hiểu toán ở mức độ cao và thậm chí có thể đọc một số mạch đơn giản hoặc cơ bản từ những ngày học cấp hai và cấp ba sau đó, nhưng tôi chưa bao giờ học về cổng logic và cách chúng được xây dựng ... Tuy nhiên tôi đã làm học Đại số Boolean ở trường trung học từ lớp Logic, Xác suất và Thống kê danh dự của tôi. Tất cả các lớp toán và khoa học của tôi là các lớp danh dự. Tôi đã không học giải tích cho đến học kỳ thứ hai tại một trường cao đẳng cộng đồng. Tôi đã kiểm tra Đại học Đại số và lấy Lượng giác làm khóa bồi dưỡng. Trình độ toán cao nhất của tôi từ lớp học là Giải tích II của một biến duy nhất.
Tôi đã chơi trò chơi điện tử từ khi tôi khoảng 3 hoặc 4 tuổi. Khi còn nhỏ, tôi đã có Atari, NES, Sega Genesis và PS1. Khi tôi già đi và vào tuổi thiếu niên và đầu những năm 20 tuổi, tôi đã mua được máy PS3 và SNES với các tựa game được lựa chọn ưa thích. Điều này cũng không giải thích cho việc chơi game trên PC đã lùi xa như Doom!
Tôi luôn là một game thủ yêu thích Console và PC và điều này không bao gồm các trò chơi pinball và arcade.
Tôi đã được tặng chiếc PC đầu tiên của mình khi tôi khoảng 12 tuổi vào Giáng sinh vào đầu những năm 90. Thời của DOS 6.0 và Win 3.11 hoặc OS / 2. Kể từ đó, tôi luôn quen thuộc với hệ điều hành "Windows" và tất cả các hệ thống tôi có là Kiến trúc Intel. Tôi đã có kinh nghiệm hạn chế với Apple hoặc Mac từ trường học hoặc đại học, nhưng tôi chưa bao giờ có đặc quyền làm việc trên các hệ thống Linux. Tôi có Cygwin và tôi đã thử học bash, nhưng tôi đã quá quen với cú pháp của Dos hoặc Command Prompt.
Vào đầu những năm 90, tôi sẽ nhận được một hoặc hai bản PC-World và sẽ nhập các đoạn mã vào QBasic mà tôi không biết rõ và sẽ cố gắng làm cho các chương trình đó hoạt động. Điều duy nhất thành công là một chương trình biến các phím bấm trên hàng phím nhà thành các âm thanh nhạc chuông khác nhau. Tôi không có nghĩa là nhạc chuông trên điện thoại di động. Ý tôi là tần số liên tục miễn là bạn giữ phím.
Tôi luôn luôn là niềm đam mê của tôi khi không chỉ muốn biết các thiết bị điện tử hoạt động như thế nào trong phạm vi kỹ thuật số và logic, để học cách lập trình máy tính, mà tôi luôn có mong muốn tạo ra video của riêng mình Trò chơi. Ngay cả vào đầu những năm 90, tôi đã muốn tạo ra các trò chơi Frogger và Tetris ...
Điều này trở thành động lực và mong muốn hàng đầu của tôi để giải quyết một trong những loại lập trình hoặc phát triển phần mềm khó nhất trong lĩnh vực Khoa học Máy tính và đó là Thiết kế Công cụ Trò chơi 3D. Có những lĩnh vực khác trong Khoa học máy tính cũng khó khăn như vậy, tuy nhiên, bất kỳ công cụ trò chơi tinh vi nào thường sẽ hoặc thường bao gồm hầu hết tất cả chúng vì các thành phần riêng lẻ hoặc công cụ phụ yêu cầu kỹ thuật và thuộc tính của chúng.
Tôi đã có một số nền tảng về lập trình từ những ngày học cấp ba nhưng điều này chỉ giới hạn ở Visual Basic khủng khiếp. Tôi bắt đầu học và học C / C ++ vào khoảng năm 2002 - 2003 cho đến vài năm sau khi tôi tốt nghiệp trường trung học năm 1999. Thậm chí cho đến ngày nay tôi không có bất kỳ kinh nghiệm nào về lớp đại học về Khoa học máy tính hoặc Kỹ thuật máy tính, nhưng thông qua cống hiến và quyết tâm, tôi đã học được mọi khái niệm khi nói đến máy tính, phần cứng, lập trình, thuật toán, v.v. và tôi vẫn tiếp tục học hỏi nhiều nhất có thể ...
Trong những ngày đầu học C / C ++, tôi đã truy cập internet nhưng internet sau đó mới ở giai đoạn đầu, các trang web như Amazon, Youtube, Facebook, v.v. thậm chí còn chưa tồn tại, nó vẫn còn là 56k quay số modem mà lên dòng điện thoại của bạn nếu bạn không có một dòng chuyên dụng thứ hai. Sẽ mất vài phút chỉ để một hình ảnh hiển thị trên màn hình, không bao giờ bận tâm phát lại video liên tục.
Vì vậy, khi nói đến nghiên cứu và học cách lập trình trong C ++, tài nguyên bị hạn chế và hầu hết là ở định dạng văn bản. Khi cố gắng giải quyết các dự án từ những ngày đầu hướng dẫn trên internet, nhiều dự án trong số đó chưa hoàn thành đầy đủ, các nhà văn là chuyên gia hoặc sinh viên đại học và họ đưa ra nhiều giả định rằng người đọc đã quen thuộc với nhiều khái niệm cần thiết như biên soạn , liên kết và gỡ lỗi và tích hợp thư viện.
Đối với một người không biết gì về những chủ đề đó, họ cảm thấy hụt hẫng vì họ không biết điều gì đã xảy ra, cũng như cách khắc phục và làm thế nào để nó hoạt động bình thường. Tôi đã mất nhiều giờ thử nghiệm và sai sót trong những ngày đó với nguồn lực rất hạn chế. Yêu cầu trợ giúp như bây giờ chúng tôi có thể với trang web này hoặc tìm kiếm các giải thích chi tiết mà bạn có thể tìm thấy trên cppreference không có sẵn! Nếu cá nhân bạn không biết ai, sẽ không có nhiều bạn có thể nhờ trợ giúp!
Khi thời gian trôi qua, tôi đã cải thiện một số kiến thức của mình ở đây và ở đó, và cuối cùng internet đã cải thiện DSL, và bây giờ Internet tốc độ cao, các trang web trở nên tương tác hơn, video bắt đầu hiển thị, chất lượng video trở nên tốt hơn theo thời gian, các trang web như vậy khi Youtube bắt đầu xuất hiện và mọi thứ trở nên dễ dàng hơn một chút về phía nghiên cứu. Ngày càng có nhiều hướng dẫn trở nên có sẵn, một số là tốt và hữu ích khi những người khác dạy các thực hành xấu ...
Tôi cũng đã dành nhiều thời gian để tìm kiếm và có được các công cụ cần thiết để phát triển. Tôi đã phải học cú pháp ngôn ngữ, trình biên dịch và quá trình biên dịch, liên kết, xây dựng và gỡ lỗi. Sau đó, tôi đã phải tìm hiểu về các thư viện và API khác nhau hiện có và cách định cấu hình các dự án hoặc giải pháp của tôi để liên kết tất cả các phụ thuộc đó.
Trong những năm qua, tôi đã chứng kiến ngôn ngữ C ++ phát triển, phát triển và thích nghi theo thời gian. Ban đầu, nó gần như giữ nguyên trong nhiều năm, nhưng trong 10 năm qua, nó đã thay đổi đáng kể trong khoảng thời gian ngắn này kể từ khi thành lập.
Tôi đề cập đến tất cả những điều này bởi vì C ++ là một trong những ngôn ngữ khó nhất để hoàn toàn làm chủ vì tính linh hoạt, sức mạnh, bộ tính năng phong phú và khả năng cho phép bạn tự bắn vào chân mình! Và ngay cả với tất cả sự cẩn thận của nó, nó là một trong những ngôn ngữ mạnh mẽ và được ưa thích nhất được sử dụng trong ngành công nghiệp hàng đầu như một tiêu chuẩn cho loại phát triển này bởi vì khi nó được thực hiện một cách chính xác, nó nhanh, ngắn gọn, đáng tin cậy và sử dụng in chân nhỏ nhất.
Kể từ đó, tôi đã được dạy về C / C ++ trong nhiều năm với ý định và tập trung vào việc học Lập trình đồ họa 3D và Thiết kế công cụ trò chơi. Tôi đã dành 100 đến 1.000 giờ để tìm kiếm, nghiên cứu và nhiều hơn nữa vào việc đọc, học và áp dụng kiến thức đó vào việc thiết kế các sản phẩm và ứng dụng làm việc hữu ích. Tôi luôn có ý chí và mong muốn muốn học hỏi nhiều hơn để cải thiện bộ kỹ năng và nghề thủ công của mình.
Đây là giai đoạn đầu tiên, sau đó tôi đã bắt đầu đọc và làm việc với DirectX 9.c ban đầu, điều mà tôi đã thực hiện trong C / C ++ và thậm chí là C #. Sau đó, tôi chuyển sang DirectX 10 và Legacy OpenGL 1.0. Từ DirectX 11 và OpenGL 3.x - 4.x của họ và bây giờ tôi thậm chí đã thử dùng Vulkan.
Tôi đã xây dựng các công cụ trò chơi thành công làm việc thông qua các hướng dẫn trực tuyến khác nhau ở cả định dạng văn bản và video. Tôi đã tuyên bố rằng tôi có một nền tảng vững chắc về toán học nhưng nó chỉ giới hạn ở Giải tích I & II. Tôi đã phải tự học Vector Tính toán mà tôi có một số kiến thức từ lớp Vật lý dựa trên Giải tích của tôi ở trường đại học, nhưng đối với Đại số tuyến tính với Biến đổi affine và Hình học phân tích, tôi phải tự học chúng khi các phương trình, hàm, phương pháp, thuật toán nhất định và khái niệm là cần thiết. Sau đó, tôi đã phải học cách dịch những mã đó thành mã hiệu quả, dễ đọc, đáng tin cậy, có thể sử dụng lại chung chung và không có lỗi, có thể đưa vào hàng trăm đến hàng ngàn giờ gỡ lỗi.
Đó là một hành trình kỳ diệu khi học các chủ đề và thuật toán bao gồm quản lý bộ nhớ, đếm tham chiếu, khởi động, đệ quy và nhiều hơn nữa được sử dụng trong nhiều nếu không phải là tất cả các thành phần của một công cụ trò chơi nơi chúng rộng lớn. Tôi có thể liệt kê tất cả chúng ở đây nhưng đó sẽ là thông tin đủ để điền vào 3 hoặc 4 khoảng trống câu trả lời. Tuy nhiên, tôi sẽ bao gồm danh sách các chủ đề chung chứ không phải chủ đề phụ của chúng.
Dưới đây là các chủ đề hoặc danh sách chủ đề bao gồm một công cụ trò chơi đầy đủ chức năng bao gồm tất cả các kỹ thuật rending khác nhau, thiết lập các đường ống kết xuất và đổ bóng, kỹ thuật tạo bóng và ánh sáng thông qua các shader, xử lý trước và sau, bộ đệm khung, bộ đệm trở lại , tải hình ảnh, tải âm thanh và mô hình và phân tích cú pháp, tạo các hình dạng nguyên thủy với các thuộc tính vật liệu màu, kết cấu và tọa độ bình thường với ánh xạ kết cấu thủ công, biến đổi đối tượng, loại máy ảnh, phân cấp biểu đồ cảnh, lớp quản lý cho kết cấu, âm thanh, phông chữ và bóng và quản lý bộ nhớ, hệ thống ghi nhật ký với xử lý ngoại lệ, kỹ thuật lập trình đa luồng và song song, mạng, động cơ vật lý, phát hiện va chạm, máy tạo hạt, hoạt hình, trò chơi AI, tạo địa hình, hộp trời và vòm trời, kết xuất nước,tán lá và hơn thế nữa ..., GUI có phông chữ kết cấu để hiển thị văn bản, lớp phủ HUD, hàng tồn kho, bản đồ và tạo macro, hệ thống trạng thái và máy trạng thái, và cuối cùng viết một trình phân tích cú pháp để tạo ngôn ngữ kịch bản lệnh của riêng bạn để tự động hóa nhiều đối tượng này khả năng thay đổi giá trị dữ liệu trong công cụ mà không phải biên dịch lại chỉ bằng cách tải các tệp dữ liệu để điền vào các đối tượng và cấu trúc dữ liệu trong các thùng chứa tương ứng của chúng khi khởi động ứng dụng.và cuối cùng viết một trình phân tích cú pháp để tạo ngôn ngữ kịch bản lệnh của riêng bạn để tự động hóa phần lớn các đối tượng này để có khả năng thay đổi giá trị dữ liệu trong công cụ mà không phải biên dịch lại chỉ bằng cách tải vào các tệp dữ liệu để đưa vào các đối tượng và cấu trúc dữ liệu trong các thùng chứa tương ứng của chúng lúc khởi động ứng dụng.và cuối cùng viết một trình phân tích cú pháp để tạo ngôn ngữ kịch bản lệnh của riêng bạn để tự động hóa phần lớn các đối tượng này để có khả năng thay đổi giá trị dữ liệu trong công cụ mà không phải biên dịch lại chỉ bằng cách tải vào các tệp dữ liệu để đưa vào các đối tượng và cấu trúc dữ liệu trong các thùng chứa tương ứng của chúng lúc khởi động ứng dụng.
Trong suốt những năm qua và tôi đã tò mò muốn học ngôn ngữ lắp ráp, từ họ tôi muốn tìm hiểu về trình biên dịch, trình biên dịch và hệ điều hành đơn giản, ý tôi là hoạt động bên trong của chúng, cách chúng được xây dựng và thiết kế.
Thời gian trôi đi và sau đó tôi bước một chút và bắt đầu học mô phỏng phần cứng. Tôi đặc biệt tập trung vào NES nhưng muốn tìm hiểu mô phỏng phần cứng của CPU nói chung. Điều này dẫn tôi đến việc tìm hiểu về tập lệnh mà tôi đã biết về khái niệm này và nó như thế nào khi tôi đã quen thuộc với gia đình x86 của Intel ở một mức độ nào đó, nhưng bây giờ tôi phải học Bộ hướng dẫn 6502.
Tuy nhiên, bằng cách nghiên cứu sâu về vấn đề này, tôi đã kết thúc việc nghiên cứu thêm và bắt đầu tìm hiểu về Kiến trúc tập lệnh từ góc độ Kỹ thuật. Điều này khiến tôi tìm hiểu về cách CPU được xây dựng từ các cổng logic và cách các cổng logic được xây dựng từ các bóng bán dẫn cùng với các thành phần điện khác nhau. Vì vậy, tôi đã kết thúc việc học về điều này từ hai quan điểm từ trên xuống và từ dưới lên. Cả hai phương pháp đều rất hiệu quả và tôi nghĩ rằng học hỏi từ cả hai sẽ giúp xây dựng cầu nối hoặc khoảng cách nơi phần mềm xử lý phần cứng.
Từ điều này, tôi phải làm mới về Đại số Boolean của mình và cuối cùng tôi đã tìm hiểu về K-Maps, Bảng hàm ý, Máy trạng thái cả Mealy và Moore và nhiều thứ khác liên quan đến Logic nhị phân và Số học với Cổng logic vật lý và Mạch tích hợp. Và điều này đưa tôi đến quá khứ bực bội nơi tôi bắt đầu làm việc với Logisim và bắt đầu học HDL, VHDL, Verilog, v.v.
Tôi đã học tất cả những điều này vào thời gian rảnh rỗi khi tôi có thể trong suốt 15 - 18 năm qua.
Dưới đây là một số trang web và liên kết đã hướng dẫn tôi trong suốt những năm qua. Nhiều trong số này gần đây vì nhiều trang web ban đầu tôi học được từ khi không còn tồn tại, tôi đã mất các liên kết của họ và không nhớ, hoặc các công cụ tìm kiếm đã đẩy họ ra phía sau danh sách tìm kiếm của họ ...
Ngôn ngữ - C ++
Hướng dẫn đồ họa 3D và trang web tài nguyên
Các loạt và kênh Youtube này bao gồm các chủ đề ở trên cũng như phần cứng, máy tính và kỹ thuật điện. Có quá nhiều thứ để liệt kê nên tôi sẽ liệt kê một vài trong số chúng ở đây mà tôi thấy hữu ích và tháo vát nhất. Tôi sẽ không cung cấp các liên kết nhưng bạn có thể tìm kiếm youtube cho các kênh này.
- 3Blue1Brown - Toán cao cấp
- Bisqwit - Lập trình C / C ++ nâng cao (Dự án ứng dụng) - Trình giả lập phần cứng NES
- Jason Turner - Kỹ thuật lập trình C ++ hiện đại tiên tiến
- javidx9 - Lập trình C / C ++ nâng cao (Dự án ứng dụng) - Trình giả lập phần cứng NES / Một số hội
- MIT OpenC thảo - Khóa học đại học về toán học và khoa học máy tính
- Các khóa học trực tuyến của Bilkent - Các khóa học đại học về Khoa học máy tính và Kỹ thuật máy tính (Thiết kế CPU MIPS)
- The Cherno - Các chủ đề và ứng dụng lập trình nâng cao C / C ++ - Phát triển công cụ trò chơi
- Ben Eater - Kỹ thuật phần cứng - Ứng dụng thực tế qua Breadboards
- Học viện Neso - Kỹ thuật phần cứng - Lý thuyết và khái niệm
- Socratica - Lập trình Python
- Đơn giản chỉ cần đặt - Kỹ thuật phần cứng - Lý thuyết và khái niệm
- Bitwise - C / C ++ nâng cao Thiết kế Trình biên dịch thông qua Mô phỏng phần cứng
- Bo Qian - C ++ Chủ đề trong cấu trúc dữ liệu và thuật toán.
- LineByLine - Lập trình Vulkan
- Joshua Shucker - Lập trình Vulkan
- www.MarekKnows.com - C ++, Toán học 3D và Phát triển công cụ trò chơi
Và những điều này không tính đến một số cuốn sách khác nhau mà tôi có về những chủ đề này.
-Lưu ý- Xin vui lòng không bỏ phiếu về điều này vì đây chỉ là một thông điệp cho người đọc về trải nghiệm cá nhân của riêng tôi và không có bất kỳ nỗ lực nào để trả lời hoặc tham khảo câu hỏi ban đầu. Trong vài ngày tới khi tôi có thời gian; Tôi sẽ thêm câu trả lời tiếp theo để đưa ra suy nghĩ của mình về câu hỏi của OP trong khi cung cấp các liên kết hữu ích làm tài liệu tham khảo và bộ tài nguyên và tôi sẽ cập nhật câu trả lời này để đưa vào một số liên kết tại đây và sửa đổi ghi chú này. Bây giờ đã muộn và tôi không có thời gian để đọc và chỉnh sửa những gì tôi đã viết. Tôi sẽ làm điều này khi tôi có thể ".