2017-04-26 6 views
0

私は5つの機能がアクションに多くのパラメータを効率的に渡しますか?

void OnCut(GameObject survivalObj,GameState state,GameObject 
    destroyObj,Vector3 startPos){ 
    //// 
} 

と呼ばれるが、問題は、これらの5つのスクリプトのうち、最初のスクリプトは3パラメータを必要とすることで参照するスクリプト、2番目のスクリプトは、すべてのパラメータ、休息が必要持って​​ と呼ばれるアクション・コールバックを持っていますスクリプトは一つのパラメータを必要とするの
は、そこで問題は、私は、コールバックを使用するか、私はそのうちの4つのパラメータを渡していたようそれぞれのクラス
2)いくつかのパラメータがあるの参照を使用してから手動で関数を呼び出す必要があります)
1でありますいくつかのスクリプトで有用なのは、より多くのガベージコルがあることです何か?手動でscriptsメソッドを呼び出すよりも?
私が渡した4つのパラメータのうち、2つは参照型、2つは値型です。

+0

測定し、具体的なケースを決定します。とにかく、マイクロ最適化は99%のケースで悪いです。特に、OnGameOver関数は、1秒に1000回ではなく、1回だけ発生する可能性があります。 – walther

+0

OnGameOverコールバックは毎分5回呼び出されていますが、実際には名前をOnGameOverに置き換えています。 – sagar

+0

あなたのゲームは12秒続く?なぜあなたは毎分5回OnGameOverを呼びますか?とにかく、なぜこれを最適化しようとしているのですか?あなたはどんな問題に直面していますか?もしそうなら、マイクロ最適化の代わりにそれらに集中するほうがより有益でしょう。 – walther

答えて

1

1)iは、コールバックを使用するか 関数を呼び出す各クラス

の基準を使用してから手動で関数を呼び出す必要があり、直接高速であるが、これはまったく問題にはなりません。それはそれほど大きな違いはありません。

2)いくつかのスクリプトで有用ないくつかのパラメータがあるいくつかのパラメータを持つ4つのパラメータを渡しているので、ガベージコレクションがありますか? スクリプトメソッドを手動で呼び出すよりも? 4つのパラメータi のうち2つは参照型であり、2つは値型です。

いいえ、デリゲートにさらにパラメータを渡すと、メモリ割り当てはありません。メモリが割り当てられる唯一の時間は、onCutCB変数を初期化するときです。たとえば、onCutCB = OnCut;です。そのため、onCutCBStartまたはAwake関数で一度初期化する必要があります。 onCutCBが呼び出された場合、メモリの割り当ては行われません。

メモリが割り当てかそうでない場所を確認するために、次のコードのコメントを読む:

Action<GameObject, GameState, GameObject, Vector3> onCutCB; 

void OnCut(GameObject survivalObj, GameState state, GameObject 
destroyObj, Vector3 startPos = default(Vector3)) 
{ 

} 

void Start() 
{ 
    //MEMORY IS ALLOCATION 
    onCutCB = OnCut; 
} 

void Update() 
{ 
    //NO MEMORY ALLOCATION HERE 
    onCutCB(objToUse, gameState, anotherObj, thePos); 
} 

私は、モバイルデバイス上で自分のゲームをプレイしたときもののminituesにゴマそれが正常に動作しますが、その後、いくつかの 私はオブジェクトを使用しています。 ゲームを再開するときに、私のシーンはロードされません。 インスタンス化されたgameobjectが必要だったので、プールしてください。

この問題は、ゲームが徐々に遅くなることとは関係がありません。 Update関数からコルーチンをすべてのフレームで開始し、コルーチンが終了/停止しないか、実行時間を足した何かを何度もインスタンス化しています。

すべてスクリプトがないと、問題の原因を突き止めることができません。してくださいすべてのコードで質問を編集しないでください。自分で問題を見つけて修正してください。

プロファイラーを使用してください。Windowsのから

ゴー - >プロファイラその後、ディーププロファイラを有効にし、 "録音" をクリックし、[再生]ボタンをclicl。どのスクリプトがメモリを割り当てているか、そして各関数が完了するまでにどれくらいの時間がかかります。これらを見て修正してください。

Hereは、Profilerの使い方に関する完全なUnityチュートリアルです。

+0

はい、私はプロファイラを使用していますが、プロファイラでは私のCPU時間が30%を超えることはありません。10-15分のようなゲームをうまくいきますが、問題は後でそれもモバイルデバイス上で発生します。 Unityエディタでは20分も遅れていません(モバイルiはNexus 5です)。そして、私はそれを知らなかったコールバックのmemorry割り当てのおかげで – sagar

関連する問題