GameForFun

블로그 이미지
by PforPepsi

TAG CLOUD

  • 131,490Total hit
  • 17Today hit
  • 16Yesterday hit

1. Static(전역) 에 의한 메모리 누수
- C#에서 흔히 Singleton을 사용하여, 아무곳에서나 접근가능한 클래스를 만드는 경우가 존재하는데 이때, 메모리 누수에 주의해야 한다. static이기 때문에 Scene이 넘어가도 해당 클래스는 누군가가 참조하기 때문에 GC(Garbagecollector)는 해당 메모리를 회수하지 않고 메모리에 지속적으로 올려놓는다..

따라서 static instance를 할당했다면 스크립트가 파괴되어야 할 시점, OnDestroy()에서 instance = null을해서 GC가 메모리를 해제할 수 있도록 해줘야 한다.

2. Mesh에 의한 메모리 누수
- Unity는 새롭게 생성된 Mesh를 해당 객체가 Destroy 된다고 해서 메쉬데이터를 지워주진 않는다. 따라서 해당 객체가 파괴될때  즉, OnDestroy()에서 메쉬 정보를 지워주면 된다. 

3. Asset에 의한 누수
- 이건 좀 특별한 경우인데, 다음 경우를 살펴보자.
Scene 1과 2가 있다 치고, Scene1에 처음으로 입장했을때, 메모리 사용량이 10MB였다면, Scene2를 갔다가 다시 Scene1로 넘어올때 메모리 사용량이 10MB보다 크게 나오는 경우가 존재한다.
이럴때 의심해 볼 수 있는것이 Scene2에 사용된 Asset이 메모리에 올라가 있다고 예상 해볼 수 있다. 
해결법은 Scene2에서 링크방식으로 지정된 Asset들을 모두 파괴시에 null로 만들어주면 된다. 
가령

class dada:monobehaviour {

 public Texture2D hellotexture;

void OnDestroy()
{
    hellotexture = null;
}

위와 같이 해주도록 하자.  AudioClip, Texture2D, Object, GameObject 모든것에 의심을 해볼 가치가 있다.

4.Material에 의한 누수
- 이 경우는 MAterial의 instance가 지속적으로 생길댸 발생하는 현상인데... 아직 해결법을 못찾고 있다.... Destory를 해줬는데도 증가하는것을 보면....(다른쪽에 남아있을지도?) 
혹시 모르니 해당 객체가 파괴될때 Destroy 를 해주도록 하자.


아래 코드는 Editor 하위 폴더에 넣어주면 Menu에 새로운 탭이 생겨서 사용할 수 있다.
기능은 현재 Scene에서 로드된 모든 오브젝트들을 보는 것이다.

3번에서 설명했던것과 같이 Scene2에서 1으로 넘어올때 어떤것들이 해제 안됬나를 보려면, 먼저 Scene1에서 사용후, Scene2를 방문했다가 다시 Scene1에 와서 사용해주면, 새롭게 추가된 Object들의 이름이 Console창에 뜬다.

 static DIctionary<string, int> tempdicts = new Dictionary<string,int>();
[MenuItem("MemoryDetector/Print Item Names")]
publicstatic void PrintObjectName()
{
    Dictionary<string, int> tempdicts = new Dictionary<string, int>();
    foreach(string s in Objects.Keys)
    {
        if(Objects.ContainKeys(g.name)))
        {
            Objects[g.name]++;
        }else
        {
            Objects.Add(g.name,0);
        }

    }
    foreach(string curobjects in Objects,Keys)
    {
        if(!tempdicts.ContainKey(curobjects))
        {
            Debug.Log(curobjects);
        }
    }

TRACKBACK 0 AND COMMENT 3

ARTICLE CATEGORY

목록들 (118)
[Unity3D] (39)
그래픽관련 (13)
잉여잉여 (25)
프로그래밍 (27)
노래♬ (3)
Game_Design(기획) (3)

CALENDAR

«   2019/04   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

ARCHIVE