Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Lv2
- 코테
- 수학숙제
- 유니티
- Algorithm
- 백준 17070번
- 프로그래머스
- dfs
- 플레이어 이동
- Lv.3
- 백준
- 2870번 수학숙제
- 백준 c++ 2870번
- 백준 17070번 c++
- Beakjoon
- 백준 c++ 2468번
- 백준 1103번 게임
- Unity
- C#
- 2870번
- 2468 c++
- 2870번 c++
- 17070번
- 백준 2870번
- 백준 1103번
- 오브젝트 풀링
- 백준 1103번 c++
- 2870번 수학숙제 c++
- c++
- 코딩테스트
Archives
- Today
- Total
주녘공부일지
[Unity] 오브젝트 풀링 (Object Pooling) 본문
Object Pooling : 오브젝트를 재활용하기 위한 디자인 패턴 ( 최적화 )
빈번히 생성, 파괴되는 오브젝트들을 풀에 모아서 미리 생성해놓고 활성화 / 비활성화로 관리하며 재사용
- 런타임 중에 수십개의 다른 오브젝트를 생성하고 파괴하는 것은 성능적으로 굉장히 많은 공간을 차지하기 때문에, 미리 생성함으로써 런타임에서의 불필요한 메모리 낭비를 최소화하지만, Loading 시간이 소요됨
- C++은 힙에 메모리 공간을 할당하고 원하는 시점에 삭제할 수 있지만, ( new, delete ) C#은 사용하지 않는 메모리가 생기면 가비지 컬렉트(GC)가 일정 주기마다 메모리를 정리하기 때문에 GC의 실행 시점을 제어하기 위해서도 사용
- 만약, 풀 안에 오브젝트를 가져오려고 할 때, 모든 오브젝트가 사용중이라면 오브젝트를 생성하고 다시 넣으려고 할 때 풀 안의 공간이 차있다면 파괴하여 예외처리를 해놓는 것이 좋지만, 이런 일이 일어난다면 가비지 컬렉트가 실행되어 버림
- pool의 오브젝트 갯수는 너무 작으면 시점 제어를 못하여 랙을 유발시킬 수 있게 되고, 너무 크다면 메모리를 낭비하게 되므로 적당한 개수를 가져야 함
+ 가비지 컬렉터 (GC) : 쌓인 사용하지 않는 메모리를 비우는 기술
( 닷넷프레임워크에서 제공하는 자동메모리관리시스템 )
+ 사용하지 않는 메모리 : Destroy된 객체, 사용이 끝난 지역 변수, 등
대표적 사용 예시 : 총알, 등
사용 예제
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectManager : MonoBehaviour
{
[SerializeField] GameObject bulletPrefab;
GameObject[] bullet;
void Awake()
{
bullet = new GameObject[100];
Generate();
}
void Generate()
{
for (int index = 0; index < bullet.Length; index++)
{
bullet[index] = Instantiate(bulletPrefab);
bullet[index].SetActive(false);
}
}
public GameObject MakeObj(string type)
{
switch (type)
{
case "Bullet":
targetPool = bullet;
break;
default:
Debug.Log("MakeObj() switch not find");
break;
}
for (int index = 0; index < targetPool.Length; index++)
{
if (!targetPool[index].activeSelf)
{
targetPool[index].SetActive(true);
return targetPool[index];
}
}
Debug.Log("MakeObj() return null");
return null;
}
public GameObject[] GetPool(string type)
{
switch (type)
{
case "Bullet":
targetPool = bullet;
break;
default:
Debug.Log("GetPool() switch not find");
break;
}
return targetPool;
}
}
'GameDevelopment > [Unity] Class, Pattern' 카테고리의 다른 글
[Unity3D] position (위치) // 플레이어 이동 예제 (0) | 2022.02.21 |
---|---|
[Unity] 모바일 터치 감지 방법 (0) | 2022.02.16 |
[Unity] ForceMode(ForceMode2D) (0) | 2022.01.26 |
[Unity] Prefab이란? (+ 불러오기) (0) | 2022.01.25 |
[Unity] BoxCollider2D (0) | 2022.01.18 |