Static 구성원에 의한 캐시(Vector.zero의 예)

4561 단어 UnityC#
UnityEngine의 static 구성원 중 내부에서 동적 처리를 하는 구성원이 있습니다.
이번에 우리는 캐시와 같은 동적 처리의 실복을 조사했다.

내부에서 동적 처리를 하는 예


GetComponent 모드

GameObject.transform

참조:


81페이지
https://www.slideshare.net/UnityTechnologiesJapan/unity-2016-77897096
내부 설치가 잘 안 돼요.
https://github.com/MattRix/UnityDecompiled/blob/master/UnityEngine/UnityEngine/GameObject.cs#L14-L19

새로운 모델

  • Color.red(블랙, 블루 등도 마찬가지)
  • Vector.zero(up,right 등도 마찬가지)
  • 참고 자료


    UnityDecompiled/Color.cs at master · MattRix/UnityDecompiled
    https://github.com/MattRix/UnityDecompiled/blob/master/UnityEngine/UnityEngine/Color.cs#L17-L23

    메서드


    이번에는 벡터의 Zero Getter를 캐시할 방법을 생각해 봅시다.
            public static Vector3 ZeroGetter
            {
                get
                {
                    Debug.Log("init");
                    return new Vector3(0, 0, 0);
                }
            }
    

    직접 호출

            Debug.Log("--- getter");
            for (int i = 0; i < 10; ++i)
            {
                var vec = AbemaTV.VectorUtils.ZeroGetter;
            }
    

    결실



    매번 업데이트됩니다.

    임시 변수 준비

            static Vector3? cache;
            public static Vector3 ZeroCache
            {
                get
                {
                    return (Vector3)(cache ?? (cache = ZeroGetter));
                }
            }
    
    Getter 설치는 처음 액세스할 때만 호출됩니다.
            Debug.Log("--- cache");
            for (int i = 0; i < 10; ++i)
            {
                var vec = AbemaTV.VectorUtils.ZeroCache;
            }
    
    부르다

    결실



    의도한 대로 한 번만 불렀어요.

    정적 구성원을 통해

            public static Vector3 Zero = ZeroGetter;
    
    static 구성원Zero에게 캐시 수치를 확인해 보았습니다.
            Debug.Log("--- static member");
            for (int i = 0; i < 10; ++i)
            {
                var vec = AbemaTV.VectorUtils.Zero;
            }
    
    부르다

    결실



    한 번만 불렀어요.
    첫 번째 방문 전에 호출되고 내부 캐시가 있는 것이 특징이다.
    (문서에도 기재되어 있음)
    정적 구성원은 첫 번째 방문 전에 초기화됩니다.
    https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members

    결론


    (Getter가 아님) Static 멤버를 통해 부르면 캐시를 할 수 있습니다.

    잡담


    참고로 이번 예Vector.zero에 대해 정적 구성원을 초기화한 값입니다.
            private static readonly Vector3 zeroVector = new Vector3(0f, 0f, 0f);
    
    Getter로 불렀기 때문에 현금 캐시를 스스로 고려할 필요가 없다.
            public static Vector3 zero
            {
                get
                {
                    return Vector3.zeroVector;
                }
            }
    
    Color.red 매번 new이기 때문에 고속 캐시가 효과적입니다.
            public static Color red
            {
                get
                {
                    return new Color(1f, 0f, 0f, 1f);
                }
            }
    

    잡감


    C#에서 로컬 변수는 값을 스택에 배치합니다.변수가 값이면 모든 값이 스택에 배치됩니다.다른 한편, 참조형의 경우 실제 값은 스택에 배치되고 스택의 위치에 대한 참조 정보(포인터)만 스택에 배치됩니다.
    http://ufcpp.net/study/csharp/rm_gc.html
    창고 구역은 로컬 변수에 한정된 이야기이기 때문에static 구성원의 값은 모두 창고 구역에 두시겠습니까...?

    최후


    잘못된 부분을 알고 있다면 지적해 주십시오!!

    좋은 웹페이지 즐겨찾기