DirectX 12 ์žฅ์น˜ ์ดˆ๊ธฐํ™” ์ดํ•ดํ•˜๊ธฐ (4)

2020. 7. 16. 20:10ใ†PROGRAMMING/DirectX 12

 

 

 

 

 

[ DirectX 12 ์žฅ์น˜ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„ ]

 

1 ๋‹จ๊ณ„ Device(๊ทธ๋ž˜ํ”ฝ ๋””๋ฐ”์ด์Šค) ์ƒ์„ฑ.

2 ๋‹จ๊ณ„ CommandQueue์™€ CommandList ์ƒ์„ฑ.

3 ๋‹จ๊ณ„ SwapChain ์ƒ์„ฑ.

4 ๋‹จ๊ณ„ FenceObject ์ƒ์„ฑ.

5 ๋‹จ๊ณ„ ๋ Œ๋”ํƒ€๊ฒŸ(RenderTarget)๊ณผ ๊นŠ์ด/์Šคํ…์‹ค(Depth/Stencil) ๋ฒ„ํผ ์ƒ์„ฑ.

 

 


 

[ 4 ๋‹จ๊ณ„ FenceObject ์ƒ์„ฑ ]

CPU์™€ GPU์˜ ๋™์ž‘ ์ˆœ์„œ

CPU์™€ GPU๊ฐ€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋™๊ธฐํ™”(Synchronization)๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ CPU๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑ(Write)ํ•˜๊ณ , GPU๋Š” ์ด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ(Read)ํ•œ๋‹ค.

๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์—์„œ ๊ณต์œ ๋˜๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

CPU๋Š” ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ID3D12Resource COM๊ฐ์ฒด์— ์ €์žฅํ•œ๋‹ค.

(๋ฒ„ํ…์Šค ๋ฒ„ํผ, ์ธ๋ฑ์Šค ๋ฒ„ํผ, ํ…์Šค์ณ, ๋ Œ๋” ํƒ€๊ฒŸ, ๊นŠ์ด/์Šคํ…์‹ค ๋ฒ„ํผ ๋“ฑ๋“ฑ ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ž์›๋“ค)

 

n๋ฒˆ์งธ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•œ ์žฅ๋ฉด์„ ๋ Œ๋”๋ง ํ•˜๊ธฐ ์œ„ํ•ด CPU๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  GPU๊ฐ€ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฐ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

n๋ฒˆ์งธ ๋ Œ๋”๋ง ๋ฐ์ดํ„ฐ๋ฅผ GPU๊ฐ€ ์•„์ง ์‹คํ–‰ํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ,

CPU๊ฐ€ n+1๋ฒˆ์งธ ํ”„๋ ˆ์ž„ ๋ Œ๋”๋ง ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์œผ๋ ค๊ณ  ํ•˜๋ฉด GPU์™€ ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

์˜๋„ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€์„œ ์ œ๋Œ€๋กœ ๊ทธ๋ ค์ง€์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

 

n๋ฒˆ์งธ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•˜์—ฌ CPU๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ , GPU๊ฐ€ ๋ Œ๋”๋ง์„ ์ฒ˜๋ฆฌํ•œ ํ›„์—

CPU๋Š” n+1๋ฒˆ์งธ ํ”„๋ ˆ์ž„ ๋ Œ๋”๋ง ๋ฐ์ดํ„ฐ๋ฅผ GPU์— ๋„˜๊ฒจ์ค˜์•ผ ํ•œ๋‹ค.

์ฆ‰, CPU๋Š” GPU์˜ ๋ Œ๋”๋ง ์ž‘์—…์ด ๋ชจ๋‘ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค.

 

 

[ ID3D12Fence ]

 

CreateFence

๋™๊ธฐํ™”์˜ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์€ CPU์—๋‹ค๊ฐ€ GPU๊ฐ€ ๋๋‚˜๊ธฐ ์ „์— ๋™์ž‘ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์žฅ๋ง‰์„ ์„ค์น˜ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๋ฐฉ๋ฒ•์œผ๋กœ Direct3D๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฐ”๋กœ Fence ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค.

Fence๋„ COM ๊ฐ์ฒด ์ด๋ฏ€๋กœ ID3D12Fence*๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋””๋ฐ”์ด์Šค๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ๋‹ค.

 

Fence InitialValue

CreateFence()์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” FenceValue์˜ ์ดˆ๊ธฐ ๊ฐ’์ด๋‹ค.

FenceValue๋Š” ํ”„๋ ˆ์ž„ ๋ฒˆํ˜ธ๋กœ ์ดํ•ดํ•˜๋ฉด ๊ฐ€์žฅ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

์ดˆ๊ธฐ ๊ฐ’์€ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ์ด๋Š” 0๋ฒˆ์งธ ํ”„๋ ˆ์ž„๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ธ์ž์˜ ์ž๋ฃŒํ˜•์ด UINT64 ์ž๋ฃŒํ˜•์ด๋‹ค. (๊ฐ’์˜ ๋ฒ”์œ„๊ฐ€ 0 ~ 2^64 - 1)

์ด๋Š” 1์ดˆ์— 1,000์žฅ์”ฉ ํ”„๋ ˆ์ž„์„ ๊ฐฑ์‹ ํ•ด๋„ 100๋…„ ๋™์•ˆ 2^64๊ฐ€ ์•ˆ๋œ๋‹ค.

์ฆ‰, ์ด FenceValue๋Š” ๋งค ํ”„๋ ˆ์ž„๋งˆ๋‹ค ๊ฐ’์„ ์ฆ๊ฐ€์‹œ์ผœ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋  ์ผ์ด ์—†๋Š” ๊ต‰์žฅํžˆ ํฐ ์ •์ˆ˜ํ˜• ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” D3D12_FENCE_FLAGS๊ฐ’ ์ด๋‹ค.

FENCE_FLAGS๋Š” ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์ด ํ•„์š” ์—†์œผ๋ฏ€๋กœ FLAG_NONE์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

(๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด D3D12_FENCE_FLAG_SHARED๋กœ ์„ค์ •ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.)

 

Fence์˜ค๋ธŒ์ ํŠธ์™€ VenceValue

Fence ์˜ค๋ธŒ์ ํŠธ ๊ฐ’์€ CommandQueue๋„ ์•Œ๊ณ  ์žˆ๊ณ , ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์‘์šฉํ”„๋กœ๊ทธ๋žจ๋„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐ’์ด๋‹ค.

์ตœ์ดˆ ์‹œ์ž‘ ์‹œ(0๋ฒˆ์งธ ํ”„๋ ˆ์ž„) FenceValue์˜ ๊ฐ’์ด 1์ด ๋  ๋•Œ๊นŒ์ง€ CPU๋Š” ๊ณ„์† ๋Œ€๊ธฐํ•˜๋‹ค๊ฐ€

GPU๊ฐ€ ๋ชจ๋“  ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ๋ฅผ ๋๋‚ด๋ฉด ๊ฐ’์„ ์ฆ๊ฐ€์‹œ์ผœ CPU๊ฐ€ ๋‹ค์Œ ํ”„๋ ˆ์ž„์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

 

Fence ์˜ค๋ธŒ์ ํŠธ ์ธํ„ฐํŽ˜์ด์Šค

Fence ์˜ค๋ธŒ์ ํŠธ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ 3๊ฐœ์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

- GetCompleteValue() ํ•จ์ˆ˜๋Š” ํ˜„์žฌ Fence ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” UINT ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

- Signal() ํ•จ์ˆ˜๋Š” Fence์˜ ๊ฐ’์„ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

- SetEventOnCompletion() ํ•จ์ˆ˜๋Š” ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋“ค์–ด์˜จ ๊ฐ’์œผ๋กœ Fence ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฐ”๋€Œ๊ฒŒ ๋˜๋ฉด,

๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋“ค์–ด์˜ค๋Š” HANDLE Event๋ฅผ TRUE๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

 

์ธ์ž๋กœ ๋“ค์–ด๊ฐ€๋Š” Event๋Š” WinAPI๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋™๊ธฐํ™” ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค.

ํฌ๋ฆฌํ‹ฐ์ปฌ์„น์…˜, ์„ธ๋งˆํฌ์–ด, ์ด๋ฒคํŠธ, ๋ฎคํ…์Šค.. ๋“ฑ๋“ฑ. Event๋Š” ๊ทธ์ค‘ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ์˜ ๋™๊ธฐํ™” ๊ธฐ๋ฒ•์ด๋‹ค.

Event๋Š” BOOL ๋ณ€์ˆ˜์ด๋‹ค. ์šด์˜์ฒด์ œ๊ฐ€ ์ด ๊ฐ’์ด TRUE์ธ์ง€ FALSE์ธ์ง€ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.

Event๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋†“๊ณ  ์ด Event์˜ ๊ฐ’์ด TRUE๋ƒ FALSE์ด๋ƒ๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๊ฐ€ ๋˜๊ณ ,

์ด Event๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ํ•จ์ˆ˜๋“ค์„ WinAPI๊ฐ€ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณตํ•œ๋‹ค.

 

CreateEventEx

Event๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•œ๋‹ค๋ฉด CreateEventEx๋ผ๋Š” WinAPIํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

Event๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉด HANDLE๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

HANDLE์„ ์‚ฌ์šฉํ•ด์„œ Event์˜ ๊ฐ’์ด TRUE์ธ์ง€ FALSE์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋Œ€๋ถ€๋ถ„ ์ดˆ๊ธฐ ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์€ FALSE๋กœ ๋งŒ๋“ ๋‹ค.

 

 

 

[ ID3D12CommandQueue ]

 

์œ„์—์„œ Fence ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์„ค๋ช…ํ•  ๋•Œ Fence ์˜ค๋ธŒ์ ํŠธ ๊ฐ’์€ CommandQueue๋„ ์•Œ๊ณ  ์žˆ๊ณ ,

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์‘์šฉํ”„๋กœ๊ทธ๋žจ๋„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐ’์ด๋ผ๊ณ  ์„ค๋ช…ํ–ˆ๋‹ค.

CommandQueue์—๋Š” Signal()๊ณผ Wait() ๋‘ ๊ฐ€์ง€ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

 

1. Signal() : Fence๊ฐ’์ด ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋„๋‹ฌ๋  ๋•Œ ํ†ต์ง€๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜์ด๋‹ค.

Signal() ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” Fence ์˜ค๋ธŒ์ ํŠธ, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” FenceValue์ด๋‹ค.

Fence๊ฐ’์ด ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋„๋‹ฌ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ๋•Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

- ํด๋ง : ์ฃผ๊ธฐ์ ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ํ™•์ธํ•œ๋‹ค. ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ด๋‹ค.

- ์ด๋ฒคํŠธ ํ†ต์ง€ : ์ด๋ฒคํŠธ๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ฆ‰, CommandQueue๊ฐ€ Fence๊ฐ’์ด 0์—์„œ 1๋กœ ๊ณ„์† ์ฃผ๊ธฐ์ ์œผ๋กœ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ๋ฐฉ์‹๋ณด๋‹ค

์šด์˜์ฒด์ œ๋ฅผ ํ†ตํ•ด์„œ Event ํ†ต์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ด ๋” ํšจ์œจ์ ์ด๋‹ค.

 

๋น„์œ ๋ฅผ ํ•ด์„œ ์„ค๋ช…ํ•˜์ž๋ฉด

Signal() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, CommandQueue์˜ ๋งˆ์ง€๋ง‰ CommandList ๋์—๋‹ค๊ฐ€

Fence์˜ ๊ฐ’์„ 1 ์ฆ๊ฐ€์‹œํ‚ค๋Š”, ํ˜น์€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ๊ฐ’์ด ๋˜๋„๋ก ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

๋ช…๋ น์ด ์ „๋ถ€ ๋๋‚˜๊ฒŒ ๋˜๋ฉด Fence๊ฐ’์ด 0 -> 1๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

CommandQueue๋Š” Fence๊ฐ’์ด 1์ด ๋˜๋ฉด ํ†ต์ง€๋ฅผ ํ•ด๋‹ฌ๋ผ๊ณ  Fence์—๊ฒŒ ๊ฐ’์„ ์•Œ๋ ค์คฌ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด CommandQueue๋Š” ํ†ต์ง€๋ฅผ ๋ฐ›๊ฒŒ ๋˜๊ณ , ๋‹ค๋ฅธ ์ž‘์—…์„ ํ•˜๋‹ค๊ฐ€ Fence์˜ ๊ฐ’์ด 1์ด ๋์œผ๋‹ˆ

CPU๊ฐ€ ๋‹ค์Œ ํ”„๋ ˆ์ž„ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ Resource์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์‹œ ๋™์ž‘ํ•˜๊ฒŒ ํ•œ๋‹ค.

์ด ์ž‘์—…์„ ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•˜์—ฌ CPU์™€ GPU์˜ ๋™๊ธฐํ™”๋ฅผ ํ•œ๋‹ค.

 

2. Wait() : GPU๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•œ๋‹ค.

GPU๋Š” ๋น„์‹ผ ๋™์ž‘์ด๋ฏ€๋กœ GPU๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์ž‘์€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.

๋Œ€๋ถ€๋ถ„ Signal() ํ•จ์ˆ˜๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

WinAPI๊ฐ€ ์ œ๊ณตํ•˜๋Š” '๊ธฐ๋‹ค๋ฆฌ๋Š” ํ•จ์ˆ˜'๋Š” WaitForSingleObject() ํ•จ์ˆ˜์ด๋‹ค.

์ด๋ฅผ ํ†ตํ•ด Event๊ฐ€ TRUE๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

์ผ์ด ๋ชจ๋‘ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ฏ€๋กœ INFINITE๋ฅผ ์„ค์ •ํ•œ๋‹ค.

 

 

 

 

[ Fence ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ†ตํ•œ CPU/GPU ๋™๊ธฐํ™” ]

 

CPU/GPU ๋™๊ธฐํ™”

0๋ฒˆ์งธ ํ”„๋ ˆ์ž„๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด,

ํ˜„์žฌ CPU๋Š” 0๋ฒˆ์งธ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•œ ๋ Œ๋”๋ง ๋ฐ์ดํ„ฐ์˜ ์ž…๋ ฅ์„ ๋ชจ๋‘ ๋งˆ์นœ ์ƒํƒœ์ด๋‹ค.

๋”ฐ๋ผ์„œ CPU์˜ Fence๊ฐ’์€ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. (FenceValue CPU : 1 / GPU : 0)

CommandQueue์˜ Signal() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด Fence๊ฐ’์ด 1์ด ๋˜๋ฉด ํ†ต์ง€๋ฐ›๊ฒ ๋‹ค๊ณ  ์„ค์ •์„ ํ•œ๋‹ค.

๊ทธ๋‹ค์Œ CreateEventExํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด Event๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. ์ดˆ๊ธฐ ๊ฐ’์€ FALSE์ด๋‹ค.

์ƒ์„ฑํ•œ Event HANDLE์ด TRUE๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋ฌดํ•œํžˆ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. (INFINITE)

GPU๊ฐ€ ๋ชจ๋“  ๋ Œ๋”๋ง ์ž‘์—…์„ ๋งˆ์น˜๋ฉด Fence ๊ฐ’์€ 1 ์ฆ๊ฐ€๋  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ CPU๋Š” n+1๋ฒˆ์งธ ํ”„๋ ˆ์ž„์˜ ๋ Œ๋”๋ง ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ด๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ์ž‘์—…์„ ํ†ตํ•ด CPU์™€ GPU์˜ ๋™๊ธฐํ™”๋ฅผ ํ•œ๋‹ค.