38
메메메 메메메메 메메메메 메메메메 메메 in Unity 2015-07-15 이이이 1

메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

  • Upload
    -

  • View
    85

  • Download
    9

Embed Size (px)

Citation preview

Page 1: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

1

메모리 최적화를 고려하는 스크립트 작성 in Unity

2015-07-15 이진주

Page 2: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

2

Index

01. 유니티의 메모리 영역 02. 유니티와 GC

03. 메모리 최적화 ( 스크립트 )

기타 . - Q&A

- 참조

Page 3: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

3

자동 메모리 관리에 대한 환상은 버리고 시작합시다 .

Page 4: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

4

01유니티의 메모리 영역

Page 5: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

5

01유니티의 메모리 영역

유니티가 사용하는 메모리 종류

CodeMan-agedHeap

NativeHeap

Page 6: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

6

01유니티의 메모리 영역

유니티의 메모리 체계

CodeMan-agedHeap

NativeHeap

Page 7: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

7

01유니티의 메모리 영역

CodeMan-agedHeap

NativeHeap

코드가 컴파일 되어 로딩되는 영역 최적화 필요성 ?

Page 8: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

8

01유니티의 메모리 영역

Application Code 영역 메모리 최적화 http://docs.unity3d.com/410/Documentation/ScriptReference/MonoCompatibility.ht

ml

Page 9: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

9

01유니티의 메모리 영역

CodeMan-agedHeap

NativeHeap

instantiated object, variables

Mono Framework “ 관리” 변수나 오브젝트의 참조 유지 – 메모리 유지 Managed Heap 사이즈가 커지면 디바이스 메모리

부족 현상 Garbage Collection

Page 10: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

10

01유니티의 메모리 영역

메모리 할당을 위해 System 의 heap block 을 생성

Heap 고갈 시 , Garbage Collector 발동 메모리가 더 필요하면 heap block 추가 생성 추가된 heap block 은 다시 줄어들 수 있으나 ,

문제는 파편화

Garbage Collection?

Page 11: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

11

01유니티의 메모리 영역

Page 12: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

12

01유니티의 메모리 영역

Object Recycling

System.GC.Collect()

적절한 구조체 활용 (stack)

최적화

Page 13: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

13

01유니티의 메모리 영역

CodeMan-agedHeap

NativeHeap

유니티가 OS 에서 메모리 할당 에셋데이터 (texture, mesh, audio, animation…), 에셋 ,

컴포넌트 유니티 엔진의 관리 범위 ?

메모리 부족 사태

Page 14: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

14

01유니티의 메모리 영역

Native Heap 영역 메모리 최적화 Asset 이 자동으로 해제되지 않는 경우 Script 내에서 Scene Object 참조 경우 Static 변수 , Singleton 인스턴스 참조

잊지 말고 참조 해제 !

Page 15: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

15

02유니티와 GC

Page 16: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

16

02유니티와 GC

C# 의 가비지 컬렉터 유니티의 가비지 컬렉터

Page 17: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

17

02유니티와 GC

System.GC.Collect() 호출에서의 문제

Page 18: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

18

02유니티와 GC

GC 의 호출을 최소화 하는게 요점 !

Page 19: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

19

03메모리 최적화 ( 스크립트 )

Page 20: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

20

03메모리 최적화 ( 스크립트 )

String 의 경우

“+” 를 할때마다 새로운 string 인스턴스가 생성 ( == 가비지 생성 )

Page 21: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

21

03메모리 최적화 ( 스크립트 )

System.Text.StringBuilder – Append/Append-Format 사용

이미 할당된 메모리 공간을 사용해 한번에 string 객체 생성

or

Page 22: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

22

03메모리 최적화 ( 스크립트 )

Instance 의 경우 클래스를 인스턴싱 할 때마다 heap 에 메모리 할당 누적되면 GC 작동

※ 주의 - 유니티 vector 는 struct 입니다 . 위 예제의 Vector3 가 클래스라고 가정합니다 .

Page 23: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

23

03메모리 최적화 ( 스크립트 )

구조체를 사용

Page 24: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

24

03메모리 최적화 ( 스크립트 )

멤버변수를 활용

Page 25: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

25

03메모리 최적화 ( 스크립트 )

Boxing 의 경우 C# 에서는 모든 객체가 object 를 상속 Int, float 같은 value type 도 object 상속 사용 가능

Page 26: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

26

03메모리 최적화 ( 스크립트 )

여러 type 을 처리해야 하는 경우가 아니라면 Generic Collection 사용

Page 28: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

28

03메모리 최적화 ( 스크립트 )

WeakReference.Tartget 을 보관 ( 참조 ) 하지 않도록 주의

WeakReference

Page 29: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

29

03메모리 최적화 ( 스크립트 )

IDisposable

C# 에서도 원하는 시점에서 메모리 해제 가능 관리되지 않는 메모리 해제 시 사용하는 인터페이스 모든 type 의 메모리를 정리할 수 있는 장점

Page 30: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

30

03메모리 최적화 ( 스크립트 )

Loop 의 경우 성능이 다르다면 어느 루프문을 사용해야 할까 ?

for

foreach

enumerator

Page 31: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

31

03메모리 최적화 ( 스크립트 )

결과

Page 32: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

32

03메모리 최적화 ( 스크립트 )

Parse String → int / int → String 변환 방법에 따른 성능 테스트

String → int int → String

Page 33: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

33

03메모리 최적화 ( 스크립트 )

결과큰 차이가 없음

Page 34: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

34

03메모리 최적화 ( 스크립트 )

String

“+”String.ConcatBuilder.Append

Page 35: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

35

03메모리 최적화 ( 스크립트 )

Transform caching 유니티에서 transform 에 접근하는 경우 성능의 부담 -> caching

Page 36: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

36

03메모리 최적화 ( 스크립트 )

결과 transform 에 자주 접근하게 되는 객체에선 caching 은

선택이 아닌 필수

Page 37: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

37

Q&A

Page 38: 메모리 최적화를 고려하는 스크립트 작성 In unity 이진주

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