이전 팀프로젝트 때 정리해둔 내용이다.
(제가 직접 한땀한땀 만든 피피티..)
게임 내에서 총알같은 오브젝트를 계속해서 생성하고 파괴하면 C#같은 경우는 가비지 콜렉터를 불러서 이를 처리하는데,
그 때마다 성능이 저하된다.
이를 방지하기 위해 오브젝트 풀에 미리 오브젝트를 일정량 생성해놓고
이를 꺼내와서 쓰고 다시 풀에 넣어두는 방식으로 구현하는 식의 최적화 기법이다.
일정량 이상의 오브젝트가 필요하면 그때그때 더 만들어 쓸 수 있다.
오브젝트 풀링을 구현하는 방법은 여러가지가 있는데 나는 큐 자료구조를 활용했다.
실제 프로젝트 때 작성한 코드이다.
1번. 2번에서 생성된 오브젝트를 큐에 enqueue하고 비활성화 해두기
2번. 매개변수 count만큼 오브젝트를 생성
3번. 다른 스크립트에서 오브젝트를 꺼내 쓰는 함수. 활성화 시켜준다.
큐 안에있는 오브젝트가 부족하면 2번을 호출해 추가로 오브젝트를 생성해준다.
4. 다 쓴 오브젝트를 비활성화 해 큐에 다시 넣어주기
아래 코드는 추가로 오브젝트를 학습하며 정리해둔 코드이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class objectPool : MonoBehaviour
{
//1. 미리 오브젝트들을 많이 생성해두고 콜렉션(리스트, 스택, 큐, etc) dpo 담아둔다.
//2. 미리 만들어둔 오브젝트들을 전부 비활성화 시킨다.
//3. 사용할 때는 활성화시킴
//4. 다쓰면 다시 비활성화
public GameObject bulletPrefab;
Queue<GameObject> bulletPool = new Queue<GameObject>();
void Start()
{
CreateBullet(10);
}
void CreateBullet(int num=1) //변수 설정 안해주면 디폴트값 1로
{
for(int i = 0; i < num; i++)
{
//이것 주의!!!! 프리팹을 가져다 쓰면 안됨. 복제 된 걸 새로운 인스턴스에 담을 것
GameObject bullet=Instantiate(bulletPrefab, transform);
//transfom하면 현재 오브젝트의 자식 오브젝트로 복제(생성)
bullet.SetActive(false);
bulletPool.Enqueue(bullet);
}
}
public GameObject UseBullet()
{
if (bulletPool.Count > 0)
{
GameObject bullet = bulletPool.Dequeue();
bullet.SetActive(true);
return bullet;
}
else
{
CreateBullet(5); //디폴트값1, 그냥 넉넉하게 해주는게 좋음
GameObject bullet = bulletPool.Dequeue();
bullet.SetActive(true);
return bullet;
}
}
public void GetBackBullet(GameObject bullet)
{
bullet.SetActive(false);
bulletPool.Enqueue(bullet);
}
}
'C# > C# 학습 (TIL)' 카테고리의 다른 글
C# 자료형의 특징 , 변수의 특징 - 값 형식 / 참조 형식 데이터 타입 (0) | 2022.06.29 |
---|---|
C# CLR(공통언어런타임) / CIL(공통 중간 언어) / C#의 메모리 관리 방식 (0) | 2022.06.28 |
C# OverlapSphere / 콜라이더 배열 (0) | 2022.06.26 |
유니티 Roll a ball 실습 (0) | 2022.06.26 |
C# 중급문법 Day9 디자인패턴 : 커맨드패턴, 퍼사드패턴 (0) | 2022.06.24 |