본문 바로가기

Unity Heap Memory 구조 Unity는 Code 영역을 제외하고 크게 두가지 Heap Memory를 관리한다. Native heap Memory(Unity Engine이 관리하는 Memory) Unity Engine이 내부적으로 C++로 구현되어 있기 때문에 Native Heap이다.Unity Engine이 OS로부터 memory를 할당받아 texture, sound, level data등을 저장하고 있는 영역으로unity engine이 담당하여 scene전환이 일어날 떄 필요없게 된 resource를 해제하는 작업을 engine이 자동으로 수행한다. Engine에 의해 memory가 자동으로 해제되지 않는 경우 DontDestroyOnLoad( ) 함수를 통해 개발자가 scene전환이 일어나도 memory가 해제되지 않도록 설정..
Mono / Mono Behaviour Mono Mono는 .NET Framework의 open source platform으로서 cross-platform application의 개발을 지원한다.C# 과 CLI에 기반을 두고있다. Unity의 Mono Unity Scripting system의 기반이다..NET에 깁나하지만 다른 여러 프로그래밍 언어를 지원하는 .NET과 달리 C#, Boo, Javascript만 지원한다. Scripting Language Scripting Language 혹은 extension language는 하나 이상의 application에서 script를 지원하는 프로그래밍의 부분집합(Subset)이다. Script Script는 Application의 core code와는 별개의 언어로서 최종 사용자에 의해 작성..
IL2CPP / GCC / C# C++ Assembly 변환과정 IL(Intermediate Language) CIL과 동일한 중간단계 언어이다. IL2CPP msc.exe를 이용하여 IL code를 생성한 후에 il2cpp.exe라는 프로그램을 이용해 IL code를 C++형태로 변환한다.AOT컴파일방식을 사용하며 mono보다 빌드 시간이 더 길다.(unity 2017에서 IL2CPP는 .NET 4.6 API를 지원한다.) P.S) mono framework에서는 C++로 변환하는 과정없이 IL을 바로 Assembly로 변환한다.IOS에서는 mono는 지원하지 않고 IL2CPP만 지원한다. 또한 Mono로 build하는것보다 IL2CPP로 Build를 하게될 경우 보안성이 우수해진다.mono로 build하였을 경우 apk file 내부에 Assembly-CSharp..
POD / Standard Layout Type / Trivial Type POD(Plain Old Data) 메모리 상에서 연속적인 바이트열을 뜻한다. 실행시간 다형성이나 유저가 정의한 copy constructor등과 같은 진보된 constructor 문법이 필요없을때 객체를 POD로 취급한다. POD로 취급하게되면 하드웨어에서 좀더 효율적으로 객체를 옮기거나 복사할 수 있다. 즉 POD는 class layout이나 user가 정의한 constructor, copy, move constructor등의 복잡성에 대한 고려없이 data 자체로 취급할 수 있는 객체이다. POD객체는 다음 조건을 갖춰야 한다. 표준 레이아웃 타입(Standard layout type)이어야 한다. 간단한 타입(Trivial type)이어야 한다. Standard layout type 기본적으로 s..
객체초기화 ' = ' , ' ( ) ' 의 차이점 객체 초기화시 ( '=' ) 와 ( '( )' )의 차이점 ' = ' 사용 기본 생성자 호출 후에 초기화기본 생성자를 호출 하고 복사대입연산자 ' = ' 를 호출한다. ' ( ) ' 사용 기본생성자의 인자로 초기화값을 사용복사생성자를 한번만 호출, 효율적이다. P.S)Test T = new Test;Test T2 = new Test( ); Test의 생성자가 default 생성자일 경우 위 2줄의 차이점 T의 경우 객체가 초기화 되지 않음T2의 경우 POD이기 때문에 0으로 초기화가 됨
IOCP IOCP(I/O Completion Port) 멀티스레드 윈속서버 프로그램의 경우 user한명당 thread가 1개씩 할당이 된다. 사용자수가 많아지면 thread의 동적생성과 thread간의 잦은 context switching으로 인한 overhead가 크게 증가한다. 이러한 점을 극복하기 위해 IOCP가 만들어졌다. IOCP는 하나의 thread가 하나 이상의 user request를 처리할 수 있도록 해준다. 즉 thread의 개수를 줄여 context switching의 횟수를 줄여 비용을 절감하는 개념이다. Multi thread programming에서 유용하게 사용할 수 있으며 그중에서도 socket이나 file, mail slot, Pipe와 같은 입출력 관련 프로그램에서 유용하게 사용된..
const / #define / constexpr 차이점 const read only data memory에 할당됨 = 주소를 직접 건들이면 const값 변경가능 type을 명시적으로 기록해서 조금 더 안전하다. #define와 같은용도로 사용된 const의경우 release로 build하면 compiler가 자동으로 삭제해준다. const는 값에 대해서만 한정지을 수 있어 충분히 compile time에도 할 수 있는 연산도 run time에 해야한다. #define 메모리에 올라가지 않음 = 임베디드처럼 memory가 부족한 곳에서는 사용해야한다. type을 기록하지 않음 초기 C언어에서 const가 없을때 사용했었음 constexpr 변수 함수, 클래스를 compile time에 정수로 사용할 수 있다. 즉 상수로 취급할 수 있는 작업은 compile t..
Smart Pointer Smart Pointer(RAII객체, 클래스) RAII(Resource Acquisition Is Initialization) C++에서 자주 쓰이는 idiom으로 resource의 안전한 사용을 위해 객체가 쓰이는 scope를 벗어나면 자원을 해제해 주는 기법이다.heap에 쌓이는 자원은 명시적으로 해제해주지 않으면 memory leak이 발생하는데stack에서 사용되는 자원은 명시적으로 해제해주지 않아도 자신의 scope가 종료되면 자동으로 해제된다는 원리를 이용한것 unique_ptr 하나의 smart pointer만이 특정 객체를 소유할 수 있도록, 객체에 소유권 개념을 도입한 smart pointer해당 객체의 소유권을 가지고 있을때만 소멸자가 해당 객체를 삭제할 수 있음move( )함수로 소..