ScriptableObject가 무엇인지, 또 어떻게 쓰는 것인지 대략적으로는 알고 있었지만,
제대로 사용해본적은 없었다. 그저 개념을 익히기 위해 한두번 끄적여 본 정도..
토이프로젝트를 진행하며 제대로 사용해볼까 하고
일단 넣어는 봤는데 이게 정말 효율적인지 직접 확인해보고 싶어졌다.
👀 ScriptableObject
https://everyday-devup.tistory.com/53
ScriptableObject를 사용해봐야겠다고 마음먹게된 가장 큰 이유가 된 블로그 글이다.
공통 요소를 ScriptableObject로 한번에 관리하면 굉장히 효율적으로 처리할 수 있다는 내용이었다.
테스트를 해보기 위해 일단 무수히 많은 사과나무를 만들었다.
120개 정도 된다.
사과나무들은 공통적으로 아래 요소들을 가진다.
int id;
string name;
float growSpeed;
public List<Sprite> growUpSprites;
위 네 요소를 각각 ScriptableObject로 처리했을 때와,
변수로 선언 후 처리했을 때 메모리 차이를 테스트 하고자 했다.
🔽 ScriptableObject
public class ItemData : ScriptableObject
{
public int Id;
public string Name;
public float GrowUpSpeed;
public List<Sprite> GrowUpSprites;
}
🔽 변수 선언
public class ItemObject : BaseObject
{
private int id = 1;
public string itemName = "AppleTree";
public float growupSpeed = 3f;
public List<Sprite> growupSprites = new List<Sprite>();
...
}
int형 4B
+ string형 2바이트 * 9글자 = 18B
+ 1KB Sprite 3개 저장 = 3KB
👉 3.022 KB * 120개 = 362.64KB
ScriptableObject를 사용했을 때가 일일히 변수로 선언했을 때보다
대략 360KB 정도 차이나지 않을까! 하고 예상해봤다.
(사실 정확한 측정 방법인지는 모르겠다..)
측정 방법은 동일하게 진행했다.
120개의 나무가 모두 자랄때까지 기다리고,
나무사이를 계속 돌아다녀봤다.
Graphics & Graphics Driver 값을 비교해봤다.
✏️ 유니티 프로파일러 메모리 공식 문서
https://docs.unity3d.com/kr/2022.3/Manual/ProfilerMemory.html
- Graphics & Graphics Driver : 드라이버가 텍스처, 렌더 타겟, 셰이더 및 메시 데이터에 사용하는 추정 메모리 사용량
🔽 최소값 (돌아다니지 않을 때)
🔽 최대값 (돌아다닐 때)
🔽 최소값 (돌아다니지 않을 때)
🔽 최대값 (돌아다닐 때)
🤨🤔😵💫
확실히 ScriptableObject를 사용했을 때가 차지하고 있는 메모리 양이 적긴 했다.
최소값 만을 가지고 비교했을 때 31.8M와 32.2M 인 것을 보면 예상한 오차 범위와 맞아떨어지기도 하다.
하지만 워낙 데이터의 크기가 작은데다, 아래 오브젝트의 개수가 차이가 나는것으로 보아
완벽하게 동일한 조건에서 진행되었다고 장담할수 없을 것 같다.
조금 더 프로젝트가 진행되고, 오브젝트들이 다양해졌을 때 다시 시도해 봐야겠다.