[유니티] 18강 풀 메모리1
슈팅 게임에서 총알을 쏘는 장면을 상상해보자.
1. 총알을 만든다.
2. 총알에 방향과 속도를 넣어서 날아가게 한다.
3. 비행 물체와 부딪힌다. (5번으로)
4. (3이 일어나지 않고) 화면에서 벗어난다.
5. 총알을 파괴한다.
런타임중에 1과 5의 과정이 반복적으로 일어나면 부하가 많이 발생하고 속도 저하의 원인이 된다.
그걸 개선하기 위해서, 필요한 총알을 미리 만들어 두고, 필요할때마다 사용하고, 다 사용하면 원위치 시키는 방식이다.
이론적인 부분은 단순하고, 구현은 제각각 편할데로 만들면 된다.
게임에서 풀 메모리가 필수적인 부분이라 다양한 구현 방법을 알아두는게 좋다.
1. 객체 Hero를 만들고, 스크립트 파일(Hero.cs)을 추가한다.
2. 스크립트 파일(Hero.cs)에 방향키를 누르면 움직이고, 스페이스를 누르면 총알을 쏘는 함수까지 추가한다.
3. Prefabs로 Ball을 만든다.
객체 Hero를 만드는것 처럼, Ball객체를 만들고, 스크립트 파일(Ball.cs)을 추가한다.
방금 만든 객체를 Assets/Prefabs/ 옮긴다. 그리고는 Scene에 있는 Ball객체를 삭제한다.
4. 3에서 만든 Ball을 호출하는 방법이다.
GameObject go = GameObject.Instantiate(prefabs)로 객체를 인스턴스로 생성 및 방향을 설정한다.
해당 인스턴스 객체는 Update()함수가 불리면서 설정한 방향으로 날아가다가, 화면에 벗어나면
GameObject.Destroy(go)로 객체가 파괴된다.
Prefabs/Ball 을 삭제하고, 이번에는 Resources/Empty 객체를 만든다.(설정은 아무것도 건드리지 않는다.)
Inspector가 아니라, 소스 코드에서 리소스에 접근해서 지정할 수 있다.
유니티 버전업이 되어 호환성에 문제가 발생하여 수정해야 할 경우나, 프로젝트 덩치가 커져서 생성된 객체가 너무 많으면 찾기가 어려울 경우 등 (길게 멀리 보면) 코드에서 처리하는게 유리하다.
이번에는 Prefabs를 사용하지 않고 구현해보자.
Hierachy에 Empty객체가 보이고 Game뷰에 기본적으로 놓여있다.
Prefabs를 로드한것처럼 하기 위해서
1. prefabBall.hideFlags = HideFlags.HideInHierarchy; 로 Hierachy에 안보이게 숨길 수 있다.
2. prefabBall.SetActive(false); 로 Game뷰에서 안보이게 할 수 있다.(Update함수 실행도 막는다)
3. GameObject go = GameObject.Instantiate(prefabBall); 비활성화 오브젝트를 만든다음 바로 go.SetActive(true); 로 바로활성화한다.
3단계를 거쳐서 완벽하게 Prefabs를 사용한것과 동일하게 실행된다.
그럼, prefabs를 만들어서 똑같이 실행할 방법은 없을까?
매크로의 코드 대체 부분대로 한다면, prefabs와 동일한 결과가 나온다.
다만, 실행후 스샷의 왼쪽처럼 prefabs가 만들어지고 없어지지 않는다. 저장되는것이 싫어서 HideFlags.DontSave 설정을 해보았지만, 먹히지 않는다. 이렇게 찝찝할바엔 안 쓰는게 좋겠다.
현재로는
prefabBall.hideFlags = HideFlags.HideInHierarchy;
prefabBall.SetActive(false);
가 최선책으로 결정하고, 차차 더 나은 방법을 찾도록 살펴봐야겠다.
자~ 그럼 이미 만들어진 객체를 Instantiate 함수를 호출할때, 1) 객체를 new & copy를 하는걸까요? 2) 맵핑되어 있는 메모리의 주소값에서 copy만하고 주소값을 받는걸까요? 만약 후자 2)라면 풀메모리가 완성된것이 아닐까?
의미적으로 이미 풀메모리가 완성된 상태 같은데..
그래도 풀 메모리를 사용하라고 하는 이유는...뭘까라는 의구심이 발동한다.
맞다 유니티에서 인정하지 않는 부분이겠지. Hierachy에 생성, 파괴가 되는것이 부하가 걸릴것 같은 촉이 서지 않는가?
생성 및 파괴가 반복으로, 부하가 걸려서 렌더링 속도가 저하된다.
이번 강의는 길어져서 다음 19강에서 해결책을 알아보자.
-끗-