11

Unity3D Profilerは私に、ほとんどガベージコレクションに関するスパイクを与えます。下のスクリーンショットでは、3つの赤いスパイクがゲームプレイにあった3つの屋台を表しています。これらのストールはそれぞれ100 + msで、ほとんどの時間はTrackDependenciesに費やされました。これは助けにはならなかったUnity3D:ガベージコレクションを最適化する

if (Time.frameCount % 30 == 0) 
{ 
    System.GC.Collect(); 
} 

Unity instructionによると、私は自分のコードにこれを追加してみました。私はまだスパイクがあり、彼らはまだ100 + msを取る。正確には何が起きていますか、私のゲームを最適化するために何ができますか?

PS:

私は動的に作成し、自分のゲームでGameObject秒の多くを破壊しています。それが問題なのでしょうか?

戻り値としてループまたは配列内に文字列連結がありません。これは、the postで囲まれています。

profiler

+0

コードのどこかでオブジェクトを破棄していますか? – Heisenbug

+0

可能であれば、過度の破壊を避けるためにオブジェクトをプールすることは良い解決策になります。 – SlxS

+0

@Heisenbugはい私はゲームで多くのオブジェクトを動的に作成して破壊しています。私のdestroyオブジェクト関数では、私は 'Resources.UnloadUnusedAssets();' – CherryQu

答えて

12

これは助けにはなりませんでした。私はまだスパイクがあり、彼らはまだ100 + msを取る。 は何をしているのですか?ゲームを最適化するために何ができますか?

System.GC.Collectでは、単にガベージコレクションを強制しています。最後の収集から割り当てを解除するために大量のメモリを割り当てた場合、スパイクを避けることはできません。これは、大量の割り当て解除を避けるために、時間の経過とともにガベージコレクションを配布しようとする場合にのみ便利です。

私は ゲームで多くのゲームオブジェクトを動的に作成して破壊しています。それが問題なのでしょうか?

これはおそらく問題である可能性があります。

いくつかのヒント:

  • は、あなたのアプリケーションの開始時(LoadResourceInstantiate)あなたのリソースのできるだけ多くを割り当てるようにしてください。必要なメモリがあまり多くない場合は、必要なすべてのリソースをインスタンス化し、オンデマンドでそれらを無効/有効にするだけです。リソースのメモリ要件が大きい場合、これは達成できません。
  • InstantiateDestroyへの通話は避けてください。 オブジェクトのプールを作成します。ここでは、アプリケーションの起動時に一連のリソースがインスタンス化されます。必要なリソースを有効にし、残りのすべてを無効にします。オブジェクトを破棄するのではなく、プールに解放して、要求に応じて無効にして再有効化することができます。
  • Resources.UnloadUnusedAssetsへの通話は避けてください。これにより、以前にリリースした新しいリソースをインスタンス化するために必要な時間が増加するだけです。メモリ使用量をopitmizeするのは便利ですが、コストのかかる間隔で呼び出すか、オブジェクトを破棄するたびに呼び出すことは意味がありません。