inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

절대강좌! 유니티 6 - TPS 게임으로 배우는 유니티 마스터클래스

Scriptable Object 기본 활용법 - 공유 메모리

[질문] Scriptable Object르 이용한 메모리 최적화 관련 질문이 있습니다.

해결된 질문

216

paehwang

작성한 질문수 9

0

안녕하세요.

 

스크립터블 오브젝트를 이용해서 메모리 사용을 최적화 하는건 참 놀랐습니다.

그 어느 강의에서도 못보던 내용인데요.

 

2개 이상의 변수에 대해 사용하는 것은 이해를 할 수 있을거 같은데요.

 

bullet 같은 경우는 int 형 자료 하나만 있었는데 이것도 옮기시더라구요.

 

int bulletSpeed; 는 정수형이므로 4byte 일거고

ScriptableObject so; 는 참조형이라서 8byte 를

갖지 않을까 싶어서요.

그러면 int 하나만 있는것은 so 로 변환하는게 오히려 손해 아닌가요?

 

 

C# unity

답변 2

2

이재현

안녕하세요.

좋은 질문주셨습니다. ScriptableObject를 활용한 메모리 최적화는 단순히 메모리 사용량만을 고려하는 것은 아니구요. 메모리 배치, 캐시 효율성, 데이터 공유 등의 요소를 종합적으로 고려하는 기법입니다.

 

우선, int bulletSpeed;는 일반적으로 4바이트(32비트)입니다. 반면, ScriptableObject는 참조형이므로 64비트 시스템에서는 8바이트 포인터로 저장됩니다. 따라서 표면적으로 보면, int 하나만 있을 때는 ScriptableObject를 사용하는 것이 메모리적으로 불리해 보일 수 있습니다.

하지만 확장성을 고려했을 때, 또 다른 변수가 추가된다면 오히려 적은 메모리로 관리할 수 있겠죠. 강의에서는 이러한 개념을 활용하는 예시를 보여드렸다고 생각해주세요.

 

예를 들어 Bullet의 Damage 변수만 하나 더 추가한다고 가정하면, ScriptableObject를 사용했을 때 훨씬 메모리가 절약되겠죠. 또, Bullet이 충돌한 물체의 재질(시멘트, 철판, 나무)에 따라 발생하는 탄흔 효화(강의에서는 스파크)를 교체하려면 최소 3개의 프리팹이 필요하겠지요. 이때 ScriptableObject를 사용한다면 공유된 데이터 구조 덕분에 메모리를 훨씬 효율적으로 사용할 수 있겠습니다. (물론 구현방법에 따라서 다를수 있습니다. ~)

 

또한, ScriptableObject를 사용했을 때의 장점은 저장 데이터를 한 곳에 모아두어 캐시 히트율을 높일수 있습니다. 반면, 개별적으로 int를 가지면 각 객체가 메모리 여기저기에 흩어지면서 CPU 캐시 미스가 증가할 가능성이 있습니다. 특히 대규모 오브젝트를 처리할 때는 메모리 연속성이 중요한 최적화 요소가 됩니다.

 

추가적으로, 게임 중에 특정 아이템을 취득했을 때 bullet의 Speed나 데미지를 변경(증가)시키는 로직도 개별 변숫값을 일일히 설정하는 것이 아니라 ScriptableObject의 변수 하나만 변경하시면 편리하실 겁니다.

 

수강중 또다른 질문이 있으시다면 언제든지 글 남겨주세요. 꼭 완강하시길 기원합니다.

감사합니다.

 

 

 

 

 

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. paehwang님.

스크립터블 오브젝트(ScriptableObject)를 활용한 메모리 최적화에 대한 궁금증이 있으신 것 같습니다. ScriptableObject는 유니티의 강력한 기능 중 하나로, 특히 데이터 중심의 게임 객체를 관리하는 데 유용하게 쓰입니다. 귀하의 질문은 ScriptableObject로의 변환이 실제 메모리 효율성을 증가시키는지에 대한 것입니다.

기본적으로 ScriptableObject는 메모리에서 데이터를 한 번만 저장하고 여러 게임 오브젝트에서 공유할 수 있게 해 주기 때문에, 중복 생성과 메모리 낭비를 줄이는 장점이 있습니다. 이를 통해 메모리 효율성을 높일 수 있습니다. 그러나 질문하신 대로 단순히 int형 변수 하나를 ScriptableObject로 변환하는 경우, 메모리 사용에서 이점이 크게 드러나지 않을 수 있습니다. 이는 오히려 관리의 편의성이나 특정 값의 일관성을 유지하는 목적이 더 크다고 보시면 됩니다.

하지만 int 변수 하나에 대한 ScriptableObject 사용이 일반적으로는 작게 느껴질 수 있으나, 프로젝트 전체에서 데이터 구조에 통일성을 제공하고, 나중에 구조를 확장할 때 유연성을 줄 수 있는 장점을 간과할 수 없습니다. 또한, 게임 개발 도중 데이터가 변화할 경우, 이 데이터를 인스펙터에서 쉽게 조정하고 편리하게 테스트할 수 있습니다.

이전에 비슷한 주제의 질문과 답변을 Inflearn의 Q&A에서 찾아보실 수 있습니다:

  1. 데이터 관리와 메모리 최적화에 대한 유익한 질문 - ScriptableObject와 데이터 관리에 대한 유익한 설명을 포함하고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Dictionary Key를 int에서 string으로 변경한 이유에 대한 문의

0

12

1

프로젝트 질문 문의

0

41

1

UI 기능 관련 질문이 있습니다!

0

31

2

03-01 (16. CharacterController)

0

27

2

TLS 질문드립니다.

0

39

2

prefab 관련 문의

0

66

1

Bullet이 방향 문제가 있어요.

0

108

3

딜레이를 주고 싶을 때 코루틴을 사용하는 이유

0

106

2

Spider 사망 시 두 번 폭발관련

0

101

2

Player에 Event 연결 관련 질문

0

94

2

Barrel에 IDamagable 적용 관련 질문

0

74

2

Stun 로직 관련해서 문제가 발생합니다.

0

189

2

Bullet, AimDot 코드 질문

1

135

2

안녕하세요 이벤트 버스 패턴에 대해서 궁금한게 있어서요

0

210

2

선생님 궁금한게 있는데요

0

166

2

비헤이비어 그래프 방식이요

1

136

2

콜백 함수, garbage colleection에 대해

0

119

1

스크립터블 오브젝트에 대해 질문이 있습니다

0

125

1

오디오 관련해서 질문 있습니다.

0

150

2

[질문] ScriptableObject 를 활용한 이벤트 버스 관련 질문이 있습니다.

0

279

1

[질문] Component 이름 관련해서 질문이 있습니다.

0

124

1

[질문] Custom NavMesh Link 관련해서 궁금한게 있습니다.

0

104

2

강사님~ 오디오 파일 관련해서 질문있습니다!

0

180

2

IDamagable 활용

0

167

1