Geçenlerde bu Q / A ile karşılaştım ve yaklaşık bir yıl önce bu yolda seyahat etmeye başladığımda; Bu konuyla ilgili kendi sorularım için çok iyi bir kaynak ve referans sayfası olarak bulurdum.
Bölüm 1:
-Preface-
Biraz kendim hakkında:
Hala ilkokuldayken 80'li yılların ortalarından sonlarına kadar, 50'lerden 80'lere kadar olan ve devre kartlarına bakacak ve her zaman nasıl yapıldığını bilmek isteyen önemsiz stereolar, VCR ve diğer elektron cihazlarını parçalara ayırırım iş ... Yayın sinyalini nasıl elde ettiler, ses, video üretiyorlardı, bunu yapıyorlardı ve böyle ... Bir direnç, kondansatör, diyot ve transistör gibi orada ayrı parçaları tanıyabiliyordum, ama olmadı ne kadar genç yaşta ne yaptıklarını veya nasıl çalıştıklarını bilir
Yıllar boyunca her zaman Matematik, Fizik ve Kimya alanlarında olağanüstü oldum. Matematiği yüksek derecede anladım ve ortaokulumdan ve daha sonra gelen lise günlerimden bazı basit veya temel devreleri bile okuyabiliyordum, ancak mantık kapıları ve nasıl inşa edildiklerini öğrenmek için hiç yapmadım ... Lisede Boole Cebiri'ni Mantık, Olasılık ve İstatistik Onur sınıfımdan öğreniyorum. Tüm matematik ve fen derslerim onur dersleriydi. Bir üniversite yüksekokulunda ikinci döneme kadar Matematik almadım. Cebir Koleji'ni test ettim ve tazeleme kursu olarak Trigonometri aldım. Sınıftan en yüksek matematik seviyem tek değişkenli Matematik II.
3 ya da 4 yaşımdan beri video oyunları oynuyorum. Çocukken Atari, NES, Sega Genesis ve PS1 vardı. Yaşlandıkça ve geç gençlerime ve 20'lerin başlarına geldiğimde PS2 ve SNES'i tercih edilen başlıklarla edindim. Bu aynı zamanda Doom'a kadar uzanan PC oyunlarını da hesaba katmıyor!
Her zaman hevesli bir Konsol ve PC oyuncusu oldum ve bu langırt ve arcade oyunları içermiyor.
90'ların başında Noel için yaklaşık 12 yaşındayken ilk bilgisayarımı aldım. DOS 6.0 ve Win 3.11 veya OS / 2 günleri. O zamandan beri "Windows" işletim sistemleri ailesini her zaman tanıyordum ve sahip olduğum tüm sistemler Intel Mimarisiydi. Okuldan veya üniversiteden Apple veya Mac ile sınırlı deneyimim oldu, ancak Linux sistemlerinde çalışma ayrıcalığım olmadı. Cygwin'im var ve bash öğrenmeye elimi denedim, ancak Dos veya Komut İstemi sözdizimine çok alışkınım.
90'lı yılların başında PC-World'ün bir kopyasını alırdım ve kod parçacıklarını QBasic'e çok iyi bilmiyordum ve bu programların çalışmasını sağlamaya çalışırdım. Başarılı olan tek kişi, ana tuş sırasına basılan tuşlara farklı zil sesi tonlarını dönüştüren bir programdı. Cep telefonundaki zil seslerini kastetmiyorum, tuşu basılı tuttuğunuz sürece sürekli bir frekans demek istiyorum.
Bir bilgisayarın nasıl programlanacağını öğrenmek için elektronik cihazların sadece dijital ve mantıksal düzeyde devre içinde nasıl çalıştığını bilmek istemem her zaman bir tutkum oldu, ama her zaman kendi videomu yapmak istedim oyunlar. 90'ların başında bile Frogger ve Tetris oyunlarını yapmak istedim ...
Bu, Bilgisayar Bilimi alanındaki en zorlu programlama veya yazılım geliştirme türlerinden biriyle başa çıkma motivasyonum ve arzum oldu ve bu da 3D Oyun Motoru Tasarımı. Bilgisayar Bilimi'nde aynı derecede zor olan başka alanlar da vardır, ancak her bir karmaşık oyun motoru tipik olarak veya genellikle hemen hemen tümünü içerir, çünkü tek tek bileşenler veya alt motorlar tekniklerini veya özelliklerini gerektirir.
Lise günlerimden programlama konusunda biraz geçmişim vardı, ancak bu korkunç Visual Basic ile sınırlıydı. 1999 yılında liseden mezun olduktan birkaç yıl sonrasına kadar 2002 - 2003 yıllarında C / C ++ öğrenmeye ve öğrenmeye başladım. Bu güne kadar Bilgisayar Bilimi veya Bilgisayar Mühendisliği'nde herhangi bir üniversite sınıf deneyimim yok, ancak özveri ve kararlılık, bilgisayar, donanım, programlama, algoritma vb. söz konusu olduğunda hemen hemen her konsepti öğrendim ve hala elimden geldiğince öğrenmeye devam ediyorum ...
C / C ++ öğrenmenin ilk günlerinde internete erişebildim, ancak internet daha erken aşamalarındaydı, Amazon, Youtube, Facebook gibi web siteleri henüz mevcut değildi, hala 56k günüydü. İkinci bir özel hattınız yoksa, telefon hattınızı düzenleyen modemleri arayın. Bir görüntünün ekranda görüntülenmesi birkaç dakika sürer, sürekli video oynatmayı dikkate almayın.
C ++ 'da nasıl programlanacağını araştırmaya ve öğrenmeye geldiğinde, kaynaklar sınırlıydı ve çoğu metin biçimindeydi. Projeleri internet eğitiminin ilk günlerinden itibaren ele almaya çalışırken, bu projelerin birçoğu tam olarak tamamlanmadı, yazarlar ya profesyonel ya da üniversite öğrencileriydi ve okuyucunun derleme gibi gerekli kavramların çoğuna aşina olduğu konusunda birçok varsayımda bulundular. , bağlama ve hata ayıklama ve kütüphane entegrasyonu.
Bu konular hakkında hiçbir şey bilmeyen biri için kayboldular çünkü neyin yanlış gittiğini, nasıl düzeltileceğini ve düzgün çalışmasını nasıl sağlayacağını bilmiyorlar. Çok sınırlı kaynaklara sahip o günlerde saatler süren deneme yanılma aldı. Şimdi bu web sitesiyle yapabileceğimiz gibi yardım istemek veya cppreference'de bulabileceğiniz ayrıntılı açıklamalar bulmak mümkün değildi! Şahsen kimseyi tanımıyorsanız, yardım için başvurabileceğiniz çok fazla şey yoktu!
Zaman geçtikçe burada ve orada bazı bilgilerimi geliştirdim ve sonunda internet DSL'e dönüştü ve şimdi Yüksek Hızlı internet, web siteleri daha etkileşimli hale geldi, videolar gösterilmeye başladı, videoların kalitesi zamanla daha iyi hale geldi, siteler Youtube ortaya çıkmaya başladı ve araştırma tarafında işler biraz daha kolaylaştı. Giderek daha fazla öğretici hazır hale geldi, bazıları iyi ve yararlıydı, bazıları kötü uygulamalar öğretti ...
Ayrıca geliştirme için gerekli araçları bulmak ve edinmek için çok zaman harcadım. Dil sözdizimini, derleyici ve derleme işlemini, bağlamayı, kurmayı ve hata ayıklamayı öğrenmek zorunda kaldım. Sonra orada bulunan farklı kütüphaneler ve API'ler ve bu bağımlılıkları birbirine bağlamak için projelerimi veya çözümlerimi nasıl yapılandıracağımı öğrenmek zorunda kaldım.
Yıllar içinde C ++ dilinin zaman içinde gelişmesini, gelişmesini ve uyum sağlamasını izledim. Başlangıçta yıllarca neredeyse aynı kaldı, ancak son 10 yılda kuruluşundan bu yana bu kısa sürede önemli ölçüde değişti.
Tüm bunlardan bahsediyorum çünkü C ++, çok yönlülüğü, gücü, zengin özellik seti ve kendinizi ayağa vurmanıza izin verme yeteneği nedeniyle tamamen ustalaşmak için en zor dillerden biridir! Ve tüm uyarılarıyla bile, bu tür geliştirme için bir standart olarak en önde gelen endüstride kullanılan en güçlü ve tercih edilen dillerden biridir, çünkü doğru bir şekilde yapıldığında hızlı, özlü, güvenilir ve en küçük ayak izi.
O zamandan beri 3D Grafik Programlama ve Oyun Motoru Tasarımı öğrenmeye odaklanmak niyetiyle C / C ++ 'da uzun yıllar kendi kendime öğretildim. 100'lü ila 1000 saatlik arama, araştırma ve çok daha fazlasını bu bilgiyi yararlı çalışma ürünleri ve uygulamalarının tasarımına okuma, öğrenme ve uygulama içine koydum. Beceri setlerimi ve zanaatımı geliştirmek için her zaman daha fazla bilgi edinmek isteme ve arzum vardı.
Bu ilk aşamaydı, daha sonra C / C ++ ve hatta C # 'da yaptığım DirectX 9.c ile okumaya ve çalışmaya başlamıştım. Sonra DirectX 10 ve Legacy OpenGL 1.0'a geçtim. DirectX 11 ve OpenGL 3.x - 4.x'ten geldi ve şimdi Vulkan'da elimi denedim.
Hem metin hem de video formatlarında çeşitli çevrimiçi eğitimlerle çalışan başarılı oyun motorları oluşturdum. Matematikte güçlü bir geçmişe sahip olduğumu belirtmiştim ancak Matematik I ve II ile sınırlıydı. Kendime üniversitedeki Matematik tabanlı Fizik dersimden biraz bilgi sahibi olduğum Vector Calculus'u öğretmek zorunda kaldım, ancak Afin Dönüşümler ve Analitik Geometri ile Lineer Cebir için, bazı denklemler, fonksiyonlar, yöntemler, algoritmalar ve kavramlara ihtiyaç vardı. Sonra bunları yüzlerce ila binlerce saat hata ayıklama koyarak mümkün olduğunca genel ve hatasız verimli, okunabilir, güvenilir, yeniden kullanılabilir koda nasıl çevirmek zorunda kaldım.
Bellek yönetimi, referans sayma, örnekleme, özyineleme ve çok daha fazlasını içeren bir oyun motorunun tüm bileşenleri olmasa bile birçoğunda kullanılan konuları ve algoritmaları öğrenen muhteşem bir yolculuk oldu. Hepsini burada listeleyebildim ama 3 ya da 4 cevap alanını doldurmak için yeterli bilgi olurdu. Ancak, alt başlıklarını değil genel konuların listesini ekleyeceğim.
İşte tüm çeşitli teknikler, render ve gölgelendirici boru hatları, gölgelendiriciler aracılığıyla gölgeleme ve aydınlatma teknikleri, ön ve son işleme, çerçeve arabellekleri, arka tamponlar içeren tamamen işlevsel bir oyun motorundan oluşan konu veya konu listesi. , görüntü yükleme, ses ve model yükleme ve ayrıştırma, renkli malzeme özelliklerine sahip ilkel şekiller oluşturma, manuel doku eşleme, nesne dönüşümleri, kamera türleri, sahne grafiği hiyerarşileri, dokular için yönetici sınıfları, ses, yazı tipleri ve gölgelendiriciler ve bellek yönetimi, istisna işleme ile kayıt sistemi, çok iş parçacıklı ve paralel programlama teknikleri, ağ oluşturma, fizik motoru, çarpışma algılama, parçacık üreteci, animasyon, oyun AI, arazi üretimi, gökyüzü kutuları ve gökyüzü kubbeleri, su işleme,yeşillik ve daha fazlası ..., metin oluşturma, HUD bindirmeleri, envanterler, harita ve makro üretimi, durum sistemi ve devlet makineleri için dokulu yazı tipine sahip GUI'ler ve son olarak bu nesnelerin çoğunu otomatikleştirmek için kendi komut dosyası dilinizi oluşturmak için bir ayrıştırıcı yazma uygulama başlangıcında kendi kaplarındaki veri nesnelerini ve yapılarını doldurmak için veri dosyalarını yükleyerek yeniden derlemek zorunda kalmadan motor içindeki veri değerlerini değiştirme yeteneği.ve son olarak bu nesnelerin çoğunu otomatikleştirmek için kendi kodlama dilinizi oluşturmak üzere bir ayrıştırıcı yazarak, yalnızca ilgili nesneleri kaplarındaki veri nesnelerini ve yapılarını doldurmak için veri dosyalarını yükleyerek yeniden derlemek zorunda kalmadan motor içindeki veri değerlerini değiştirme yeteneğine sahip olmak uygulama başlangıcında.ve son olarak bu nesnelerin çoğunu otomatikleştirmek için kendi kodlama dilinizi oluşturmak üzere bir ayrıştırıcı yazarak, yalnızca ilgili nesneleri kaplarındaki veri nesnelerini ve yapılarını doldurmak için veri dosyalarını yükleyerek yeniden derlemek zorunda kalmadan motor içindeki veri değerlerini değiştirme yeteneğine sahip olmak uygulama başlangıcında.
Yıllar içinde ve dışında montaj dilini öğrenmek istemiştim, derleyiciler, montajcılar ve basit işletim sistemleri hakkında bilgi edinmek istedim, iç işleri, nasıl inşa edildikleri ve tasarlandıklarını kastediyorum.
Zaman geçtikten sonra biraz da adım attım ve donanım öykünmesini öğrenmeye başladım. Özellikle NES'e odaklandım, ancak genel olarak CPU'ların donanım öykünmesini öğrenmek istedim. Bu, beni kavramı zaten bildiğim talimat setini ve Intel'in x86 ailesine bir dereceye kadar aşina olduğum şeyi öğrenmeye götürdü, ancak şimdi 6502 Öğretim Setini öğrenmek zorunda kaldım.
Yine de bu konuya girerek daha fazla araştırma yaptım ve Komut Seti Mimarisi'ni Mühendislik perspektifinden öğrenmeye başladım. Bu, CPU'nun mantık kapılarından nasıl inşa edildiğini ve mantık kapılarının diğer çeşitli elektrikli bileşenlerle birlikte transistörlerden nasıl inşa edildiğini öğrenmemi sağladı. Bu yüzden bunu yukarıdan aşağıya doğru iki açıdan öğrenmeye başladım. Her iki yöntem de çok etkiliydi ve her ikisinden de öğrenmenin, yazılımın donanımı ettiği yerde köprü veya boşluk oluşturmaya yardımcı olduğunu düşünüyorum.
Bundan, Boole Cebirimi yenilemek zorunda kaldım ve K-Haritaları, Uygulama Tabloları, Mealy ve Moore Devlet Makineleri ve İkili Mantık ve Aritmetik ile Fiziksel Mantıksal Kapıları ve Entegre Devreleri ilişkilendiren diğer çeşitli şeyleri öğrendim. Bu da beni Logisim ile çalışmaya başladığım ve HDL, VHDL, Verilog vb.
Bunların hepsini son 15-18 yıldır yapabileceğim boş zamanlarımda öğreniyorum.
İşte yıllar boyunca bana yol gösteren bazı siteler ve bağlantılar. Bunların çoğu yakın zamanda öğrendiğim sitelerin çoğu ya artık yok, bağlantılarını kaybettim ve hatırlamıyorum ya da arama motorları onları arama listelerinin en arkasına itti ...
Diller - C ++
3D Grafik Eğiticileri ve Kaynak Web Siteleri
Youtube serileri ve kanalları , donanım, bilgisayar ve elektrik mühendisliğinin yanı sıra yukarıdaki konuları da kapsıyor. Listelenecek çok fazla var, bu yüzden burada en yararlı ve becerikli bulduğum birkaçını listeleyeceğim. Bağlantıları sağlamayacağım, ancak bu kanalları youtube'da arayabilirsiniz.
- 3Blue1Brown - İleri Matematik
- Bisqwit - Gelişmiş C / C ++ Programlama (Uygulama Projeleri) - NES Hardware Emulator
- Jason Turner - Gelişmiş Modern C ++ programlama teknikleri
- javidx9 - Gelişmiş C / C ++ Programlama (Uygulama Projeleri) - NES Donanım Emülatörü / Bazı Montajlar
- MIT OpenCourse - Matematik ve Bilgisayar Bilimi Üniversite Dersleri
- Bilkent Online Kurslar - Bilgisayar Bilimi ve Bilgisayar Mühendisliğinde Üniversite Dersleri (CPU Design MIPS)
- Cherno - Gelişmiş C / C ++ Programlama Konuları ve Uygulamaları - Game Engine Geliştirme
- Ben Eater - Donanım Mühendisliği - Breadboard'lar ile Pratik Uygulama
- Neso Academy - Donanım Mühendisliği - Teori ve Kavramlar
- Socratica - Python programlama
- Basitçe söylemek gerekirse - Donanım Mühendisliği - Teori ve Kavramlar
- Bitwise - Gelişmiş C / C ++ Donanım Öykünmesi ile Bir Montajcı Tasarlama
- Bo Qian - Veri yapıları ve algoritmalarında C ++ konuları.
- LineByLine - Vulkan Programlama
- Joshua Shucker - Vulkan Programlama
- www.MarekKnows.com - C ++, 3D Matematik ve Oyun Motoru Geliştirme
Ve bunlar bu konularla ilgili çeşitli kitaplardan bazılarını hesaba katmıyor.
-Not- Lütfen buna oy vermeyin, çünkü bu sadece kendi kişisel deneyimimin okuyucusuna bir mesajdır ve orijinal soruyu cevaplamak veya referans vermek için yapılan herhangi bir girişimden geçersizdir. Önümüzdeki birkaç gün içinde zamanım olduğunda; Referans ve kaynak seti olarak faydalı bağlantılar sağlarken OP'nin sorusu hakkındaki düşüncelerimi vermek için bir takip cevabı ekleyeceğim ve bu yanıtı buraya bazı bağlantılar eklemek ve bu notu değiştirmek için de güncelleyeceğim. Geç oldu ve şu anda yazdıklarımı düzeltmek ve düzenlemek için zamanım yok. Bunu yapabildiğim zaman yapacağım ".