작성
·
65
·
수정됨
0
C++과 다이렉트를 배우고 유니티를 배우기위해 학습하고있는 학생입니다
리소스 매니저에서 인스턴시에이트 시점에 각 오리지널 객체에대해 GetComponent함수를 통해 Poolable 객체의 보유여부를 판단하는 모습으로 보이는데요
C#과 유니티에 아직 미숙해서 문의를 남깁니다.
GetComponent의 원리가 C++에서 각 컴포넌트를 일차원배열을 선형탐색하여 각각 폭포식으로 dynamic cast를 해보는것과 비슷한 수행성능을 낼 것으로 판단되는데
이게맞다면 모든객체의 인스턴스화 시점에 많은 오버헤드를 일으키지않나요?
만약 맞다면 풀 매니저에서 poolable을 지닌 객체와 안지닌 객체에대해 해시셋등의 자료구조를 통해 두가지의 경우를 캐싱을 하고
최초로 검사하는경우에만 GetComponent를 호출해서 맞는 컨테이너에 캐싱후 결과를 반환하는 식으로 하면 어떨까 질문드립니다.
예시로 만든 코드 남겨드립니다
.
답변 2
0
네 물론입니다.
사실 생성/삭제는 매 프레임마다 하는 것이 아니라 크게 상관 없지만,
정말 성능을 쥐어짤 필요가 있다면 말씀대로 적당히 캐싱을 해주시면 됩니다.
최근에 진행한 Burger Please 라이브 강의에서 또한
제안 주신 것과 비슷한 방식으로 이름으로 찾는 방식을 채택했습니다!
0
안녕하세요, 인프런 AI 인턴입니다. 안산촌놈님.
질문하신 내용을 보면 GetComponent<Poolable>
함수의 내부 작동 방식과 이에 따른 성능 최적화 방법에 대한 고민을 하고 계신 것 같습니다. 이와 관련해 몇 가지 팁을 드리겠습니다.
GetComponent<>
함수는 Unity에서 매우 중요한 함수로, 특정 게임 오브젝트에 붙어 있는 컴포넌트를 가져오는 역할을 합니다. 성능 측면에서는 여러 번 반복적으로 호출될 경우 약간의 오버헤드를 유발할 수 있습니다. 특히, 매 프레임마다 반복적으로 사용하면 성능에 영향을 미칠 수 있습니다.
이 때문에 GetComponent<>
호출을 가능한 최소화하는 것이 좋습니다. 이를 위해서 다음과 같은 방법을 고려해 볼 수 있습니다:
캐싱 사용: 게임 오브젝트가 생성될 때 필요한 컴포넌트를 미리 GetComponent<>
로 가져와 변수에 저장(캐싱)하는 것이 일반적입니다. 이렇게 하면 이후에 해당 컴포넌트를 다시 가져올 때 GetComponent<>
를 재호출하지 않아도 됩니다.
컨테이너 활용: 안산촌놈님이 제안하신 대로 해시셋이나 다른 자료구조를 활용하여, 이미 가져온 컴포넌트를 캐싱해두고 필요할 때 이를 참조하는 방법도 성능 최적화에 유효합니다.
초기화에서의 설정: 리소스 매니저에서 각 오브젝트의 초기화 시점에 필요한 컴포넌트를 한번 검사하고, 결과를 저장해 두는 방식도 유용합니다.
유사한 주제로 고민하는 사용자들에게도 도움이 되는 링크를 몇 가지 추천드릴 수 있습니다:
GetComponent<>
함수의 작동 방식과 관련된 설명 및 컴포넌트 활용에 대한 이해를 돕는 내용을 다루고 있습니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.