Upload
-
View
85
Download
9
Embed Size (px)
Citation preview
1
메모리 최적화를 고려하는 스크립트 작성 in Unity
2015-07-15 이진주
2
Index
01. 유니티의 메모리 영역 02. 유니티와 GC
03. 메모리 최적화 ( 스크립트 )
기타 . - Q&A
- 참조
3
자동 메모리 관리에 대한 환상은 버리고 시작합시다 .
4
01유니티의 메모리 영역
5
01유니티의 메모리 영역
유니티가 사용하는 메모리 종류
CodeMan-agedHeap
NativeHeap
6
01유니티의 메모리 영역
유니티의 메모리 체계
CodeMan-agedHeap
NativeHeap
7
01유니티의 메모리 영역
CodeMan-agedHeap
NativeHeap
코드가 컴파일 되어 로딩되는 영역 최적화 필요성 ?
8
01유니티의 메모리 영역
Application Code 영역 메모리 최적화 http://docs.unity3d.com/410/Documentation/ScriptReference/MonoCompatibility.ht
ml
9
01유니티의 메모리 영역
CodeMan-agedHeap
NativeHeap
instantiated object, variables
Mono Framework “ 관리” 변수나 오브젝트의 참조 유지 – 메모리 유지 Managed Heap 사이즈가 커지면 디바이스 메모리
부족 현상 Garbage Collection
10
01유니티의 메모리 영역
메모리 할당을 위해 System 의 heap block 을 생성
Heap 고갈 시 , Garbage Collector 발동 메모리가 더 필요하면 heap block 추가 생성 추가된 heap block 은 다시 줄어들 수 있으나 ,
문제는 파편화
Garbage Collection?
11
01유니티의 메모리 영역
12
01유니티의 메모리 영역
Object Recycling
System.GC.Collect()
적절한 구조체 활용 (stack)
최적화
13
01유니티의 메모리 영역
CodeMan-agedHeap
NativeHeap
유니티가 OS 에서 메모리 할당 에셋데이터 (texture, mesh, audio, animation…), 에셋 ,
컴포넌트 유니티 엔진의 관리 범위 ?
메모리 부족 사태
14
01유니티의 메모리 영역
Native Heap 영역 메모리 최적화 Asset 이 자동으로 해제되지 않는 경우 Script 내에서 Scene Object 참조 경우 Static 변수 , Singleton 인스턴스 참조
잊지 말고 참조 해제 !
15
02유니티와 GC
16
02유니티와 GC
C# 의 가비지 컬렉터 유니티의 가비지 컬렉터
17
02유니티와 GC
System.GC.Collect() 호출에서의 문제
18
02유니티와 GC
GC 의 호출을 최소화 하는게 요점 !
19
03메모리 최적화 ( 스크립트 )
20
03메모리 최적화 ( 스크립트 )
String 의 경우
“+” 를 할때마다 새로운 string 인스턴스가 생성 ( == 가비지 생성 )
21
03메모리 최적화 ( 스크립트 )
System.Text.StringBuilder – Append/Append-Format 사용
이미 할당된 메모리 공간을 사용해 한번에 string 객체 생성
or
22
03메모리 최적화 ( 스크립트 )
Instance 의 경우 클래스를 인스턴싱 할 때마다 heap 에 메모리 할당 누적되면 GC 작동
※ 주의 - 유니티 vector 는 struct 입니다 . 위 예제의 Vector3 가 클래스라고 가정합니다 .
23
03메모리 최적화 ( 스크립트 )
구조체를 사용
24
03메모리 최적화 ( 스크립트 )
멤버변수를 활용
25
03메모리 최적화 ( 스크립트 )
Boxing 의 경우 C# 에서는 모든 객체가 object 를 상속 Int, float 같은 value type 도 object 상속 사용 가능
26
03메모리 최적화 ( 스크립트 )
여러 type 을 처리해야 하는 경우가 아니라면 Generic Collection 사용
27
03메모리 최적화 ( 스크립트 )
28
03메모리 최적화 ( 스크립트 )
WeakReference.Tartget 을 보관 ( 참조 ) 하지 않도록 주의
WeakReference
29
03메모리 최적화 ( 스크립트 )
IDisposable
C# 에서도 원하는 시점에서 메모리 해제 가능 관리되지 않는 메모리 해제 시 사용하는 인터페이스 모든 type 의 메모리를 정리할 수 있는 장점
30
03메모리 최적화 ( 스크립트 )
Loop 의 경우 성능이 다르다면 어느 루프문을 사용해야 할까 ?
for
foreach
enumerator
31
03메모리 최적화 ( 스크립트 )
결과
32
03메모리 최적화 ( 스크립트 )
Parse String → int / int → String 변환 방법에 따른 성능 테스트
String → int int → String
33
03메모리 최적화 ( 스크립트 )
결과큰 차이가 없음
34
03메모리 최적화 ( 스크립트 )
String
“+”String.ConcatBuilder.Append
35
03메모리 최적화 ( 스크립트 )
Transform caching 유니티에서 transform 에 접근하는 경우 성능의 부담 -> caching
36
03메모리 최적화 ( 스크립트 )
결과 transform 에 자주 접근하게 되는 객체에선 caching 은
선택이 아닌 필수
37
Q&A
38
감사합니다 .
[REFERENCE]
Understanding Automatic Memory Management : http://supersegfault.com/managing-memory-in-unity3d/
Stripping Option : http://docs.unity3d.com/kr/current/Manual/iphone-playerSizeOptimization.html
Managed Heap Manual: http://unity3d.com/support/documentation/Manual/Understanding%20Automatic%20Memory%20Management.html
Unity Heap Memory : http://chfhrqnfrhc.tistory.com/entry/Unity-Heap-Memory-%EA%B5%AC%EC%A1%B0
C# 메모리 관리 기법 : http://kookiandkiki.blogspot.kr