LeiHatia's Note

개인적인 작업 및 잡담을 기록합니다.
0

GML 에서의 변수종류와 메모리 관리법

GML을 쓰면서 배운것도 있지만, 시행착오를 통해서 배운것들도 많다. 그중에서 이번엔 프로그램, 스크립트 언어들에서 가장 기본적인 변수에 대해 적어보도록한다. C++와는 다르게 GML은 기본적으로 스크립트 언어다. 그말인즉, 모든 명령들이 실시간으로 해석되고, 한줄한줄 차례로 번역된다는말이다. 변수 운용또한 약간 다르게 작동된다. GML에는 변수 선언이 기본적으로 세가지가 있다.  

var 변수이름;

변수이름앞에 var를 붙임으로 해서 임시변수를 선언할수있는데, 이렇게 선언된 변수는 선언된 스크립트안에서만 메모리에 할당된다. 스크립트가 끝나면 이 변수는 자동으로 메모리에서 지워진다. 이 변수타입은 보통 일시적으로 메모리에 담을 변수를 선언할때 쓴다. 다른변수와는 다르게 반드시 선언되어야되고, 끝에 ;를 붙여야된다. 예를 들면 반복문인 for, while, do... 이런데서 반복을 콘트롤할때 많이 쓰인다.  

변수이름 = 값;

일반 계산문장과 같은 방식으로 쓰이는 이 변수 타입은 로컬변수로써 쓰이는데, 한번 선언되면 선언된 오브젝트안에서만 존재한다. 오브젝트가 사라지면 해당 변수들도 메모리에서 지워진다. var변수방식과는 다르게 로컬변수들은 오브젝트를 콘트롤할때 많이 쓰이며, 다른 오브젝트에서도 이 변수를 읽어들일수있다. 물론 해당 오브젝트가 메모리에 존재해야된다. 다만, Room이 바뀔때 해당 변수를 가진 오브젝트가 Persistent가 아니면 없어지기때문에 조심해야된다.  

global.변수이름 = 값;

이 변수들은 일단 선언되면 프로그램이 종료될때까지 특정메모리에 상주한다. 선언했던 오브젝트가 메모리에서 없어져도 global변수들은 여전히 메모리에 존재한다. 일반적으로 로컬변수와 같은 방식으로 쓰이나 특정 오브젝트에 묶이지않고 Room이 바뀌어도 global변수들은 항상 존재하기에 오브젝트에 속하지않으면서 메모리에 저장이 필요할때 쓰인다. Game Maker 에서 미리 선언한 global변수들도 있다. 예를들면, health, lives, room등등이 있다. global변수를 선언할때는 두가지 방식이 있다.

global.변수이름 = 값;

이렇게 선언하면 이 변수를 참조할때는 항상 global.변수이름 으로 참조해야된다.

globalvar 변수이름;

이렇게 선언하면 이 변수를 참조할때 변수이름 으로 참조한다.   그리고 마지막으로 변수선언은 아니지만 메모리에 할당이되서 메모리관리에 주의해야되는것이 있다. Data Structure가 그중 하나인데, GML에서는 C++에 있는 포인터가 없는대신 Data Structure와 같은것들이 포인터와 비슷하게 선언된다. Data Sturcture들중 ds_list를 예를 들어보겠다. ds_list를 새롭게 메모리에 할당할때, 변수이름 = ds_list_create(); 이런 함수를 통해 메모리에 할당이 되는데, 여기서 메모리에 할당이 되는것은 두가지이다. 로컬변수와 ds_list data structure이다. 먼저 ds_list_create() 함수를 통해 ds_list가 메모리에 할당이 되고 이것의 id와 같은 것이 변수에 저장이 된다. 이 data structure의 id는 포인터와 같이 해당 ds_list의 메모리위치를 알려준다. 그리고 그 위치정보값이 변수에 저장이 되는것이다. 그렇기때문에 이것들을 사용함에있어서 주의해야될것은 여기서 선언한 변수는 로컬 변수이기에 오브젝트가 없어지면 같이 없어지지만, ds_list는 오브젝트에 속하지않기때문에 없어지지않는다.  프로그램이 종료되기전까지 global변수와 함께 계속 메모리에 상주하게된다. 이렇게되면 메모리누수가 발생하게되는데, 이것을 막기위해 ds_list가 더이상 필요가 없어지면 ds_list_destroy()함수를 통해서 메모리에서 직접 지워줘야된다.

Comments: No comments yet

Post a comment