강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

paehwang님의 프로필 이미지
paehwang

작성한 질문수

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

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

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

해결된 질문

작성

·

144

0

안녕하세요.

 

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

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

 

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

 

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

 

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

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

갖지 않을까 싶어서요.

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

 

 

답변 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 인턴입니다. paehwang님.

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

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

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

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

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

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

paehwang님의 프로필 이미지
paehwang

작성한 질문수

질문하기