SlideShare a Scribd company logo
1 of 34
DevRookie
Object
Pooling
2020.06.20
By TonyChoiMS
서론
오브젝트 풀링
실습
마무리
Index
01
02
03
04
서론
오브젝트의 생성과 삭제
게임을 개발함에 있어서 인스턴스의 생성과 삭제는 굉장히 빈번하게 일
어나게 됩니다.
오브젝트 생성과 삭제01
4
인스턴스의 생성과 삭제는 매우 무거운 작업입니다.
동적으로 생성된 인스턴스는 힙 메모리에 할당되고, 해당 메모리를 다시
해제해줘야하는 작업을 해야하기 때문이죠.
오브젝트 생성과 삭제01
5
- 오브젝트의 잦은 생성과 삭제는 메모리 단편화 문제가 생기게 됩니다.
* 외부 메모리 단편화
오브젝트 생성과 삭제01
6
- 오브젝트 풀링은 이러한 문제들을 해결하기 위해 사용되고 있습니다.
오브젝트 생성과 삭제01
7
Object Pooling이란?
이론
- 디자인 패턴의 일종(객체 풀[Object Pool])
- 짧게 사용하고 사라진 뒤에 다시 사용하는 오브젝트의 경우 매번 다시
생성/해제를 반복하게 되면 메모리 부하가 심해집니다.
- 객체를 매번 할당, 해제하지 않고 고정 크기 풀에 들어 있는 객체를 재
사용함으로써 메모리 사용 성능을 개선합니다.
- 메모리 단편화를 방지합니다.
Object Pooling02
9
- 화면에 보이지 않게만 하고(Deactive) 메모리를 해제하지 않은 채로 필
요할 때마다 다시 사용하는 기법
- 메모리 할당을 더 간단하게 할 수 있고, 동적 메모리 할당 오버헤드와
가비지 컬렉션(GC)을 줄일 수 있습니다.
- 게임이란 도중에 렉이 걸리는 것보단, 로딩이 오래 걸리는 것이 유저 경
험에 있어서 더욱 이롭습니다.
Object Pooling01
10
1. 오브젝트 생성 시 요구되는 높은 비용을 피하기 위해.
2. 빠른 객체의 초기화 속도
3. 적은 오브젝트의 수로도 많은 오브젝트를 표현할 수 있는점.
4. GC로 인한 프레임 드랍 회피.
Object Pooling 사용하는 이유02
11
1. 객체를 빈번하게 생성/삭제하는 경우
2. 객체를 힙에 생성하기가 느리거나, 메모리 단편화가 우려되는 경우
3. 오브젝트 생성과 삭제함에 있어 병목현상이 발견되는 경우
ex) 게임을 표현함에 있어 많은 오브젝트가 필요한 경우
4. 데이터베이스/네트워크 연결처럼 접근 비용이 비싸면서 재사용 가능
한 자원을 객체가 캡슐화 할 때
Object Pooling 사용하면 좋은 예02
12
- 메모리 낭비 가능성
- 사용 가능 객체 개수가 정해져 있을 경우
- 객체를 위한 메모리 크기가 고정되어 있습니다.
1. 메모리 풀에 들어갈 수 있는 객체가 다양할 경우, 가장 큰
자료형에 맞춰야 합니다.
2. 그러므로 객체 크기 별로 풀을 나누는게 좋습니다.
- GC와의 충돌에 주의해야 합니다.
Object Pooling 주의할 점02
13
- 사용한 오브젝트를 풀에 반환 할 때 꼭 해당 객체를 초기화 해줘야
합니다.
- 사용 용도에 따라 오브젝트 풀을 어떻게 사용할 것인지에 대한
전략을 잘 세워야 합니다.
Object Pooling 주의할 점02
14
- 다른 목적으로 사용할 가용 힙 메모리의 양이 줄어든다. 따라서 현재 막
생성한 풀 외에도 메모리를 계속 할당한다면, 가비지 컬렉션이 더욱 자주
실행될 수 있습니다.
- 가비지 컬렉션에 걸리는 시간은 살아있는 오브젝트의 수에 비례하여
증가하기 때문에 매번 더 느려질 수 있습니다.
- 너무 큰 풀을 할당하거나 풀에 있는 오브젝트가 한동안 필요가 없는 상
황에서 풀을 활성화하여 유지한다면, 성능에 지장이 생기게 됩니다.
Object Pooling 단점02
15
- 즉, 오브젝트 풀 오버헤드(오브젝트 풀을 사용하지 않았을 때 생기는 메
모리 부하)인 경우에만 사용해야 이득을 볼 수 있다.
- 지속적인 프로파일링을 통해 이득인지 실인지 잘 따져봐야 할 것입니
다.
Object Pooling 단점02
16
실습
언리얼 엔진을 통한 오브젝트 풀링 실습
오브젝트 풀링 실습03
18
오브젝트 풀링 실습03
19
ObjectWithinPool
Actor
오브젝트 풀에 담을
클래스
활성/비활성화 기능
담당
SpawnObjects
Actor
실제 생성되 레벨에
배치될 오브젝트
이번 실습에서는 플
레이할 캐릭터와 같
은 오브젝트를 배치
할 예정입니다.
ObjectPool
ActorComponent
오브젝트 풀을 담당
할 컴포넌트
액터를 미리 생성해
놓고, 액터를 반환
해줄 기능을 담당
ObjectWithinPool에
서 사용
- 풀에 담을 오브젝트를 컨트롤할 액터
클래스를 생성합니다.
- 활성/비활성이 가능하도록 멤버 변수
및 함수 생성 합니다.
- 일정 시간이 지나면 오브젝트를 자동으
로 비활성화 해주도록 액터의
SetLifeSpan을 오버라이드합니다.
실습03
20
실습03
21
- ObjectWithinPool 액터에 오브젝트 풀링 기능을 담당할 ActorComponent클래스
를 생성합니다.
- 정의할 기능으로는
1. 풀에서 오브젝트를 꺼내오는 기능
2. 오브젝트 풀에 담을 클래스 정의
3. 풀 사이즈만큼 오브젝트를 저장해놓을 Tarray를 정의.
실습03
22
실습03
23
실습03
24
- 실제 생성될 오브젝트를 정의합니다.
- BoxComponent를 RootComponent로 사용하기
위해 정의했습니다.
- 오브젝트 풀에서 오브젝트를 가져오기 위해
ObjectPool 객체를 선언하였습니다.
- 생명주기를 엔진에서 컨트롤 할 수 있도록
LifeSpan, SpawnCooldown을 UPROPERTY로, 그
리고 스폰 주기를 체크할 Timer를 선언했습니다.
- 생성할 때 사용할 함수 Spawn()을 선언해주었습
니다.
실습03
6
실습03
26
실습03
27
- ObjectWithinPool 클래스와 SpawnObject를
사용하기 위해 C++클래스를 블루프린트 클래
스로 생성해주었습니다.
실습03
28
- 캐릭터와 똑같은 모습
을 보여주기 위해
SkeletalMesh 컴포넌트
를 추가해서 캐릭터를
표현하고, 애니메이션
블루프린트를 추가해
Idle모션을 추가해주었
습니다.
- 정면을 바라볼 수 있
도록 Rotation Z축을 -90
도로 변경해주었습니다.
실습03
29
- 마지막으로 만들어놨던 SpawnObject 블루프
린트를 월드에 배치해줍니다.
- C++에서 ObjectPool ActorComponent를 생성
해줬기 때문에 디테일 패널에 추가가 되있는 것
을 볼 수 있습니다.
- 좀 더 빠른 재생성을 보여드리기 위해
LifeSpan과 Spawn Cooldown의 값을 일부 조절
했습니다.
결과03
6
마무리
총정리
- 오브젝트 풀링의 구현 방법은 게임마다, 또는 상황마다 상이하므로 때
에 맞춰 구현하시면 됩니다.
- 핵심은 이미 있는, 또는 미리 만들어 놓은 오브젝트를 재사용함으로써
오브젝트 생성과 삭제의 오버헤드를 피한다는 것입니다.
- 다시 한번 강조 드리지만 무조건적인 오브젝트 풀링 방법의 채용은 좋
은 방법은 아닙니다.
- 언제나 지속적인 프로파일링을 통해 필요한 요소에 최적의 풀링 개수
를 선택해서 적용하는 것이 가장 좋은 방법입니다.
마무리04
32
참고 자료04
33
- https://www.slideshare.net/agebreak/ss-75060410
[게임메카닉스] 유니티 오브젝트 풀링 구현하기
- https://www.slideshare.net/agebreak/unite2015-47100325
[Unite2015] 유니티 최적화 테크닉 총정리
- https://glikmakesworld.tistory.com/13
- https://nogan.tistory.com/7
- https://www.youtube.com/watch?v=g4pAO01FFlQ
- https://en.wikipedia.org/wiki/Object_pool_pattern
- https://github.com/TonyChoiMS/OpenWorldTutorial
감사합니다

More Related Content

What's hot

[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능Yongha Kim
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxAAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxTonyCms
 
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규ChangKyu Song
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴예림 임
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019devCAT Studio, NEXON
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리MinGeun Park
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
 
게임 인공지능 설계
게임 인공지능 설계게임 인공지능 설계
게임 인공지능 설계ByungChun2
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019devCAT Studio, NEXON
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍Seungmo Koo
 
Umg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation BoxUmg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation Box대영 노
 
게임 프레임워크의 아키텍쳐와 디자인 패턴
게임 프레임워크의 아키텍쳐와 디자인 패턴게임 프레임워크의 아키텍쳐와 디자인 패턴
게임 프레임워크의 아키텍쳐와 디자인 패턴MinGeun Park
 
190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁KWANGIL KIM
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)Bongseok Cho
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012devCAT Studio, NEXON
 
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기강 민우
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조Hyunjik Bae
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기현철 조
 

What's hot (20)

[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능
 
AAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptxAAA게임_UI_최적화_및_빌드하기.pptx
AAA게임_UI_최적화_및_빌드하기.pptx
 
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
[NDC07] 게임 개발에서의 클라이언트 보안 - 송창규
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
게임 인공지능 설계
게임 인공지능 설계게임 인공지능 설계
게임 인공지능 설계
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
 
Umg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation BoxUmg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation Box
 
게임 프레임워크의 아키텍쳐와 디자인 패턴
게임 프레임워크의 아키텍쳐와 디자인 패턴게임 프레임워크의 아키텍쳐와 디자인 패턴
게임 프레임워크의 아키텍쳐와 디자인 패턴
 
190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
 
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
양승명, 다음 세대 크로스플랫폼 MMORPG 아키텍처, NDC2012
 
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
 
게임 분산 서버 구조
게임 분산 서버 구조게임 분산 서버 구조
게임 분산 서버 구조
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 

Similar to 언리얼을 활용한 오브젝트 풀링

Game programming patterns 2
Game programming patterns 2Game programming patterns 2
Game programming patterns 2QooJuice
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ patternjinho park
 
Effective c++chapter3
Effective c++chapter3Effective c++chapter3
Effective c++chapter3성연 김
 
Effective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummaryEffective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummarySeungYeonChoi10
 
Effective c++chapter8
Effective c++chapter8Effective c++chapter8
Effective c++chapter8성연 김
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 patternjinho park
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디quxn6
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13Shin heemin
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준HoJun Sung
 
목 오브젝트(Mock Object)의 이해
목 오브젝트(Mock Object)의 이해목 오브젝트(Mock Object)의 이해
목 오브젝트(Mock Object)의 이해Yong Hoon Kim
 
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - PerfornanceGCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance상현 조
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장 Shin heemin
 
Effective STL 1~4장 정리
Effective STL 1~4장 정리Effective STL 1~4장 정리
Effective STL 1~4장 정리Shin heemin
 
04 안드로이드 응용프로그램의 구조
04 안드로이드 응용프로그램의 구조04 안드로이드 응용프로그램의 구조
04 안드로이드 응용프로그램의 구조Wanbok Choi
 

Similar to 언리얼을 활용한 오브젝트 풀링 (17)

Game programming patterns 2
Game programming patterns 2Game programming patterns 2
Game programming patterns 2
 
MEC++ 5
MEC++ 5MEC++ 5
MEC++ 5
 
LLVM ARC
LLVM ARCLLVM ARC
LLVM ARC
 
Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
 
Effective c++chapter3
Effective c++chapter3Effective c++chapter3
Effective c++chapter3
 
Effective C++ Chapter 3 Summary
Effective C++ Chapter 3 SummaryEffective C++ Chapter 3 Summary
Effective C++ Chapter 3 Summary
 
Effective c++chapter8
Effective c++chapter8Effective c++chapter8
Effective c++chapter8
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
목 오브젝트(Mock Object)의 이해
목 오브젝트(Mock Object)의 이해목 오브젝트(Mock Object)의 이해
목 오브젝트(Mock Object)의 이해
 
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - PerfornanceGCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
GCGC- CGCII 서버 엔진에 적용된 기술 (2) - Perfornance
 
12books
12books12books
12books
 
Effective c++ 1~8장
Effective c++ 1~8장 Effective c++ 1~8장
Effective c++ 1~8장
 
Effective STL 1~4장 정리
Effective STL 1~4장 정리Effective STL 1~4장 정리
Effective STL 1~4장 정리
 
04 안드로이드 응용프로그램의 구조
04 안드로이드 응용프로그램의 구조04 안드로이드 응용프로그램의 구조
04 안드로이드 응용프로그램의 구조
 

More from TonyCms

Unreal_SubSystem.pptx
Unreal_SubSystem.pptxUnreal_SubSystem.pptx
Unreal_SubSystem.pptxTonyCms
 
Unreal_GameAbilitySystem.pptx
Unreal_GameAbilitySystem.pptxUnreal_GameAbilitySystem.pptx
Unreal_GameAbilitySystem.pptxTonyCms
 
Unreal python
Unreal pythonUnreal python
Unreal pythonTonyCms
 
Effective cpp
Effective cppEffective cpp
Effective cppTonyCms
 
Unreal animation system
Unreal animation systemUnreal animation system
Unreal animation systemTonyCms
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식TonyCms
 
Unreal perception
Unreal perceptionUnreal perception
Unreal perceptionTonyCms
 
About matinee
About matineeAbout matinee
About matineeTonyCms
 
읽기 좋은 코드가 좋은 코드다.
읽기 좋은 코드가 좋은 코드다.읽기 좋은 코드가 좋은 코드다.
읽기 좋은 코드가 좋은 코드다.TonyCms
 
Cascade Shadow Map
Cascade Shadow MapCascade Shadow Map
Cascade Shadow MapTonyCms
 

More from TonyCms (10)

Unreal_SubSystem.pptx
Unreal_SubSystem.pptxUnreal_SubSystem.pptx
Unreal_SubSystem.pptx
 
Unreal_GameAbilitySystem.pptx
Unreal_GameAbilitySystem.pptxUnreal_GameAbilitySystem.pptx
Unreal_GameAbilitySystem.pptx
 
Unreal python
Unreal pythonUnreal python
Unreal python
 
Effective cpp
Effective cppEffective cpp
Effective cpp
 
Unreal animation system
Unreal animation systemUnreal animation system
Unreal animation system
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식
 
Unreal perception
Unreal perceptionUnreal perception
Unreal perception
 
About matinee
About matineeAbout matinee
About matinee
 
읽기 좋은 코드가 좋은 코드다.
읽기 좋은 코드가 좋은 코드다.읽기 좋은 코드가 좋은 코드다.
읽기 좋은 코드가 좋은 코드다.
 
Cascade Shadow Map
Cascade Shadow MapCascade Shadow Map
Cascade Shadow Map
 

언리얼을 활용한 오브젝트 풀링

  • 4. 게임을 개발함에 있어서 인스턴스의 생성과 삭제는 굉장히 빈번하게 일 어나게 됩니다. 오브젝트 생성과 삭제01 4
  • 5. 인스턴스의 생성과 삭제는 매우 무거운 작업입니다. 동적으로 생성된 인스턴스는 힙 메모리에 할당되고, 해당 메모리를 다시 해제해줘야하는 작업을 해야하기 때문이죠. 오브젝트 생성과 삭제01 5
  • 6. - 오브젝트의 잦은 생성과 삭제는 메모리 단편화 문제가 생기게 됩니다. * 외부 메모리 단편화 오브젝트 생성과 삭제01 6
  • 7. - 오브젝트 풀링은 이러한 문제들을 해결하기 위해 사용되고 있습니다. 오브젝트 생성과 삭제01 7
  • 9. - 디자인 패턴의 일종(객체 풀[Object Pool]) - 짧게 사용하고 사라진 뒤에 다시 사용하는 오브젝트의 경우 매번 다시 생성/해제를 반복하게 되면 메모리 부하가 심해집니다. - 객체를 매번 할당, 해제하지 않고 고정 크기 풀에 들어 있는 객체를 재 사용함으로써 메모리 사용 성능을 개선합니다. - 메모리 단편화를 방지합니다. Object Pooling02 9
  • 10. - 화면에 보이지 않게만 하고(Deactive) 메모리를 해제하지 않은 채로 필 요할 때마다 다시 사용하는 기법 - 메모리 할당을 더 간단하게 할 수 있고, 동적 메모리 할당 오버헤드와 가비지 컬렉션(GC)을 줄일 수 있습니다. - 게임이란 도중에 렉이 걸리는 것보단, 로딩이 오래 걸리는 것이 유저 경 험에 있어서 더욱 이롭습니다. Object Pooling01 10
  • 11. 1. 오브젝트 생성 시 요구되는 높은 비용을 피하기 위해. 2. 빠른 객체의 초기화 속도 3. 적은 오브젝트의 수로도 많은 오브젝트를 표현할 수 있는점. 4. GC로 인한 프레임 드랍 회피. Object Pooling 사용하는 이유02 11
  • 12. 1. 객체를 빈번하게 생성/삭제하는 경우 2. 객체를 힙에 생성하기가 느리거나, 메모리 단편화가 우려되는 경우 3. 오브젝트 생성과 삭제함에 있어 병목현상이 발견되는 경우 ex) 게임을 표현함에 있어 많은 오브젝트가 필요한 경우 4. 데이터베이스/네트워크 연결처럼 접근 비용이 비싸면서 재사용 가능 한 자원을 객체가 캡슐화 할 때 Object Pooling 사용하면 좋은 예02 12
  • 13. - 메모리 낭비 가능성 - 사용 가능 객체 개수가 정해져 있을 경우 - 객체를 위한 메모리 크기가 고정되어 있습니다. 1. 메모리 풀에 들어갈 수 있는 객체가 다양할 경우, 가장 큰 자료형에 맞춰야 합니다. 2. 그러므로 객체 크기 별로 풀을 나누는게 좋습니다. - GC와의 충돌에 주의해야 합니다. Object Pooling 주의할 점02 13
  • 14. - 사용한 오브젝트를 풀에 반환 할 때 꼭 해당 객체를 초기화 해줘야 합니다. - 사용 용도에 따라 오브젝트 풀을 어떻게 사용할 것인지에 대한 전략을 잘 세워야 합니다. Object Pooling 주의할 점02 14
  • 15. - 다른 목적으로 사용할 가용 힙 메모리의 양이 줄어든다. 따라서 현재 막 생성한 풀 외에도 메모리를 계속 할당한다면, 가비지 컬렉션이 더욱 자주 실행될 수 있습니다. - 가비지 컬렉션에 걸리는 시간은 살아있는 오브젝트의 수에 비례하여 증가하기 때문에 매번 더 느려질 수 있습니다. - 너무 큰 풀을 할당하거나 풀에 있는 오브젝트가 한동안 필요가 없는 상 황에서 풀을 활성화하여 유지한다면, 성능에 지장이 생기게 됩니다. Object Pooling 단점02 15
  • 16. - 즉, 오브젝트 풀 오버헤드(오브젝트 풀을 사용하지 않았을 때 생기는 메 모리 부하)인 경우에만 사용해야 이득을 볼 수 있다. - 지속적인 프로파일링을 통해 이득인지 실인지 잘 따져봐야 할 것입니 다. Object Pooling 단점02 16
  • 17. 실습 언리얼 엔진을 통한 오브젝트 풀링 실습
  • 19. 오브젝트 풀링 실습03 19 ObjectWithinPool Actor 오브젝트 풀에 담을 클래스 활성/비활성화 기능 담당 SpawnObjects Actor 실제 생성되 레벨에 배치될 오브젝트 이번 실습에서는 플 레이할 캐릭터와 같 은 오브젝트를 배치 할 예정입니다. ObjectPool ActorComponent 오브젝트 풀을 담당 할 컴포넌트 액터를 미리 생성해 놓고, 액터를 반환 해줄 기능을 담당 ObjectWithinPool에 서 사용
  • 20. - 풀에 담을 오브젝트를 컨트롤할 액터 클래스를 생성합니다. - 활성/비활성이 가능하도록 멤버 변수 및 함수 생성 합니다. - 일정 시간이 지나면 오브젝트를 자동으 로 비활성화 해주도록 액터의 SetLifeSpan을 오버라이드합니다. 실습03 20
  • 22. - ObjectWithinPool 액터에 오브젝트 풀링 기능을 담당할 ActorComponent클래스 를 생성합니다. - 정의할 기능으로는 1. 풀에서 오브젝트를 꺼내오는 기능 2. 오브젝트 풀에 담을 클래스 정의 3. 풀 사이즈만큼 오브젝트를 저장해놓을 Tarray를 정의. 실습03 22
  • 25. - 실제 생성될 오브젝트를 정의합니다. - BoxComponent를 RootComponent로 사용하기 위해 정의했습니다. - 오브젝트 풀에서 오브젝트를 가져오기 위해 ObjectPool 객체를 선언하였습니다. - 생명주기를 엔진에서 컨트롤 할 수 있도록 LifeSpan, SpawnCooldown을 UPROPERTY로, 그 리고 스폰 주기를 체크할 Timer를 선언했습니다. - 생성할 때 사용할 함수 Spawn()을 선언해주었습 니다. 실습03 6
  • 27. 실습03 27 - ObjectWithinPool 클래스와 SpawnObject를 사용하기 위해 C++클래스를 블루프린트 클래 스로 생성해주었습니다.
  • 28. 실습03 28 - 캐릭터와 똑같은 모습 을 보여주기 위해 SkeletalMesh 컴포넌트 를 추가해서 캐릭터를 표현하고, 애니메이션 블루프린트를 추가해 Idle모션을 추가해주었 습니다. - 정면을 바라볼 수 있 도록 Rotation Z축을 -90 도로 변경해주었습니다.
  • 29. 실습03 29 - 마지막으로 만들어놨던 SpawnObject 블루프 린트를 월드에 배치해줍니다. - C++에서 ObjectPool ActorComponent를 생성 해줬기 때문에 디테일 패널에 추가가 되있는 것 을 볼 수 있습니다. - 좀 더 빠른 재생성을 보여드리기 위해 LifeSpan과 Spawn Cooldown의 값을 일부 조절 했습니다.
  • 32. - 오브젝트 풀링의 구현 방법은 게임마다, 또는 상황마다 상이하므로 때 에 맞춰 구현하시면 됩니다. - 핵심은 이미 있는, 또는 미리 만들어 놓은 오브젝트를 재사용함으로써 오브젝트 생성과 삭제의 오버헤드를 피한다는 것입니다. - 다시 한번 강조 드리지만 무조건적인 오브젝트 풀링 방법의 채용은 좋 은 방법은 아닙니다. - 언제나 지속적인 프로파일링을 통해 필요한 요소에 최적의 풀링 개수 를 선택해서 적용하는 것이 가장 좋은 방법입니다. 마무리04 32
  • 33. 참고 자료04 33 - https://www.slideshare.net/agebreak/ss-75060410 [게임메카닉스] 유니티 오브젝트 풀링 구현하기 - https://www.slideshare.net/agebreak/unite2015-47100325 [Unite2015] 유니티 최적화 테크닉 총정리 - https://glikmakesworld.tistory.com/13 - https://nogan.tistory.com/7 - https://www.youtube.com/watch?v=g4pAO01FFlQ - https://en.wikipedia.org/wiki/Object_pool_pattern - https://github.com/TonyChoiMS/OpenWorldTutorial