본문 바로가기
유니티5 독학 & 게임 제작

유니티5 독학하기 그 95.2번째 걸음-메모리 풀링의 발사체 적용 part1

by 인터넷떠돌이 2018. 10. 27.
반응형

안녕하세요?


지난번 포스팅에서 어떻게 발사체로 레이져가 나가는 것을 구현하는 데 성공했지만, 여기서 하나 심각하게 만들 수도 있다는 문제가 하나 있습니다.



일반적인 방법에서는 총알과 같은 발사체를 발사하는 명령이 내려지면, initiate()함수를 이용해서 총알을 생성해서 날리다가 일정 시점이 되면 Destroy()함수를 호출해서 생성된 발사체를 제거하라는 명령을 내려줍니다. 그런데 듣자니 이 유니티의 스크립트에서 사용하는 C#이라는 언어에서는 '가비지 컬렉터 = CG'라는 것이 있는데, 제가 알아본 바로는 물체가 제거되면 메모리에서 자동으로 제거해 주는 장치라고 합니다.


문제는 Destroy()함수가 호출이 되면, 바로 직후에 CG가 불려오는데, 이 CG를 너무 많이 호출하면 시스템에 많은 부하가 걸려서 소위 예기치 못한 렉이 발생할 수 있다고 합니다.



그래서 사용되는 기법이 '메모리 풀링(Memory Pooling)'이라는 방법인데, 미리 총알과 같은 발사체를 메모리상에서 만든 다음에 발사 명령이 내려오면 활성화 시킨 다음에, 이 총알을 게임상에서 제거해야 할 경우-화면 밖으로 날라 갔거나 하는 경우라면 비활성화 시켜서 도로 메모리 안으로 돌려 보내는 방법입니다. 이 방법의 장점은 Destroy()함수를 사용하지 않아서 CG의 호출 없이 게임이 진행 된다는 것 입니다.



일단 [http://eskeptor.tistory.com/75] 이곳에서 세로 방향으로 진행하는 비행기 슈팅게임에서 사용하는 메모리 풀링 소스가 있어서 이를 적극적으로 활용 하고자 합니다.



먼저 유니티5로 와서, Scripts폴더에 MemoryPool.cs라는 C# 스크립트를 만들어 보도록 합니다.




다음으로는 복사해온 소스코드를 비쥬얼 스튜디오에서 붙여넣기를 해 봅니다.



이것으로 일단 메모리 풀링을 사용할 준비가 되었으니, 이제 BulletCreate.cs 스크립트로 가서 다소간의 수정을 해줘야 합니다.



먼저 스크립트의 첫머리 부분에 광역변수를 선언해 주는데, 여기다가 3가지 종류의 변수를 선언해 주는데, 여기서 눈길을 끄는 것이 하나 있는데, 바로 private MemoryPool MPool; 인데, 다른 클랙스-유니티5를 쓰는 기준에서는 그냥 다른 스크립트를 변수의 타입으로 만들 수 있는 것으로 볼 수 있습니다.



그래고 게임이 종료되면 자동으로 호출되는 함수인 OnApplicationQuit()라는 함수가 있는데, 여기서는 메모리 풀 자체를 종료하라는 명령어를 가져 그냥 간단하게 [클래스 형식의 변수.클래스 안의 사용자 정의 함수()] 이런 식으로 쓸 수 있다는 것을 볼 수 있습니다.




그리고 나서 Start()함수에서는 위 스크린샷과 같이 우선 [클래스 형식의 변수 = new 클래스명();] 이라는 명령어로 클래스 명을 초기화 시킬 수 있다는 것을 알 수 있었습니다. 역시 마찬가지로 [배열 형식의 변수 = new GameObject[정수];] 라는 형식으로 배열안의 모든 값을 초기화 = null로 만들 수 있습니다.



그리고 무심코 지나쳤던 것인데 new라는 연산자는 개세를 만들고 생성자를 호출하는데 사용이 된다는 것을 알 수 있었습니다.



그리고 여기서 MPool.Create(bulletShot, MaxBulletPool)이라는 것을 볼 수 있는데, 이렇게 instance라는 명령어를 바로 쓰지 않고도, MemoryPool.cs에 있는 사용자 정의 함수를 사용할 수 있습니다.



실제로 이 Create()라는 함수의 내용을 보면, 배열을 생성해서 원본이 되는 프리펩을 게임 오브젝트로서 배열에 넣는 것을 볼 수 있습니다. 원래는 더 나아가야 하지만, 내용이 너무 길어서 여기서 끊도록 해 보겠습니다. 사실은 여기서도 더 많은 내용이 들어가야 하지만, 나머지 내용은 다음 포스팅에서 이어서 올리도록 하겠습니다.

반응형