์„œ๋น„์Šค
๊ต์œก ์ฒ ํ•™

Reference Pool

Abstract

๐Ÿ“Œ
๋ ˆํผ๋Ÿฐ์Šค ํ’€์€ ์ฝ”์–ด์—์„œ ๊ฒŒ์ž„ ์ฝ”๋“œ๊ฐ€ ๊ฐ€์žฅ ์ž์ฃผ ์ง์ ‘ ๋ถ€๋ฅด๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. new ๋กœ ๋งŒ๋“ค๊ณ  ๋ฒ„๋ฆฌ๋˜ ์ž‘์€ ๊ฐ์ฒด๋ฅผ Acquire ๋กœ ๊บผ๋‚ด๊ณ  Release ๋กœ ๋Œ๋ ค๋†“๊ฒŒ ํ•ด์„œ, ํ”Œ๋ ˆ์ด ์ค‘ ๊ฐ€๋น„์ง€๊ฐ€ ์Œ“์ด์ง€ ์•Š๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€๋Š” ๊ทธ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ, Unity ์ชฝ Reference Pooling (๋ ˆํผ๋Ÿฐ์Šค ํ’€๋ง) ํŽ˜์ด์ง€๋Š” ์˜ˆ์ œ ๊ฒŒ์ž„์—์„œ์˜ ์‚ฌ์šฉ ํŒจํ„ด์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
์™œ new ๊ฐ€ ๋ฌธ์ œ์ธ๊ฐ€
๋ฑ€์„œ๋ผ์ดํฌ์—์„œ ์ ์ด ์ดˆ๋‹น 5๋งˆ๋ฆฌ ์ฃฝ๊ณ , ๊ทธ๋•Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ ์ธ์ž ํ•˜๋‚˜์™€ ์—”ํ‹ฐํ‹ฐ ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค. 1๋ถ„์ด๋ฉด 600๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ๋ฒ„๋ ค์ง‘๋‹ˆ๋‹ค. C# ์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” ์ด๊ฒƒ๋“ค์„ ์น˜์šธ ๋•Œ ๊ฒŒ์ž„์„ ์ž ๊น ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ์ด ๋ฉˆ์ถค์ด ๋ˆˆ์— ๋ณด์ด๋Š” ๋Š๊น€์ด ๋ฉ๋‹ˆ๋‹ค. ํ’€์„ ์“ฐ๋ฉด ๊ฐ™์€ ๊ฐ์ฒด ๋ช‡ ๊ฐœ๊ฐ€ ๊ณ„์† ๋Œ๊ธฐ ๋•Œ๋ฌธ์— ์น˜์šธ ๊ฒƒ์ด ์ƒ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‚ด๋ถ€ ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœํ•˜๋‹ค
graph LR
    A["Acquire&lt;T&gt;()"] --> B{"T ํƒ€์ž… ํ์—<br>๋‚จ์€ ๊ฒƒ์ด ์žˆ๋‚˜"}
    B -- ์žˆ๋‹ค --> C["๊บผ๋‚ด์„œ ๋ฐ˜ํ™˜"]
    B -- ์—†๋‹ค --> D["new T() ๋กœ ์ƒ์„ฑ"]
    E["Release(obj)"] --> F["obj.Clear()"] --> G["T ํƒ€์ž… ํ์— ๋„ฃ๊ธฐ"]
Mermaid
๋ณต์‚ฌ
ํƒ€์ž…๋งˆ๋‹ค ํ๊ฐ€ ํ•˜๋‚˜์”ฉ ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ํฌ๊ธฐ ์ œํ•œ๋„, ๋งŒ๋ฃŒ ์‹œ๊ฐ„๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•œ ๋ฒˆ ์ตœ๋Œ€์น˜๊นŒ์ง€ ๋Š˜์–ด๋‚œ ํ’€์€ ์ค„์–ด๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ์ค„์ด๋ ค๋ฉด Remove<T>(count) ๋‚˜ RemoveAll<T>() ๋ฅผ ์ง์ ‘ ๋ถˆ๋Ÿฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์˜ค๋ธŒ์ ํŠธ ํ’€๊ณผ ๋ฌด์—‡์ด ๋‹ค๋ฅธ๊ฐ€
๋ ˆํผ๋Ÿฐ์Šค ํ’€
์˜ค๋ธŒ์ ํŠธ ํ’€
๋Œ€์ƒ
์ˆœ์ˆ˜ C# ๊ฐ์ฒด
๋ฌด์—‡์ด๋“  (์ฃผ๋กœ GameObject, ์—์…‹)
์ ‘๊ทผ
์ •์  ํด๋ž˜์Šค. ์–ด๋””์„œ๋“  ๋ฐ”๋กœ
๋ชจ๋“ˆ. ํ’€์„ ๋จผ์ € ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค
์šฉ๋Ÿ‰ยท๋งŒ๋ฃŒ
์—†์Œ
์žˆ์Œ (Capacity, Expire Time)
์ดˆ๊ธฐํ™” ์ฑ…์ž„
Clear() ํ•œ ๊ณณ
OnSpawn / OnUnspawn / Release
ํ™•์žฅ โ€” ๋ฏธ๋ฆฌ ์ฑ„์›Œ ๋‘๊ธฐ
์ „ํˆฌ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ์ˆœ๊ฐ„ ํ•œ๊บผ๋ฒˆ์— ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ๋Š๊ธฐ๋Š” ๊ฒƒ์ด ๋ณด์ธ๋‹ค๋ฉด, ๋กœ๋”ฉ ํ™”๋ฉด์—์„œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
private const int PrewarmEnemyDataCount = 16; // ๋กœ๋”ฉ Procedure ์—์„œ ReferencePool.Add<EnemyData>(PrewarmEnemyDataCount);
C#
๋ณต์‚ฌ
โš ๏ธ
๋ณธ๋ฌธ์„ ์ฝ์„ ๋•Œ ์ฃผ์˜ํ•  ์ 
โ€ข
๋ณธ๋ฌธ ์˜ˆ์ œ๋Š” GameFrameworkEventArgs ๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด๋ถ€ C# ์ด๋ฒคํŠธ์˜ ์ธ์ž์šฉ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ฝ”๋“œ๊ฐ€ EventComponent ๋กœ ์ฃผ๊ณ ๋ฐ›๋Š” ์ด๋ฒคํŠธ๋Š” GameEventArgs ๋ฅผ ์ƒ์†ํ•ด์•ผ ํ•˜๊ณ , Id ํ”„๋กœํผํ‹ฐ๋„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
ReferencePool.EnableStrictCheck = true; ๋ฅผ ์ฝ”๋“œ์—์„œ ์ง์ ‘ ์“ธ ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค. Unity ์ชฝ ReferencePoolComponent ๊ฐ€ ์ธ์ŠคํŽ™ํ„ฐ ์„ค์ •์— ๋”ฐ๋ผ ์ผœ ์ค๋‹ˆ๋‹ค.
โ€ข
์ด์ค‘ ๋ฐ˜๋‚ฉ์€ Strict Check ๊ฐ€ ์ผœ์ ธ ์žˆ์„ ๋•Œ๋งŒ ์˜ˆ์™ธ๋กœ ์žกํž™๋‹ˆ๋‹ค. ๊บผ์ ธ ์žˆ์œผ๋ฉด ๊ฐ™์€ ๊ฐ์ฒด๊ฐ€ ํ์— ๋‘ ๋ฒˆ ๋“ค์–ด๊ฐ€, ์ดํ›„ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ณณ์ด ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋ฐ›๋Š” ์ฐพ๊ธฐ ์–ด๋ ค์šด ๋ฒ„๊ทธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์ค‘์—๋Š” ๋ฐ˜๋“œ์‹œ ์ผœ ๋‘์„ธ์š”.
โ€ข
"์Šค๋ ˆ๋“œ ์•ˆ์ „"์€ ๋งž์Šต๋‹ˆ๋‹ค(๋‚ด๋ถ€์—์„œ lock ์„ ๊ฒ๋‹ˆ๋‹ค). ๋‹ค๋งŒ ํ’€์—์„œ ๊บผ๋‚ธ ๊ฐ์ฒด ์ž์ฒด๋ฅผ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์ด ์“ฐ๋Š” ๊ฒƒ๊นŒ์ง€ ๋ณดํ˜ธํ•ด ์ฃผ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Reference Pool

๊ด€๋ จ ์†Œ์Šค ํŒŒ์ผ (Relevant source files)

โ€ข
GameFramework/Base/EventPool/BaseEventArgs.cs
โ€ข
GameFramework/Base/GameFrameworkEventArgs.cs
โ€ข
GameFramework/Base/ReferencePool/IReference.cs
โ€ข
GameFramework/Base/ReferencePool/ReferencePool.ReferenceCollection.cs
โ€ข
GameFramework/Base/ReferencePool/ReferencePool.cs
โ€ข
GameFramework/Base/ReferencePool/ReferencePoolInfo.cs
โ€ข
GameFramework/Sound/ResetSoundAgentEventArgs.cs

๋ชฉ์ ๊ณผ ๊ฐœ์š” (Purpose and Overview)

Reference Pool์€ ๊ฐ์ฒด๋ฅผ ๋งค๋ฒˆ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ํŒŒ๊ดดํ•˜๋Š” ๋Œ€์‹  ์žฌ์‚ฌ์šฉํ•ด์„œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC) ๋ถ€ํ•˜๋ฅผ ์ค„์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์ธ์ž ๊ฐ™์€ ๋นˆ๋ฒˆํžˆ ์ƒ์„ฑ๋˜๋Š” ์ž„์‹œ ๊ฐ์ฒด์—์„œ ํŠนํžˆ ํšจ๊ณผ์ ์ด๋ฉฐ, ๊ณผ๋„ํ•œ GC๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ง‰์•„์ค๋‹ˆ๋‹ค.
Reference Pool์€ GameFramework์˜ ์ฝ”์–ด ์ปดํฌ๋„ŒํŠธ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, Object Pool Manager(์˜ค๋ธŒ์ ํŠธ ํ’€)์™€ ํ•จ๊ป˜ ์“ฐ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ดˆ์ ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค(Reference Pool์€ ์ž‘๊ณ  ์งง๊ฒŒ ์‚ฌ๋Š” ๊ฐ์ฒด ์œ„์ฃผ).

ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ (Core Components)

ReferencePool

์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด ๋ชจ์Œ์„ ๊ด€๋ฆฌํ•˜๋Š” ์ •์  ํด๋ž˜์Šค.
โ€ข
ํƒ€์ž…์„ ํ‚ค๋กœ ํ•˜๋Š” ReferenceCollection ์‚ฌ์ „์„ ์œ ์ง€
โ€ข
๊ฐ์ฒด ํš๋“/๋ฐ˜๋‚ฉ ๋ฐ ํ’€ ๊ด€๋ฆฌ API ์ œ๊ณต
โ€ข
์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ์„ ๊ฐ•์ œํ•˜๋Š” ์—„๊ฒฉ ๊ฒ€์‚ฌ(Strict Check) ๋ชจ๋“œ ์ œ๊ณต

IReference

ํ’€์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค.
โ€ข
๋ฐ˜๋‚ฉ ์‹œ ์ƒํƒœ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•œ Clear() ๋ฉ”์„œ๋“œ ์ •์˜

ReferenceCollection

ํŠน์ • ํƒ€์ž…์˜ ์ฐธ์กฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ํด๋ž˜์Šค.
โ€ข
๋ฏธ์‚ฌ์šฉ ์ฐธ์กฐ๋“ค์˜ ํ ๋ณด๊ด€
โ€ข
ํš๋“/๋ฐ˜๋‚ฉ/์ถ”๊ฐ€/์ œ๊ฑฐ ๋“ฑ ์‚ฌ์šฉ ํ†ต๊ณ„ ๊ธฐ๋ก
โ€ข
ํ’€์ด ๋น„๋ฉด ์ƒˆ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์ฒ˜๋ฆฌ

ReferencePoolInfo

ํŠน์ • ์ฐธ์กฐ ํ’€์˜ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๊ตฌ์กฐ์ฒด.
โ€ข
๋ชจ๋‹ˆํ„ฐ๋ง/๋””๋ฒ„๊น…์— ์œ ์šฉํ•œ ์‚ฌ์šฉ ํ†ต๊ณ„ ์ œ๊ณต

GameFrameworkEventArgs

์ด๋ฒคํŠธ ์ธ์ž์˜ ์ถ”์ƒ ๊ธฐ๋ณธ ํด๋ž˜์Šค์ด์ž IReference ๊ตฌํ˜„์ฒด.
โ€ข
์ด๋ฒคํŠธ ์ธ์ž๋Š” ์ž์ฃผ ๋งŒ๋“ค์–ด์กŒ๋‹ค๊ฐ€ ๋ฒ„๋ ค์ง€๋ฏ€๋กœ ํ’€๋ง์˜ ๋Œ€ํ‘œ์ ์ธ ๋Œ€์ƒ

๋™์ž‘ ๋ฐฉ์‹ (How Reference Pooling Works)

ํš๋“(Acquisition)

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ReferencePool.Acquire<T>() ํ˜ธ์ถœ:
โ€ข
ํ’€์ด ๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ํ•˜๋‚˜ ๊บผ๋‚ด ๋ฐ˜ํ™˜
โ€ข
๋น„์–ด ์žˆ์œผ๋ฉด ์ƒˆ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
โ€ข
ํ†ต๊ณ„ ์นด์šดํ„ฐ ์—…๋ฐ์ดํŠธ

์‚ฌ์šฉ(Usage)

๋ฐ˜ํ™˜๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ํ•„์š”ํ•œ ๋™์•ˆ ์‚ฌ์šฉ.

๋ฐ˜๋‚ฉ(Release)

์‚ฌ์šฉ์„ ๋๋‚ด๋ฉด ReferencePool.Release(reference) ํ˜ธ์ถœ:
โ€ข
๊ฐ์ฒด์˜ Clear()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒํƒœ ์ดˆ๊ธฐํ™”
โ€ข
ํ•ด๋‹น ํƒ€์ž…์˜ ์ปฌ๋ ‰์…˜ ํ์— ์žฌ๋“ฑ๋ก
โ€ข
ํ†ต๊ณ„ ์นด์šดํ„ฐ ์—…๋ฐ์ดํŠธ

์—„๊ฒฉ ๊ฒ€์‚ฌ(Strict Checking)

๊ฐœ๋ฐœ ์ค‘ ์˜ค๋‚จ์šฉ์„ ์žก๊ธฐ ์œ„ํ•œ ๊ฒ€์‚ฌ๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Œ:
โ€ข
์œ ํšจํ•œ ํƒ€์ž…์ธ์ง€(์ถ”์ƒ X, IReference ๊ตฌํ˜„) ํ™•์ธ
โ€ข
์ค‘๋ณต ๋ฐ˜๋‚ฉ ๊ฐ™์€ ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ

GameFramework์™€์˜ ์—ฐ๋™ (Integration)

์ด๋ฒคํŠธ ์‹œ์Šคํ…œ

โ€ข
๋Œ€๋ถ€๋ถ„์˜ ์ด๋ฒคํŠธ ์ธ์ž ํด๋ž˜์Šค๋Š” GameFrameworkEventArgs๋ฅผ ์ƒ์†(IReference ๊ตฌํ˜„)
โ€ข
์ž์ฃผ ์ƒ์„ฑยท์†Œ๋ฉธ๋˜๋Š” ์ด๋ฒคํŠธ ์ธ์ž๊ฐ€ ํ’€๋ง์˜ ์ตœ์  ๋Œ€์ƒ
โ€ข
์˜ˆ: ResetSoundAgentEventArgs.Create() ๋‚ด๋ถ€์—์„œ ReferencePool.Acquire<ResetSoundAgentEventArgs>() ์‚ฌ์šฉ

ํ”„๋ ˆ์ž„์›Œํฌ ์ปดํฌ๋„ŒํŠธ

โ€ข
Entity/UI/Sound/Network ๋“ฑ ์—ฌ๋Ÿฌ ๋งค๋‹ˆ์ €๊ฐ€ ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ
โ€ข
์ด๋กœ ์ธํ•ด Reference Pool์˜ GC ์ ˆ๊ฐ ํšจ๊ณผ๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ํฌ๊ฒŒ ์–ป์Œ

์ฝ”์–ด ์ธํ”„๋ผ

โ€ข
Reference Pool์€ GameFrameworkEntry์™€ ๋‚˜๋ž€ํžˆ ์œ„์น˜ํ•œ ์ฝ”์–ด ์ธํ”„๋ผ๋กœ,
๋ชจ๋“  ๋ชจ๋“ˆ๊ณผ ๊ฒŒ์ž„ ์ฝ”๋“œ์—์„œ ๊ณต์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

์‚ฌ์šฉ ํŒจํ„ด (Usage Patterns)

ํ’€๋ง ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค ๋งŒ๋“ค๊ธฐ

IReference๋ฅผ ๊ตฌํ˜„(๋ณดํ†ต GameFrameworkEventArgs ์ƒ์†)ํ•˜๊ณ  Clear()๋กœ ์ดˆ๊ธฐํ™”:
public class MyCustomEventArgs : GameFrameworkEventArgs { private int m_Value; public int Value => m_Value; public static MyCustomEventArgs Create(int value) { MyCustomEventArgs eventArgs = ReferencePool.Acquire<MyCustomEventArgs>(); eventArgs.m_Value = value; return eventArgs; } public override void Clear() { m_Value = 0; } }
C#
๋ณต์‚ฌ

์ „ํ˜•์ ์ธ ํ๋ฆ„

// 1) ํš๋“ MyCustomEventArgs args = ReferencePool.Acquire<MyCustomEventArgs>(); // ๋˜๋Š” ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ MyCustomEventArgs args2 = MyCustomEventArgs.Create(42); // 2) ์‚ฌ์šฉ // ... args ์‚ฌ์šฉ ... // 3) ๋ฐ˜๋‚ฉ ReferencePool.Release(args);
C#
๋ณต์‚ฌ

ํ’€ ๊ด€๋ฆฌ API (์˜ˆ์‹œ)

โ€ข
Add<T>(count) : ์ง€์ • ๊ฐœ์ˆ˜๋งŒํผ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ํ’€์— ์ถ”๊ฐ€
โ€ข
Remove<T>(count) : ์ง€์ • ๊ฐœ์ˆ˜๋งŒํผ ์ œ๊ฑฐ
โ€ข
RemoveAll<T>() : ํ•ด๋‹น ํƒ€์ž… ์ „๋ถ€ ์ œ๊ฑฐ
โ€ข
ClearAll() : ๋ชจ๋“  ์ฐธ์กฐ ํ’€ ์ดˆ๊ธฐํ™”
โ€ข
GetAllReferencePoolInfos() : ๋ชจ๋“  ํ’€์˜ ํ†ต๊ณ„ ์ •๋ณด ์กฐํšŒ

์„ฑ๋Šฅ ๊ด€์  (Performance Considerations)

์ด์ 

โ€ข
GC ๊ฐ์†Œ: ์žฌ์‚ฌ์šฉ์œผ๋กœ GC ๋นˆ๋„/์ •์ง€ ์‹œ๊ฐ„์„ ์ค„์ž„
โ€ข
๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ: ์ž์ฃผ ์“ฐ๋Š” ์ž„์‹œ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€ํ•˜์—ฌ ๋ฐ˜๋ณต ํ• ๋‹น ํšŒํ”ผ
โ€ข
์„ฑ๋Šฅ ํ–ฅ์ƒ: ์ด๋ฒคํŠธ๊ฐ€ ๋งŽ๊ฑฐ๋‚˜ ์ž„์‹œ ๊ฐ์ฒด๊ฐ€ ๋งŽ์€ ์‹œ์Šคํ…œ์—์„œ ํŠนํžˆ ํšจ๊ณผ์ 

๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

โ€ข
์™„์ „ ์ดˆ๊ธฐํ™”: Clear()์—์„œ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๊ผผ๊ผผํžˆ ์ดˆ๊ธฐํ™”
โ€ข
๋ฐ˜๋‚ฉ ์ฒ ์ €: ์‚ฌ์šฉ ํ›„ ๋ฐ˜๋“œ์‹œ Release() ํ˜ธ์ถœ
โ€ข
์—„๊ฒฉ ๊ฒ€์‚ฌ ํ™œ์„ฑํ™”(๊ฐœ๋ฐœ ์ค‘):
ReferencePool.EnableStrictCheck = true;
C#
๋ณต์‚ฌ
โ€ข
์ ํ•ฉํ•œ ๋Œ€์ƒ๋งŒ ํ’€๋ง: ์งง๊ฒŒ ์ž์ฃผ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด์— ์ ํ•ฉ(์˜ค๋ž˜ ์‚ฌ๋Š”/๊ฑฐ์˜ ์•ˆ ๋งŒ๋“œ๋Š” ๊ฐ์ฒด๋Š” X)
โ€ข
ํ†ต๊ณ„ ๋ชจ๋‹ˆํ„ฐ๋ง: GetAllReferencePoolInfos()๋กœ ๊ณผ๋‹ค/๋ˆ„๋ฝ ํ™•์ธ
โ—ฆ
๋ฏธ์‚ฌ์šฉ ์ˆ˜๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ํฌ๋ฉด ๊ณผ๋„ํ•œ ์‚ฌ์ „ ์ƒ์„ฑ ์˜์‹ฌ
โ—ฆ
ํš๋“/๋ฐ˜๋‚ฉ ๋ถˆ๊ท ํ˜•์€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์‹ ํ˜ธ

๊ฒฐ๋ก  (Conclusion)

Reference Pool์€ GameFramework์˜ ํ•ต์‹ฌ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์œผ๋กœ, ๊ฐ์ฒด ์žฌ์‚ฌ์šฉ์„ ํ†ตํ•ด GC ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ณ  ๊ฒŒ์ž„์ฒ˜๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฏผ๊ฐํ•œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ •์ ์ธ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.
ํŠนํžˆ ์ด๋ฒคํŠธ ์ธ์ž์ฒ˜๋Ÿผ ์งง์€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด์— ํšจ๊ณผ๊ฐ€ ํฌ๋ฉฐ, ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด GC ์ •์ง€ ์‹œ๊ฐ„์„ ๋ˆˆ์— ๋„๊ฒŒ ์ค„์—ฌ ์ „์ฒด ๋ฐ˜์‘์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.