변화없는 Transform을 Update에서 계속?

devKyoun·2024년 10월 18일
0

Unity

목록 보기
17/27
post-thumbnail

주로 transform의 변환 관련해서 Update에서 계속해서 업데이트 해주는데
이것이 때로는 성능 저하가 걸릴때가 있다
특히 transform 변환을 위해 어떤 수칙 연산을 한다든지 말이다
transform이 변환이 없는데 매 업데이트마다 연산을 한다든지 여러 저하가 걸리는 상황이 있을 것이다

그런 경우를 위해 이러한 코드를 짜봤다

 public void Move()
{
    before = transform;
    // 변화가 없을때는 Move 탈출
    if(!System.Object.ReferenceEquals(before, null) && !System.Object.ReferenceEquals(after, null) && 
        _input.GetMove() == Vector2.zero && before == after)
    {
        if (animationBlend == 0)
        {
        	Debug.Log("NotMoving");
            return;
        }
    }
    

    // Target Speed 결정
    if(_input.GetMove() == Vector2.zero)
    {
    	...
    }
    
  { .... }
      
  after = transform;

무엇이 최적화 인가?

  • 단순 == 비교의 성능 비용 ( 이건 그냥 최적하기 위해 추가한 것이라 최적화라고 하긴 그렇다 )
    초반에 null 확인은 before, after transform 둘 다 null 이라서 처리 해준 것
    ==, != 연산자를 통해 null 을 비교하는 성능비용 보다 ReferenceEquals를 통해 비교하는 성능 비용이 미세하나 2배 가까이 빠르기 때문에 채택
    FakeNull 현상으로 인해서 리소스를 잡아먹음

  • 입력이 없고 before transform과 after transform이 같다면 Move 기능 하지 않음
    입력이 없는데도 Update에서 Move를 호출 해 Move에서 일어나는 많은 연산을 하는 것을 방지 하기 위함
    근데 그러면 PlayerManager에서 입력이 없을때 처음부터 Move호출을 안하면 되는거 아닌가?
    그렇게 하면 Animation Blend 갱신이 안돼서 Animation이 Move->Idle로 전환되지않음
    따로 PlayerManager에서 갱신 해줘야하는데 그렇게하면 독립성이 저하 되고 가독성도 저하 됨

StarterAsset의 ThirdPersonController를 리팩토링 하다가 구현했다

이 코드를 사용한 포스트 : StarterAsset's ThirdPersonController Refactoring

profile
Game Developer

0개의 댓글