Static 구성원에 의한 캐시(Vector.zero의 예)
이번에 우리는 캐시와 같은 동적 처리의 실복을 조사했다.
내부에서 동적 처리를 하는 예
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 구성원의 값은 모두 창고 구역에 두시겠습니까...?
최후
잘못된 부분을 알고 있다면 지적해 주십시오!!
Reference
이 문제에 관하여(Static 구성원에 의한 캐시(Vector.zero의 예)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nkjzm/items/b471fa904b9073859ee5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)