実際には、ローカル変数からint
を使用すると、while
というループは、グローバルとして宣言されたint
を使用するよりも高速です。
* を一度と宣言して再利用するか、自分の言葉でUnity *の変数をリサイクルまたは再利用する場合の例。
配列:
関数は配列が含まれており、その機能は、多くの場合、呼び出された場合。
void functionCalledVeryOften()
{
float[] playerLives = new float[5]; //This is bad because it allocates memory each time it is called
for (int i = 0; i < playerLives.Length; i++)
{
playerLives[i] = UnityEngine.Random.Range(0f,5f);
}
}
これはメモリを毎回割り当てるため、配列全体をグローバルにして関数外で一度初期化することで解決できます。新しいオブジェクトの作成
がリソースを取り、モバイルデバイス上の問題を引き起こす可能性があります:あなたは0
float[] playerLives = new float[5];
void functionCalledVeryOften()
{
for (int i = 0; i < playerLives.Length; i++)
{
playerLives[i] = UnityEngine.Random.Range(0f,5f);
}
}
作成新しいオブジェクトに配列内のデータをリセットし、簡単な関数を作成することができます。これはあなたがこれを何回行うかによって異なります。
以下のコードはGameObject(箇条書き)を作成し、Rigidbody
を添付して撮影します。これはスペースバーが押されている間にすべてのフレームで発生し、最終的には弾丸秒を破棄します。それは毎回新しいゲームオブジェクトが作成されたメモリを割り当て、ゲームオブジェクトが破棄されるとき、それはまた、ガベージコレクタをトリガするよう
void functionCalledVeryOften()
{
if (Input.GetKey(KeyCode.Space))
{
//Create new Bullet each time
GameObject myObject = new GameObject("bullet");
Rigidbody bullet = myObject.AddComponent<Rigidbody>() as Rigidbody;
//Shoot Bullet
bullet.velocity = transform.forward * 50;
Destroy(myObject);
}
}
上記のコードは悪いです。これは、あなたのゲームでは、しゃっくりを遅くして、引き起こす可能性があります。
上記のコードの解決策は、オブジェクトプーリングです。あなたはここでそれについての詳細を学ぶことができます。グローバル変数と、このための簡単な修正のObject Pooling tutorial from Unity
例:
List<GameObject> reUsableBullets;
int toUseIndex = 0;
void Start()
{
intitOnce();
}
//Call this function once to create bullets
void intitOnce()
{
reUsableBullets = new List<GameObject>();
//Create 20 bullets then store the reference to a global variable for re-usal
for (int i = 0; i < 20; i++)
{
reUsableBullets[i] = new GameObject("bullet");
reUsableBullets[i].AddComponent<Rigidbody>();
reUsableBullets[i].SetActive(false);
}
}
void functionCalledVeryOften()
{
if (Input.GetKey(KeyCode.Space))
{
//Re-use old bullet
reUsableBullets[toUseIndex].SetActive(true);
Rigidbody tempRgb = reUsableBullets[toUseIndex].GetComponent<Rigidbody>();
tempRgb.velocity = transform.forward * 50;
toUseIndex++;
//reset counter
if (toUseIndex == reUsableBullets.Count - 1)
{
toUseIndex = 0;
}
}
}
をゲームが始まる前に、だから、基本的に、あなたが関数内でオブジェクトを作成し、保存しますグローバル変数の参照。その後、その参照がグローバル変数に保持されているので、関数で作成したオブジェクトを再利用します。
インスタンス化:
Instantiate関数はプレハブのコピーを作成するために使用されます。 以下のコードは、スペースバーが押されている間に弾丸をインスタンス化し、フレームごとに射撃し、最後にそれを破壊します。10
秒。それは弾丸プレハブとどのくらいの子供のゲームオブジェクトがその下にあるに装着されているどのように多くの要素に依存するメモリを割り当てるよう
public GameObject bulletPrefab;
void functionCalledVeryOften()
{
if (Input.GetKey(KeyCode.Space))
{
//Create new Bullet each time
Rigidbody bullet = Instantiate(bulletPrefab, new Vector3(0, 0, 0), Quaternion.identity) as Rigidbody;
//Shoot Bullet
bullet.velocity = transform.forward * 50;
Destroy(myObject,10f);
}
}
上記のコードは悪いです。このソリューションは、オブジェクトプールも使用しています。関数内のGameObjectをインスタンス化し、参照をグローバル変数に格納してから、それらを再利用します。ソリューションは上記のソリューションと同じです。
結論として、質問のサンプルコードはこのを適用しません。
Unityのメモリ管理の詳細については、hereを参照してください。
「値の種類のリサイクル」はありません。フィールドとローカル変数を使用しているだけです。 *変数*は通常、この意味では「リサイクル」されません。通常は、プールされた/リサイクルされる*オブジェクト*です(配分を最小限に抑えるために、やりとりやリソース管理のオーバーヘッドを最小限に抑えるため)。 – user2864740
スタックメモリを節約できます。 –
私は完全に "セーブズ"が正しい言葉であるとは確信していません。 – user2864740