트랜스폼 참조 캐싱을 통한 성능 향상 체크

권혁찬
∙∙조회 10
트랜스폼 참조 캐싱을 통한 성능 향상 체크

개요

 

-유니티에서 게임오브젝트를 움직이게 하기 위해서 Tranform에 접근함

-작업 한번이 무거운건 아니지만, 탄환-플레이어-적 등을 이동시키다보면 매프레임 이에 접근하게 되고 쌓여서 작지 않은 부하가 됨

-특히 구현중인 리플레이 시스템에서 매 프레임마다 개체들의 위치,각도,크기 를 저장하고 있기 때문에 접근횟수가 몇배로 뻥튀기되어 무시 못할 정도

-따라서 Tranform의 여러 값들을 변경할때 변경 정보를 각 개체의 필드값에 캐싱해두고 수정, 참조 요청이 들어올때 트랜스폼을 호출하는 대신 캐싱한 정보를 반환하도록 함

 

코드 상세

private Vector2 m_curPos = new Vector2(int.MaxValue,int.MaxValue);

private Vector2 m_Scale = new Vector2(int.MaxValue,int.MaxValue);

private float m_angle = 99999;

public Vector2 Position

ini
{

    get

    {

        if(m_curPos.x == int.MaxValue)

        {

            Position = transform.position;

            return transform.position;

        }

        return m_curPos;

    }

    set

    {

        if(m_curPos == value) return;

        m_curPos = value;

        transform.position = value;

    }

}

public virtual Vector2 Scale

{

    get

    {

        if(m_Scale.x == int.MaxValue)

        {

            Scale = transform.localScale;

            return transform.localScale;

        }

        return m_Scale;

    }

    set

    {

        if(m_Scale == value) return;

        m_Scale = value;

        transform.localScale = value;

    }

}

public virtual float Angle

{

    get

    {

        if(m_angle == 99999)

        {

            Angle = transform.eulerAngles.z;

            return transform.eulerAngles.z;

        }

        return m_angle;

    }

    set

    {

        if(m_angle == value) return;

        m_angle = value;

        transform.eulerAngles = new Vector3(0,0,value);

    }

}

-2D 게임이므로 Z축 이동 및 스케일과 XY회전을 활용하지 않음. 이에 맞춰서 Position,Scale,Angle 프로퍼티 작성

-트랜스폼 접근은 모두 해당 프로퍼티를 통해 이뤄져야함

 

실험

-캐싱을 하지 않고 항상 트랜스폼에 참조할때, 위 캐싱 프로퍼티들을 사용할때 두 경우를 프로파일러로 관찰

-적이 우측에서 소환되고 초당 10발씩 탄환을 플레이어를 향해 발사

캐싱 X

-저장 시 탄환의 Position,Scale,Angle을 저장하며 각 2%, 총 6% 정도의 연산 발생

-업데이트에서 탄환의 위치를 변경하며 3.7% 정도의 연산 발생(get_transform과 get_right는 현 최적화와 무관한 연산. 추후 따로 조치)

-결과적으로 탄환의 위치정보를 저장하고 매 프레임마다 위치를 변경하는데 총 연산의 10%를 소모함

 

캐싱 O

-저장 시 연산이 0.5% 미만으로 거의 사라짐

-업데이트에서 탄환 위치 변경시 set_posititon에서 1.8% 정도 연산 발생

-결과적으로 총 연산의 2% 정도를 소모

 

결과

-변경한 트랜스폼 값을 캐싱한걸로 현재 게임내 관련 연산량이 80% 감소함. 특히 핵심 시스템인 되감기의 Save에선 90%이상의 높은 효율을 보임

-탄환을 임의로 대량 생산한 실험이었기에 실제 게임에서 총 연산 대비 효과는 이정도로 극적이진 않을 것