2016-07-04 6 views
0

私のゲームでは、スクリプトを使ってボールの投球角度と投球角度を増減しようとしています。 すべてがうまくいきますが、ラグはありませんが、最初にボタンをクリックしてパワーを上げると巨大なスパイクが入ります私のプロファイラは、私が二度目のクリックしたときに、その後そこここには巨大なスパイク
ではありませんここに私のコードなぜ初めてのボタンをクリックしたときにプロファイラにスパイクがありますか?

void FixedUpdate() { 
    aimAngle.z = increaseAngle; 
    aim.transform.eulerAngles = aimAngle; 

    if (Input.GetButton ("Fire1")) { 
     IncreaseDecreaseAngleOfAimOrPower(); 
    } 
    if (Mathf.Abs(rigidBody.velocity.x) <= 0.8f && Mathf.Abs(rigidBody.velocity.x) > 0 && rigidBody.velocity.y <=0.0f) { 
     rigidBody.angularDrag = 5.0f; 
    } 

} 

void IncreaseDecreaseAngleOfAimOrPower(){ 

    collider_1 = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition),Vector3.forward,1.0f); 
    if (collider_1) { 
     if (collider_1.transform.CompareTag("IncreaseAngle")) { 
      increaseAngle += Time.deltaTime * 25; 
     } else if (collider_1.transform.CompareTag("DecreaseAngle")) { 
      increaseAngle -= Time.deltaTime * 25; 
     } else if (collider_1.transform.CompareTag ("PowerIncrease")) { 
      power += Time.deltaTime * 25; 
     } else if (collider_1.transform.CompareTag ("PowerDecrease")) { 
      power -= Time.deltaTime * 25; 
     } else if (collider_1.transform.CompareTag ("Shoot") && shoot) { 
      forceAngle.x = Mathf.Cos (aimAngle.z * Mathf.PI/180); 
      forceAngle.y = Mathf.Sin (aimAngle.z * Mathf.PI/180); 
      rigidBody.isKinematic = false; 
      rigidBody.AddForce ((forceAngle * power),ForceMode2D.Impulse); 
      aim.gameObject.SetActive (false); 
      shoot = false; 
     } 
    } 

} 

である私が最初にクリックされたときに、ここで enter image description here

があるのスクリーンショットです私が2回目にクリックしたときのスクリーンショット enter image description here

+0

「Ball.IncreaaseDecreaseAngleblablabla」のため、2度目に呼び出されませんか? – Sinatr

+0

いいえボタンをクリックすると固定されたすべてのアップデートと呼ばれます – sagar

+2

.NETのためか? CLRは、開始から最初の呼び出しでバイトコードをネイティブコードにコンパイルし、後でキャッシュされたバージョンを使用します。 私はphysics2d.raycastの最初の呼び出しで余分な作業をしていると思います。 私は、この関数の実行時間(Stopwatchクラスを使用)をあなたのログに記録することを推奨します。 –

答えて

0

これはJITコンパイルのために発生します。最初にIncreaseDecreaseAngleOfAimOrPower()を呼び出すと、コンパイラはいくつかの関連するメソッドのコードをコンパイルする必要があります。あなたの場合はおそらくRaycast(...)でしょう。

これにより、しばらくの間アプリケーションがフリーズします。次の時間にメソッドを呼び出すと、すでにコンパイルされており、フリーズしません。

関連する問題