새 객체를 즉석에서 인스턴스화하는 대신 항상 객체 풀 생성 및 사용을 고려해야하는 이유는 무엇입니까?


25

모범 사례 관점에서이 패턴에 대해 여러 번 읽었습니다.

메모리 할당 : 새 객체를 즉석에서 인스턴스화하는 대신 항상 객체 풀 생성 및 사용을 고려하십시오. 메모리 조각화를 줄이고 가비지 수집기의 작동을 줄이는 데 도움이됩니다.

그러나 나는 그것이 실제로 무엇을 의미하는지 모른다. 어떻게 구현할 수 있습니까?

예를 들어 Unity 메서드를 GameObject사용하여 인스턴스를 생성 할 수 Instantiate있습니까?

Instantiate(prefab, new Vector3(2.0F, 0, 0), Quaternion.identity);

이 사용을 권장하지 않습니까? 다른 의미가 있습니까?



감사합니다 Hellium 저는 주어진 비디오를 너무 많이 보지 못했지만 텍스트는 "인스턴스화 및 파괴 행위가 비효율적이며 프로젝트 속도를 늦출 수 있습니다"를 이해하는 데 실제로 도움이됩니다.
Muhammad Faizan Khan

1
이 조언은 일반적이지만 모든 게임에 반드시 필요한 것은 아닙니다. 특히 작거나 짧은 데스크톱 게임, 잼 제출 또는 프로토 타입을 제작하는 경우 풀링을 구현할 필요가 없습니다. 내 담금 테스트에서 Unity는 우리가 인정하는 것보다 훨씬 더 큰 산란 및 파괴를 견뎌냅니다. ;) 그러나 쓰레기를 쌓고 싶지 않을 때 긴 게임을하고 나중에 수집 할 때 말더듬을 일으키는 경우 또는 성능에 더 큰 영향을 미치는 모바일 플랫폼을 대상으로하는 경우에는 풀링을 고려하십시오.
DMGregory

감사합니다 @DMGregory 당신이 맞습니다. 우리는 작은 게임에서 객체 풀링에 대해 걱정할 필요가 없습니다. 코딩에 추가 작업이 필요하기 때문입니다.
Muhammad Faizan Khan

1
이것은 매우 일반적인 패턴이지만 "프로파일을 먼저 최적화 한 다음 최적화"규칙으로 조정하십시오. 중요하지 않은 것을 쉽게 최적화 할 수 있습니다.
Cort Ammon-복원 모니카

답변:


41

동일한 프리 팹의 여러 인스턴스를 인스턴스화하려는 경우 객체 풀링 사용에 대해 반드시 생각해야합니다. Unity의 Instantiate 함수를 호출하는 것은 가장 세금이 많이 드는 메소드 호출 중 하나입니다.

객체 풀링은 프리 팹을 사용하기 전에 인스턴스화하는 것입니다. 인스턴스화시 즉시 비활성화되고 필요할 때만 다시 활성화됩니다. 이렇게하면 메모리 사용량이 증가하지만 게임 플레이 중에 인스턴스화되는 CPU 오버 헤드를 피할 수 있습니다.

예를 들어, 현재 런타임에 수백 개의 글 머리 기호를 생성해야하는 글 머리 기호 게임을 만들고 있습니다. 처음에는 게임을 객체 풀링없이 만들려고했지만 결국 2fps 미만의 재난이되었습니다. 이제 게임이 시작되기 전에 500 개의 총알을 모으고 게임은 놀랍도록 빠르게 실행됩니다 (200fps).

개체 풀링을 사용할 수없는 상황이 있습니다. 예를 들어, 플레이어 입력이 생성 된 프리 팹을 지시하는 게임이있는 경우 일반적인 Instantiate 호출을 사용할 수 있습니다. 개체 풀링은 필요한 개체를 미리 알고있을 때만 가능합니다.

Sebastian Lague의 YouTube 자습서는 객체 풀링에 대한 학습을위한 훌륭한 리소스입니다. https://youtu.be/LhqP3EghQ-Q


"인스턴스화 및 파괴 행위는 비효율적이며 프로젝트 속도를 늦출 수 있습니다." 이것이 이유입니다? 그것은 우리가 (활성화 비활성화 또는 다시 총알의 위치를 설정처럼 우리가 다시 해고 할 수 있도록) 조금 더 코드에 있다는 것을 의미 그래서
무하마드 Faizan 칸

12
반복 된 인스턴스화 및 파괴 비용의 주요 기여자로 할당 및 가비지 수집을 언급 할 가치가 있습니다. 충분한 가비지를 생성하면 결국 게임 전체에서 가비지 수집기가 모두 쓸 때까지 기다려야합니다. ;)
DMGregory

3
@corsiKa는 80 년대 시대 최적화가 될 것입니다. Unity는 해당 프리 팹을 비활성화하여 시스템에서 무시할 수 있습니다.
congusbongus

2
"예를 들어, 플레이어 입력에 따라 생성 된 프리 팹이 결정되는 게임이있는 경우 일반적인 Instantiate 호출을 사용할 수밖에 없습니다." -아니에요 시작 (또는 장면로드)시 원하는 크기로 할당 된 서로 다른 프리 팹에 대한 여러 객체 풀을 쉽게 가질 수 있습니다. 또는 원하는 경우 여러 프리 팹 유형을 저장하는 객체 풀도 작동 할 수 있습니다.
Ethan Bierlein

1
@DMGregory 일반적인 GC 환경에서 할당 해제는 대부분의 비용입니다. 일반적인 비 GC 환경에서는 할당 비용이 대부분입니다. 객체 풀링은 두 가지 모두에 효과적입니다. 실제로 동일한 동전의 양면 일뿐입니다. 극단적 인 경우에, 오래된 게임은 게임이 실행되는 동안 메모리 해제 / 할당이 거의 없거나 전혀없는 모든 객체를 get-go에서 "할당"하여 작성되었습니다. 어떤 식 으로든 "풀링"되지 않은 것은 실제로 사용하지 않았습니다. Unity는 많은 실시간 "메타 데이터"를 사용하므로 풀링은 상당히 도움이 될 수 있지만 구현하기가 더 까다로울 수도 있습니다.
Luaan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.