Unity のよくある面接の質問の詳細な説明 (継続的に更新されます...)


 1. 宣言、定義、インスタンス化、初期化

1. まず、C/C++ での宣言と定義について説明します。

1)関数の宣言と定義から始めましょう...

一般に、最初に C++ で関数を定義し、次に Main 関数の前にその関数を宣言します。次に例を示します。

//函数声明
int Add(int);


int Main
{

}
//函数定义
int Add(int)
{
}

このステートメントは、ここに Add という関数があり、戻り値とパラメーターには int が必要であることをコンパイラーに伝えることです。

定義は、メモリ内のそのようなスペースを拡張して、関数にメモリを割り当てることです。

つまり、定義は 1 回しか定義できません。少し変更すると、この関数はそれ自体ではなくなりますが、必要なものを宣言できます。メモリがないので呼び出しはありません。同等であるだけです。空中で叫ぶ君に誰も注目しない…

2) 変数の宣言と定義についてもう一度説明します...

C++では次のように宣言、定義します。

//声明
extren int var;
typeof int INT;
struct Node;

//定义
extern int ble = 10;

したがって、宣言はメモリ空間を解放しませんが、定義はメモリ空間を占有する必要があります...

したがって、C++ では、関数と変数を定義と宣言によく使用します。

3) インスタンス化と初期化

オブジェクト指向プログラミングでは、クラスを使用してオブジェクトを作成するプロセスは通常、インスタンス化と呼ばれます。これは通常、クラスに対して使用されることに注意してください。

初期化は、宣言されたオブジェクトに値を割り当てるプロセスとして理解でき、これは定義と同等です。

2: C# での定義と宣言

        C# では実際には C++ とほぼ同じですが、C# では関数を定義した後、関数本体の上で関数を宣言せずに直接その関数を使用することができ、変数の定義や宣言についても同様です。 int a ; が定義されていない単なる宣言である場合は、 int a = 10; を使用して変数が作成されます。


2. プロパティ (Get アクセサーおよび Set) とフィールド、静的キーワード

まずは C# のメンバーを見てみましょう

 1:フィールド(フィールド)

フィールドは、オブジェクトまたは型に関連付けられた変数であり、メンバー変数とも呼ばれます

次のコードを見ると、フィールドがどのように段階的に属性になるのかがわかります。

using UnityEngine;
using System;

public class GetSetProperty : MonoBehaviour
{
    
    private void Start()
    {
        //一、未使用Get/Set属性
        Student stu1 = new();
        Student stu2 = new();
        Student stu3 = new();

        stu1.Age = 20;
        stu2.Age = 20;
        stu3.Age = 20;

        //此时如果有一个年龄被不小心修改了,比如第三个学生年龄修改成200,这种字段被污染很难发现
        int avgAge = (stu1.Age + stu2.Age + stu3.Age) / 3;
        //Debug.Log(avgAge);


        //二、使用Get/Set方法
        Student1 stu4 = new();
        Student1 stu5 = new();
        Student1 stu6 = new();

        //此时如果不小心将年龄修改成200,程序就会报错
        //可以使用try catch,程序就不会崩溃

        stu4.SetAge(20);
        stu5.SetAge(20);
        //stu6.SetAge(200);
        int avgAge1 = (stu4.GetAge() + stu5.GetAge() + stu6.GetAge())/3;
        try
        {
            stu6.SetAge(200);
            Debug.Log(avgAge1);
        }
        catch (Exception ex)
        {
            Debug.Log(ex.Message);
        }

        //三、使用Get/Set访问器
        Student2 stu7 = new Student2();
        Student2 stu8 = new Student2();
        Student2 stu9 = new Student2();

        stu7.Age = 20;
        stu8.Age = 20;
        stu8.Age = 20;
        int avgAge2 = (stu7.Age + stu8.Age + stu9.Age) / 3;

        Debug.Log(avgAge2);
    }
}
class Student
{
    public int Age;
    public int Score;
}

/// <summary>
/// 二、此时使用Get,Set函数,可以对字段进行约束
/// </summary>
class Student1
{
    private int age;
    public int GetAge()
    {
        return this.age;
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="value"></param>
    public void SetAge(int value)
    {
        if (value >= 0 && value <= 120)
        {
            this.age = value;
        }
        else
            throw new System.Exception("value has error");
    }
}

    /// <summary>
    /// 三、使用微软的Get/Set访问器
    /// </summary>
class Student2
{
        private int age;
        public int Age
        {
            get
            {
                return age;
            }
            set
            {
                if (value >= 0 && value <= 120)
                {
                    this.age = value;
                }
                else
                {
                    throw new Exception("Age value has error");
                }
            }
        }
}

最初はフィールドを使用してデータを保存しました

ただし、露出を考慮して、フィールドを制限するために Get 関数と Set 関数を導入しました。

Microsoft は Get/Set アクセサーを簡略化して Get/Set アクセサーを作成しました

PropFull は迅速なプロパティ生成に使用できます

2: 属性 (優先度)

プロパティはオブジェクトまたは型の特性にアクセスするために使用されるメンバーであり、プロパティはフィールドの自然な拡張です。

3: 属性とフィールドの関係

プロパティとフィールドは両方ともエンティティの状態を表すために使用されます

プロパティはほとんどがフィールドのラッパーです

提案: データを公開するには常に属性を使用します。つまり、フィールドは常にプライベートまたは保護されます。

4: 静的キーワード

static キーワードは、クラス定義、変数宣言、メソッド定義で使用できます。

変数の前に Static を追加すると、変数は静的変数になり、静的変数のメモリはグローバル静的領域に分散されます。これはグローバル変数であることと同等であり、Time.timescale は静的変数です。

関数の前に static を追加すると、関数は静的関数になり、クラス名 + 関数名で直接呼び出すことができます。たとえば、Debug 関数や Find 関数はすべて静的関数です。

クラス名の前に static を追加すると、クラスは静的クラスになります。静的クラスはインスタンス化する必要がなく継承できません。静的クラスのメンバーは static キーワードを付ける必要がありますが、静的関数はその必要はありません。静的クラスに存在する必要があります

一般に、ツール関数またはツールクラスは静的クラスまたは静的関数になります。


3. CPUとGPUの違い

CPUとGPUの名前から、1つはCentral Processing Unit、もう1つはGraphics Processing Unitです。

後者は画像処理専用ですが、なぜ画像処理に専用の処理ユニットを使用するのでしょうか?

GPU (グラフィックス プロセッシング ユニット) は、グラフィックス システム構造およびコンピュータとディスプレイ端末間のリンクの重要なコンポーネントです。

つまり、モニターに画像を表示するには GPU を使用する必要があります。GPU はどのように動作するのでしょうか? 以下のビデオをご覧ください。

GPU 動作原理_哔哩哔哩_bilibili

CPUとGPUの内部構造を見てみましょう

 図からわかるように、私たちの GPU には多数のコンピューティング ユニットが搭載されていますが、CPU には 4 つの単純な ALU しかなく、私の GPU には数百のコンピューティング ユニットがあります。ここでは単一ラインのコンピューティング パワーについてのみ説明します。たとえば、複雑な計算を CPU に引き渡せば、効率は特に高くなり、確実にタスクを完了できますが、グラフィックスの計算に関しては、それほど高度な計算はありませんが、いわゆる頂点計算→ラスタライズ計算テクスチャマップ→ピクセル処理→最終出力という多数のマトリックス計算変換

このような計算では、ピクセルごとに処理が行われるため、高ピクセル画面ではピクセル数が多く、ピクセルごとに多くの計算を実行する必要があるため、CPUの使用効率が非常に低くなります。今回、GPU を使用すると効率が非常に高くなりますが、次の点に注意してください。

光と影はすべて CPU で計算され、GPU は 2 つのジョブだけを持ち、1 つのポリゴンが生成されます。2 ポリゴンに色を付けます。

次のビデオでは、CPU と GPU の違いを簡単に説明しています。

CPUとGPUの動作原理の違いを示すNVIDIAのライブ画像_哔哩哔哩_bilibili

CPUとGPUの違いをわかりやすく紹介します。


4 番目、ヒープとスタックの違い

コンピュータの論理演算はCPUで行われており、CPUにはALU(算術論理演算装置)とCU(制御装置)があります。

ALUは、「And Gate」(ANDゲート)と「Or Gate」(ORゲート)で構成される算術論理演算器であり、その主な機能は2値算術演算を実行することです。

CU はプログラムのプロセス管理を担当します。コントロールユニットは工場の物流部門と同じように、CPU全体の指令と制御の中枢であり、命令レジスタIR(命令レジスタ)、命令デコーダID(命令デコーダ)、オペレーションコントローラの3つのコンポーネントで構成されています。 OC(オペレーションコントローラー)

問題は、コンピュータが計算を実行するとき、すべてのデータを CPU ではなくメモリに置き、CPU がそれを呼び出し、メモリ内のデータをレジスタに置くため、CPU は次に従って計算することです。メモリへの呼び出しを行うと、ここで話しているヒープとスタックはメモリ内の 2 つの領域です。

スタック メモリ (スタック) : スタックにはオブジェクトへの参照とオブジェクト メソッドのパラメータの値が保存され、オペレーティング システムによって自動的に割り当ておよび解放されます。

                               スタック メモリは動的割り当てと静的割り当てを組み合わせたもので、ローカルです。

                                スタッキングとポップは、カートリッジの先入れ先出し、後入れ先出しの原則に従います。

                                スタックの成長方向は下向きで、メモリアドレスは上位から下位になります。

ヒープメモリ(Heap):ヒープにはインスタンスオブジェクトの値やメンバ変数の値(属性の値)が格納されます。ヒープは開発者によって割り当てられ、解放されます。開発者が解放しない場合は、開発者によって回収されます。プログラムの最後にある OS

                                ヒープは動的に割り当てられ、グローバルです

                                ヒープは、次のようにツリーとして表示できます。 ヒープ ソート

                                ヒープの成長方向は上向きで、メモリアドレスは低位から高位にあります。


5、値型と参照型 / ボックス化とアンボックス化

値の型: C# のすべての値の型は、暗黙的に System.ValueType から派生します。値型は値を直接保存します

              byte、short、int、long、float、double、decimal、char、bool、および struct は 、値の型と総称されます。

              値の型が宣言された後は、割り当てられているかどうかに関係なく、メモリが割り当てられます。

参照型: 参照型は、型を格納する参照です。

              文字列とクラス、配列、インターフェイス、およびデリゲートは、参照型と総称されます。

               参照型が宣言された後、アドレスを保持するために小さなメモリ部分だけがスタック上に割り当てられますが、クラスのインスタンスが new、space を使用して作成されるとき、この時点ではヒープ上のメモリ領域は割り当てられません。ヒープ上に割り当てられます。

ボックス化とボックス化解除:

値の型と参照型がわかったら、次のような 2 つの型の間で変換する必要があることが 1 つあります。

ArrayList arraylist = new ArrayList();
arraylist[0].add(1);
arraylist[1].add('a');
...

この時点で、参照型の配列リストに値の型 1 と文字の型 a を置く必要があります。すべてのデータ型の基底クラスがオブジェクトであることがわかっているので、値の型のオブジェクトを置きます。参照型のオブジェクトでは、値型をオブジェクトに変換する必要があります。この変換は暗黙的に実行されます。この時点では、上記の配列の要素 0 が参照型です。

次の段落を見てください

int a  = (int)arraylist[0];

この時点で、上記の配列の参照型を値型 int に変換しており、この時点で強力な変換を実行しています。


6. リスト/配列リスト/リスト、ディクショナリ、キュー、ハッシュ テーブル、スタック

1: List/ArrayList/Listの違いと関係

2: 辞書の使い方と例

3: キューの使用例と例

4: ハッシュテーブルの使い方と例

5:スタック(積み重ね)


7. ジェネリック医薬品


8. Unity で AB パッケージをいつどのように使用するか


9. Unity にはデータ読み込み方法がいくつありますか?


10. 光線検出、衝突検出


11. グラフィックスのレンダリング プロセスとは何ですか? 一般的なレンダリング アルゴリズムとは何ですか


12. コンテナ/イテレータ

Supongo que te gusta

Origin blog.csdn.net/leikang111/article/details/127995010
Recomendado
Clasificación