私は最近このQ / Aに出会い、約1年前にこの道を歩き始めました。これは、私自身の関連する質問に関して、非常に優れたリソースおよびリファレンスページであることがわかりました。
パート1:-
はじめに-
私自身について少し:
私がまだ小学校にいた80年代半ばから後半にかけて、50年代から80年代までのジャンクステレオ、VCR、およびその他の電子デバイスを分解し、回路基板を見て、どのようにそれらが行われたかを常に知りたいと考えていました仕事...彼らはどのようにして実際に放送信号を取得し、オーディオ、ビデオを生成し、これを行いましたか...彼らがそのような若い年齢で何をしたか、どのように機能したかを知ってください。
長年にわたり、私は数学、物理学、化学の分野で常に例外的でした。私は数学を高度に理解し、中学や高校時代の簡単なまたは基本的な回路を読むことさえできましたが、論理ゲートとその構築方法について学ぶことはできませんでした...しかし、私はしました高校の論理代数、確率、統計学の名誉クラスからブール代数を学びます。私の数学と科学の授業はすべて優等授業でした。コミュニティカレッジの2学期までは、Calculusを受講しませんでした。私は大学代数をテストし、三角法を復習コースとして取りました。教室での私の最高レベルの数学は、単一変数の微積分IIです。
私は3歳か4歳の頃からビデオゲームをしていました。子供の頃、私はアタリ、NES、セガジェネシス、PS1を持っていました。年を取り、10代後半から20代前半になって、PS2とSNESを好みのタイトルで取得しました。これは、Doom!にまで遡るPCゲームも考慮していません。
私は常に熱心なコンソールおよびPCゲーマーであり、これにはピンボールゲームやアーケードゲームは含まれません。
90年代初頭のクリスマスに12歳だったときに、最初のPCを受け取りました。DOS 6.0およびWin 3.11またはOS / 2の時代。それ以来、私は常に「Windows」ファミリのオペレーティングシステムに精通しており、私が持っていたシステムはすべてIntelアーキテクチャでした。学校や大学のAppleやMacでの経験は限られていますが、Linuxシステムで作業する特権はありませんでした。私にはCygwinがあり、bashの学習に挑戦しましたが、Dosやコマンドプロンプトの構文には非常に慣れています。
90年代前半には、PC-Worldを1つか2つ手に入れ、よく知らないQBasicにコードスニペットを入力し、それらのプログラムを機能させようとしました。唯一成功したのは、ホームキーのキーを押して別の着信音にするプログラムです。携帯電話の着信音を意味するのではなく、キーを押し続けている限り連続した周波数を意味します。
電子機器がデジタルおよび論理レベルで回路内でどのように機能したかを知りたいだけでなく、コンピューターのプログラミング方法を学びたいだけでなく、自分のビデオを作りたいという欲求が常にありました。ゲーム。90年代前半にも、フロッガーとテトリスのゲームを作りたかったのですが...
これが、コンピューターサイエンスの分野で最もタフなプログラミングまたはソフトウェア開発の1つ、つまり3Dゲームエンジンデザインに取り組む私の主な動機と欲求になりました。コンピューターサイエンスには他にも厳しい分野がありますが、個々のコンポーネントやサブエンジンがその技術や特性を必要とするため、洗練されたゲームエンジンには通常またはほとんどすべてが含まれます。
私は高校時代からプログラミングの経験がありましたが、これは恐ろしいVisual Basicに限定されていました。私は、1999年に高校を卒業してから数年後まで、2002年から2003年頃にC / C ++を習得し始めました。献身と決意、私はコンピュータ、ハードウェア、プログラミング、アルゴリズムなどに関してはあらゆる概念について学びましたが、私はできる限り多くを学び続けています...
C / C ++を習得した初期の頃は、インターネットにアクセスできましたが、インターネットは初期段階にあり、Amazon、Youtube、FacebookなどのWebサイトはまだ存在していませんでした。 2番目の専用回線がない場合、電話回線を使い切るモデムをダイヤルアップします。画像が画面にレンダリングされるのに数分しかかかりません。連続したビデオ再生を気にしないでください。
そのため、C ++でのプログラミング方法の調査と学習に関しては、リソースは限られており、ほとんどはテキスト形式でした。初期のインターネットチュートリアルの日からプロジェクトに取り組もうとしたとき、それらのプロジェクトの多くは完全に完成していませんでした。 、リンクおよびデバッグ、ライブラリ統合。
それらのトピックについて何も知らない人にとっては、何が間違っていたのか、それを修正する方法、それを適切に機能させる方法がわからないため、彼らは途方に暮れています。当時、リソースが非常に限られていたため、試行錯誤に何時間もかかりました。このウェブサイトでできるように助けを求めたり、cppreferenceで見つけることができる詳細な説明を探したりすることはできませんでした!あなたが個人的に誰も知らなかった場合、あなたは援助のために頼ることができるほど多くはありませんでした!
時間が経つにつれて、私はどこかで私の知識の一部を改善し、最終的にインターネットはDSLに改善されました。 Youtubeが現れ始め、研究面で物事が少し楽になったように。ますます多くのチュートリアルがすぐに利用できるようになりました。他の人が悪い習慣を教えたのに対して、いくつかは良いと便利でした...
また、開発に必要なツールを見つけて入手するのに多くの時間を費やしていました。言語の構文、コンパイラ、コンパイルプロセス、リンク、構築、デバッグを学ぶ必要がありました。次に、利用可能なさまざまなライブラリとAPI、およびそれらの依存関係をすべてリンクするようにプロジェクトまたはソリューションを構成する方法について学習する必要がありました。
長年にわたって、私はC ++言語が時間とともに成長、進化、適応するのを見てきました。当初は何年もほぼ同じでしたが、過去10年間で、この短い期間内で開始以来劇的に変化しました。
C ++は、その汎用性、パワー、豊富な機能セット、そして自分自身を撃つことができるため、完全に習得するのが最も難しい言語の1つであるため、このすべてに言及します!また、すべての注意事項がありますが、それはこのタイプの開発の標準としてトップクラスの業界で使用されている最も強力で優先される言語の1つです。正しく実行されると、高速、簡潔、信頼性が高く、最小のフットプリント。
それ以来、3Dグラフィックスプログラミングとゲームエンジンデザインの学習に重点を置いて、C / C ++で長年独学で学びました。私は、その知識を読み、学習し、有用な実用的な製品とアプリケーションの設計に適用するために、数百から数千時間の検索、研究、その他多くを費やしました。私は自分のスキルセットとクラフトを改善するためにもっと学びたいという意志と希望を常に持っていました。
これが最初の段階でした。その後、最初にDirectX 9.cを読み、作業を開始しました。これは、C / C ++およびC#でも行いました。次に、DirectX 10とLegacy OpenGL 1.0に移行しました。DirectX 11とOpenGL 3.x-4.xが登場し、今ではVulkanで手を試しました。
私は、テキスト形式とビデオ形式の両方のさまざまなオンラインチュートリアルを使用して、成功するゲームエンジンを構築しました。私はすでに数学の強いバックグラウンドを持っていると述べましたが、それは微積分IとIIに限定されていました。私は大学で私の微積分ベースの物理学のクラスからいくつかの知識を持っていたベクトル計算を自分自身に教えなければなりませんでしたが、アフィン変換と解析幾何を持つ線形代数に関しては、特定の方程式、関数、方法、アルゴリズム、コンセプトが必要でした。それから、それらを効率的で読みやすく、信頼性が高く、再利用可能なコードに変換する方法を学ばなければなりませんでした。
これは、メモリ管理、参照カウント、インスタンス化、再帰など、ゲームエンジンのすべてではないにしても多くのコンポーネントで使用されるトピックやアルゴリズムを学ぶ素晴らしい旅でした。ここにすべてをリストできますが、それは3または4の回答スペースを記入するのに十分な情報です。ただし、サブトピックではなく、一般的なトピックのリストを含めます。
さまざまなレンダリングテクニック、レンダリングとシェーダーパイプラインの設定、シェーダーによるシェーディングとライティングテクニック、前処理と後処理、フレームバッファー、バックバッファーを含む、完全に機能するゲームエンジンで構成されるトピックまたはサブジェクトリストを以下に示します。 、画像の読み込み、音声とモデルの読み込みと解析、色の素材プロパティを持つプリミティブシェイプの作成、手動のテクスチャマッピングによるテクスチャと通常の座標、オブジェクト変換、カメラタイプ、シーングラフ階層、テクスチャのマネージャクラス、音声、フォント、およびシェーダとメモリ管理、例外処理を備えたロギングシステム、マルチスレッドおよび並列プログラミング技術、ネットワーキング、物理エンジン、衝突検出、パーティクルジェネレータ、アニメーション、ゲームAI、地形生成、スカイボックスとスカイドーム、ウォーターレンダリング、葉など...、テキストレンダリング用のテクスチャフォント、HUDオーバーレイ、インベントリ、マップおよびマクロ生成、状態システムおよび状態マシンを備えたGUI、および最終的にこれらのオブジェクトの多くを自動化する独自のスクリプト言語を作成するパーサーの作成データファイルを読み込んで、アプリケーションの起動時にそれぞれのコンテナ内のデータオブジェクトと構造を読み込むだけで、再コンパイルすることなく、エンジン内のデータ値を変更できます。最後に、パーサーを作成して独自のスクリプト言語を作成し、これらのオブジェクトの多くを自動化して、それぞれのコンテナー内のデータオブジェクトと構造にデータファイルを読み込むだけで再コンパイルすることなく、エンジン内のデータ値を変更できるようにしますアプリケーションの起動時。最後に、パーサーを作成して独自のスクリプト言語を作成し、これらのオブジェクトの多くを自動化して、それぞれのコンテナー内のデータオブジェクトと構造にデータファイルを読み込むだけで再コンパイルすることなく、エンジン内のデータ値を変更できるようにしますアプリケーションの起動時。
何年もの間、コンパイラー、アセンブラー、および単純なオペレーティングシステムについて学びたいと思っていたアセンブリ言語を学びたいと思っていました。
時間が経ち、私は少し歩み寄り、ハードウェアエミュレーションの学習を始めました。私は特にNESに焦点を合わせましたが、一般的なCPUのハードウェアエミュレーションを学びたいと思いました。これにより、Intelのx86ファミリにある程度精通しているため、コンセプトをすでに知っている命令セットについて学習することになりましたが、6502命令セットを学習する必要がありました。
しかし、これに飛び込むことで、私は結局より多くの研究をすることになり、エンジニアリングの観点から命令セットアーキテクチャについて学び始めました。これにより、CPUが論理ゲートからどのように構築されるか、および論理ゲートが他のさまざまな電気コンポーネントとともにトランジスターからどのように構築されるかについて学習しました。だから私は、トップダウンとボトムアップの2つの視点からこのことを学びました。両方の方法は非常に効果的であり、両方から学ぶことは、ソフトウェアがハードウェアに食い込むブリッジまたはギャップを構築するのに役立つと思います。
これから、ブール代数をリフレッシュしなければならなくなり、K-Map、含意表、ミーリーとムーアの両方のステートマシン、およびバイナリロジックと算術を物理論理ゲートと集積回路に関連付けるさまざまなものについて学習しました。そして、これは私がLogisimで働き始め、HDL、VHDL、Verilogなどを学び始めた過去に私をもたらします...
私は、過去15〜18年間を通してできる限り、暇なときにこれらすべてを学んでいます。
ここに、長年にわたって私を導いてくれたサイトとリンクの一部を示します。これらの多くは、私が最初に学んだサイトの多くがもはや存在しないか、リンクを失って覚えていないか、検索エンジンが検索リストのはるか後ろにそれらを押し込んだため、最近のものです...
そしてこれらは、これらのトピックに関して私が持っているさまざまな本のいくつかを考慮していません。
-注-これは、私自身の個人的な経験の読者へのメッセージに過ぎず、元の質問に答えたり参照したりする試みがないため、投票しないでください。次の数日間は時間があります。参照とリソースのセットとして有用なリンクを提供しながら、OPの質問についての考えを示すためにフォローアップの回答を追加します。ここにいくつかのリンクを含め、このメモを変更するためにこの回答を更新します。遅れており、現在、すでに書いたものを校正して編集する時間はありません。できるときにこれを行います」。