뭔가....
게임을 만들었는데 이상하게 발열이 쩐다 싶어서
이것저것 찾아보니 최적화 관련 문서가 있더라구요.
그걸 보니까
"string"+"string"하고,
int.ToStrin()하고,
오브젝트를 생성, 파기하는데 컴퓨터 자원을 많이 쓴다고 하길래
요 세가지만 뜯어내려고 머리를 빡세게 굴리고 있습니다.
헤헤....
우선 친구 네트워크로 물어물어 찾아보니 string+string가 반복될때 생기는 스펙 저하는 StringBuilder 를 쓰면 된다더라구요
system.text.stringBuilder 물론 자동완성으로 대소를 변경해줘야 하기는 하지만....
여기에 마법의 예제가!
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("[");
sb.Append(index);
sb.Append("] ");
sb.Append(name);
sb.AppendLine();
sb.ToString();
int.ToString()요건 어떻게 해도 떼어내기가 힘들더라구요.
이게 성능상의 저하를 일으키는 이유가 int는 고정된 크기의 값을 가지는 변수인데 비해서, string는 char의 배열이다보니 int를 분해해서 적당한 수치의 배열을 생성해서 각 위치에 파싱된 글자를 넣어주고, 남는 배열을 자르고 하는 일들을 하다 보면 굉장히 자원이 많이 소비된다고 합니다.
뭐.... 안쓰려고 해도 스테이터스가 한자리수인데 C#에는 toChar도 딱히 없어보이고, convert.toChar 이라는게 있다는데 성능상으로 어떻게 변화가 일어날지 모르니 낼름 손을 뻗기에는 애매하네요..... 차라리 일정 숫자를 더한다음에 (char)을 붙여서 캐스팅하는게 나을지도.... 라는 생각이 드는게 말이죠.
마지막으로 오브젝트 동적 생성인데 뭐.... 없는거 새로 만들려면 당연히 컴퓨터도 빡세기야 하겠죠. 그런걸 해결하기 위해서 오브젝트 풀을 만들어서 거기다가 미리 쓸 오브젝트들을 넣어두고, 필요할때 가져다가 썼다가, 필요없으면 다시 풀에 반환하면 된다고 합니다.
문제는 풀에 있는 오브젝트 이상을 가져다 쓰게 될 경우인데.... 다른건 괜찮은데 순환호출로 오브젝트가 호출, 반환되는 경우에는 오브젝트를 몇백개 준비시켜놔야 할 텐데 그게 멀쩡히 버텨줄지가 걱정입니다....
이펙트라던가, 탄막같은걸 생각하면 그걸 모조리 오브젝트 풀에 싸그리 모셔두느니 동적호출이 낫지 않을까.... 라는 생각이 들 정도로 말이죠.
혹시 다른분들은 비슷한 작업을 하신 적 있나 해서 글 적어봅니다.
이왕이면 해결하신 마법의 비법도....