오브젝트 풀링
오늘은 생각만 하고 있었던 오브젝트 풀링을 한번 구현해봤다.
오브젝트 풀링이란 말그대로 오브젝트를 담을 풀을 준비하고 미리 생성해두어 쓸 때 빌려주고,
다 쓰고나면 반납하는 방식을 얘기한다.
동적으로 생성하고 지우고를 반복하면 쓰레기 메모리가 쌓이고, C#의 가비지 컬렉터가 이 메모리를 청소해간다.
조금 조금씩 청소하는것이 아니라 한번 치우러 오면 양에 상관없이 한번에 치우기 때문에 프레임이 튄다.
위와 같은 상황을 미리 방지하고자 오브젝트 풀링을 쓴다.
하지만 미리 생성하고 가지고 있는다는건 그만큼 메모리를 차지하고 있다는 얘기다.
그래서 수십번 instantiate와 오브젝트 풀링을 번갈아가며 프로파일러를 보며 실험을 해봤는데
아직까지 유의미한 차이는 못느꼈다. 언젠간 느낄 날이 올 거라고 생각한다.
유니티도 오브젝트 풀링을 권장한다.
잡담
몇달 전 이제 막 instantiate를 처음 써봤을 때 쯤에 이걸 마구쓰면 회사에서는 시말서를 쓴다 라고 얘기를 들었다.
새로 생성하고 지워대는게 성능에 얼마나 막대한 영향을 끼치는지 듣기만하고
느껴보진 못해서 누군가에게 확실하게 얘기 하지는 못하겠지만
막 배우기 시작한 단계에 들은 얘기중에 가장 기억에 남는 얘기라서 그런지 아직도 instantiate를 사용하는건 조심스럽기도 하다.
그리고 얘가 어떤 영향을 끼치는지 확실히 모르기 때문에 그런것도 있다.
암튼 다른걸 구현하기 바빠서 총알도 일단 instantiate를 써서 마구 마구 생성했었는데
오늘은 이런 불편한 맘을 해소하기위해 오브젝트 풀링을 구현했다.
구현 움짤
왼쪽 하이어라키를 보면 총알 두개가 번갈아가며 나가고 자동으로 반납되어 파괴되는것이 아닌 비활성화 되는 것을 볼 수있다.
동적으로 생성해야 할 것이 한두개가 아니라서 정말 계속 생성해야 하는것들을 오브젝트 풀링으로 구현했다.
처음에는 큐로 오브젝트 풀링을 구현하고 이것을 딕셔너리로 불러오는 방식으로 코드를 짰는데
인터넷에서 유니티에서 API를 제공한다는 사실을 알고 그것을 사용하여 구현했다.
다만 이 api가 어떻게 돌아가는지는 모르겠는데 위치를 초기화 해줘도 재활용하면 반납했던 위치에서 다시 돌아오는 경우가 있어서 총알이 긴 레이저처럼 보인다.
기본 공격만 큐나 스택으로 바꾸던가 해야겠다.
using UnityEngine.pool
이 API는 작년에 나온 API라 강좌도 다른것에 비해 많이 없고 대부분이 영어다.
그리고 유니티도 최신 버전으로 업데이트를 해줘야해서 과감히 올려버렸다.(2021.3.5f1)
UI에 일반 text가 붙은 항목들이 다 없어져서 찾아보니 레거시라는 항목에 다 모아놨다.
이제 tmp를 메인으로 미는건지..
코드는 아래와 같다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Pool;
public class ObjectPool : MonoBehaviour
{
public ObjectPool<GameObject> ObjectManager = new ObjectPool<GameObject>();
private void Awake()
{
ObjectManager = new ObjectPool<GameObject>(
//새로운 오브젝트를 생성할때
createFunc: () =>
{
var CreateObj = Instantiate(prefab);
return CreateObj;
},
//가져갈때
actionOnGet: (Obj) =>
{
Obj.gameObject.SetActive(true);
},
// 다시 가지고 올때
actionOnRelease: (Obj) =>
{
Obj.gameObject.SetActive(false);
},
//타겟 오브젝트에게 적용할 함수
actionOnDestroy: (Obj) =>
{
Destroy(Obj.gameObject);
}, maxSize: 5); //최대로 생성할 사이즈
}
인스턴스를 생성할때 적어줘야 할 매개변수들이 좀 귀찮지만 한번 만들어놓으면 직접 구현하는것보다 훨씬 편하다.
이런식으로 만들어놓고
빌릴때는 변수.Get();
반납할때는 변수.Release(); 를 하면된다.
Unity - Scripting API: ObjectPool<T0> (unity3d.com)
아직 영어 밖에 없는 것 같지만 이것을 참고해도 되고
유니티 오브젝트 풀링 Object Pool (1/2) - YouTube
유일하게 최신 API강좌를 올려주신 레트로님께 감사하며 이 영상을 시청해도 된다.
상점 구현
오브젝트 풀링을 끝마치고 나서 바로 상점을 구현했다.
판매,구매가 가능하게 만들었다.
판매
상점은 구현이 거의 끝나서 판매 하고 나서도 옆에 큰 설명창에서 사라지지 않는것만 고치면 될 것같다.
구매
구매는 딱히 고칠게 안보여서 더 이상 손대지 않아도 될 것 같다.
어느정도 귀찮고 까다로운 작업들은 끝나가서 다행이다.
이제 내일은 오늘 쳐놓은 대사 파일을 가지고 스토리 진행과 퀘스트를 구현 해 볼 생각이다.
지금까지 구현한 시스템들은 크게 아이디어가 없었던 반면에 남은 작업들은 해보고싶은게 많이 있어서 재밌을것같다.
개인포폴 18일차 작업 끝
'개발일지 > Unity 개인 포트폴리오 개발일지' 카테고리의 다른 글
R.I.P 리틀넛 .. 새로운 시작 (0) | 2022.07.08 |
---|---|
개인포폴 19일차 / 알림시스템 수정 & 레벨업 그리고 대화와 퀘스트 (0) | 2022.07.05 |
개인포폴 17일차 / 장비장착 & 퀵슬롯 기능들 구현 (0) | 2022.07.03 |
개인포폴 16일차 / 자잘한 작업들 (0) | 2022.07.02 |
개인포폴 15일차 / 드랍 아이템과 인벤토리 (2) | 2022.07.01 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!