2019년 12월 30일 월요일

Dictionary의 Key는 Mutable 해야 함

Dictionary의 Key로 long 이나 int 같은 기본 타입이 아닌 유저정의 Class 를 사용하는 경우, 해당 클래스가 Mutable 하지 않고 수정이 될때 문제가 발생한다.

Dictionary의 Key로 Class나 struct 가 사용될 때, Dictionary는 GetHashCode() 함수를 사용하게 되는데, 만약 Key로 사용하고 있는 Class의 인스턴스가 변경되는 경우 GetHashCode()의 결과도 바뀌게 되기 때문이다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
public struct H
{
    public int a;
    public H(int _a)
    {
        a = _a;
    }
}

[Test]
public void HashCodeTest()
{
    var h = new H(0);
    Debug.Log($"HashCode = {h.GetHashCode()}");
    h.a = 100;
    Debug.Log($"HashCode = {h.GetHashCode()}");
    h.a = 1;
    Debug.Log($"HashCode = {h.GetHashCode()}");
}

위의 코드를 실행하면

HashCode = 498689296
HashCode = 498689396
HashCode = 498689297
의 결과가 출력된다.

EqualityComparer 를 사용할 것이 아니라면 수정될 만한 인스턴스는 Dictionary 의 Key로 사용하지 말자

C# Dictionary<> and mutable keys
 
 
 

2019년 12월 12일 목요일

Unity GPresto 변수 성능 테스트

GPresto에서 제공하는 메모리 변조 방지용 변수들을 사용해야 하는데 성능에 관한 의심이 들어 간단하게 테스트를 해 보았다.

bool 부터 Quaternion, Vector3 까지 지원해 주는데 제일 빈번하게 사용하는 int, float, Vector3만 테스트 했다.

각 타입에 최소 단위(1, 1.0f, Vector3.one)를 1억번 더한 결과, 다음과 같았다
(갤럭시s 8 기준)



int 형 : 8032 / 178 = 45.1배
float 형 : 38092 / 962 = 39.5배
Vector3형 : 54066 / 3808 = 14.2 배

결론 : 꼭 필요한 곳만 쓰자.

2019년 12월 3일 화요일

Android OBB 와 TextMeshPro

APK 가 150MB를 초과해서 OBB를 도입하고 있다.
기존 로그인 씬 보다 더 앞에 OBB다운로드 체크 씬을 도입하고 APK를 빌드해서 실행하니

위와 같은 에러를 뱉어내었다.

다운로드 확인을 위한 팝업에서 TextMeshPro를 사용 중이었는데, 타 팀에서도 TextMeshPro를 OBB체크 시에는 사용하지 않는다는 얘기를 들어 TextMeshPro 대신 일반 Text 로 교체하니 일단 에러는 사라졌다.