2016-07-04 2 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

가있는 스크린 샷입니다 내가 두 번째로 클릭했을 때의 스크린 샷 enter image description here

+0

두 번째로 호출되지 않는 'Ball.IncreaaseDecreaseAngleblablabla' 때문에 – Sinatr

+0

아니요 버튼을 클릭 할 때마다 고정 된 업데이트로 불리지 않습니다. – sagar

+2

.NET 때문일 수 있습니까? CLR은 시작 이후 처음 호출하는 동안 바이트 코드를 원시 코드로 컴파일 한 다음 캐시 된 버전을 사용합니다. 나는 physics2d.raycast의 첫 번째 호출에서 추가 작업을한다고 가정합니다. 이 함수의 실행 시간 (Stopwatch 클래스 사용)을 로그에 기록하도록 권합니다. –

답변

0

이는 JIT 컴파일로 인해 발생합니다. 처음으로 IncreaseDecreaseAngleOfAimOrPower()를 호출 할 때 컴파일러는 관련 메서드에 대한 코드를 컴파일해야 할 수 있습니다. 귀하의 경우에는 아마도 Raycast(...) 일 것입니다.

이렇게하면 잠시 동안 애플리케이션이 정지됩니다. 다음 번에 메서드를 호출 할 때 이미 컴파일되었고 고정되지 않습니다.

관련 문제