--- id: P-REINFORCE-AUTO-0B8FFC category: "10_Wiki/๐Ÿ’ก Topics/Programming & Language" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - Draw Call Optimization" --- # [[Draw Call Optimization|Draw Call Optimization]] ## ๐Ÿ“Œ ํ•œ ์ค„ ํ†ต์ฐฐ (The Karpathy Summary) > ๋“œ๋กœ์šฐ ์ฝœ(Draw Call)์€ CPU๊ฐ€ GPU์—๊ฒŒ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ, ์žฌ์งˆ, ๋ Œ๋”๋ง ์ง€์นจ ๋“ฑ์„ ์ „๋‹ฌํ•˜์—ฌ ํ™”๋ฉด์— ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆฌ๋„๋ก ๋‚ด๋ฆฌ๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค [1-3]. ๊ฐ ๋“œ๋กœ์šฐ ์ฝœ์„ ์ค€๋น„ํ•˜๊ณ  ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ง‰๋Œ€ํ•œ CPU ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋“œ๋กœ์šฐ ์ฝœ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ”„๋ ˆ์ž„ ์†๋„์™€ ์ „๋ฐ˜์ ์ธ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ณ  ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ•ต์‹ฌ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค [4-6]. ## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) * **๋“œ๋กœ์šฐ ์ฝœ์˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ (Bottlenecks):** ๊ทธ๋ž˜ํ”ฝ API๊ฐ€ GPU์— ๋ Œ๋”๋ง ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ์ค€๋น„ ๊ณผ์ •์€ ์‹ค์ œ GPU๊ฐ€ ํ”ฝ์…€์„ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ CPU ์ž์›์„ ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค [2, 4, 6]. ์ด๋กœ ์ธํ•ด ๊ฐœ๋ณ„ ๊ฐ์ฒด๋ฅผ ์ˆ˜์ฒœ ๋ฒˆ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ทธ๋ฆฌ๋ฉด GPU์˜ ํด๋ฆฌ๊ณค ์ฒ˜๋ฆฌ ํ•œ๊ณ„์— ๋„๋‹ฌํ•˜๊ธฐ๋„ ์ „์— CPU ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•˜์—ฌ ์‹œ์Šคํ…œ ํ”„๋ ˆ์ž„ ๋ ˆ์ดํŠธ๊ฐ€ ๊ธ‰๊ฐํ•ฉ๋‹ˆ๋‹ค [5, 7]. ์ตœ์‹  ๊ธฐ๊ธฐ์—์„œ ๋ถ€๋“œ๋Ÿฌ์šด 60fps๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด ํ”„๋ ˆ์ž„๋‹น ๋“œ๋กœ์šฐ ์ฝœ์„ 100๊ฐœ ์ดํ•˜๋กœ ํƒ€๊ฒŸํŒ…ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ [8-10], WebGL ํ™˜๊ฒฝ์—์„œ์˜ ์‹ค์งˆ์ ์ธ ํ•œ๊ณ„๋Š” 1,000~2,000ํšŒ ์ˆ˜์ค€์ž…๋‹ˆ๋‹ค [11]. * **์ฃผ์š” ์ตœ์ ํ™” ๊ธฐ๋ฒ• (Optimization Techniques):** * **์ธ์Šคํ„ด์‹ฑ (Instancing):** `InstancedMesh` ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ์™€ ์žฌ์งˆ์„ ๊ฐ€์ง„ ๊ฐ์ฒด์˜ ์ˆ˜๋งŽ์€ ๋ณต์ œ๋ณธ์„ ๋‹จ ํ•œ ๋ฒˆ์˜ ๋“œ๋กœ์šฐ ์ฝœ๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค [8, 12-14]. ๋‚˜๋ฌด, ํ’€, ํŒŒํ‹ฐํด ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์ด ๋ฐ˜๋ณต๋˜๋Š” ์š”์†Œ์— ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค [12, 15]. * **๋ฐฐ์นญ ๋ฐ ๋ณ‘ํ•ฉ (Batching & Merging):** `BatchedMesh`๋Š” ๋™์ผํ•œ ์žฌ์งˆ์„ ๊ณต์œ ํ•˜์ง€๋งŒ ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐํ•˜ํ•™์  ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋“ค์„ ํ•˜๋‚˜์˜ ๋“œ๋กœ์šฐ ์ฝœ๋กœ ๋ฌถ์–ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค [16, 17]. ์ •์ ์ธ ํ™˜๊ฒฝ ์š”์†Œ๋Š” `BufferGeometryUtils`์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ํ•˜๋‚˜์˜ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ๋กœ ๋ณ‘ํ•ฉ(Merging)ํ•˜๋ฉด ์—ฌ๋Ÿฌ ๋“œ๋กœ์šฐ ์ฝœ์„ ํ•œ ๋ฒˆ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [16, 18-21]. * **์žฌ์งˆ ๋ฐ ํ…์Šค์ฒ˜ ๊ณต์œ  (Material & Texture Sharing):** ๊ฐ์ฒด๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์žฌ์งˆ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ตœ์ ํ™”๋ฅผ ์ €ํ•ดํ•ฉ๋‹ˆ๋‹ค [16, 19]. ํ…์Šค์ฒ˜ ์•„ํ‹€๋ผ์Šค(Texture Atlas)๋‚˜ ๋ฐฐ์—ด ํ…์Šค์ฒ˜(Array Textures)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์žฌ์งˆ์„ ๊ณต์œ ํ•จ์œผ๋กœ์จ ํ…์Šค์ฒ˜ ๋ฐ”์ธ๋”ฉ ๋ฐ ์ƒํƒœ ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ์ถ”๊ฐ€์ ์ธ ๋“œ๋กœ์šฐ ์ฝœ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [20, 22-24]. * **๊ฐ€์‹œ์„ฑ ์ œ์–ด (Visibility & LOD):** ์นด๋ฉ”๋ผ ์‹œ์•ผ ๋ฐ–์˜ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ Œ๋”๋ง ๋ช…๋ น์„ ์ œ์™ธํ•˜๋Š” ์ ˆ๋‘์ฒด ์ปฌ๋ง(Frustum Culling)์„ ์ˆ˜ํ–‰ํ•˜๊ณ  [18, 25], ์นด๋ฉ”๋ผ์™€์˜ ๊ฑฐ๋ฆฌ์— ๋”ฐ๋ผ ๊ธฐํ•˜ํ•™์  ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ”๋Š” LOD(Level of Detail) ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜์—ฌ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๊ฐ์ฒด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋“œ๋กœ์šฐ ์ฝœ๊ณผ ์—ฐ์‚ฐ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค [9, 26-28]. * **๊ตฌ์กฐ์  ํ•œ๊ณ„ ๋ฐ ๊ณ ๋ ค์‚ฌํ•ญ (Limitations & Trade-offs):** `InstancedMesh`๋ฅผ ํ†ตํ•œ ๋“œ๋กœ์šฐ ์ฝœ ๋‹จ์ผํ™”๊ฐ€ ํ•ญ์ƒ ์ตœ์„ ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹จ์ผ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰๋˜์–ด ๊ฐ€์‹œ์„ฑ ํŒ์ •์ด '์ „๋ถ€ ์•„๋‹ˆ๋ฉด ์ „๋ฌด(All-or-Nothing)'๋กœ ์ด๋ฃจ์–ด์ ธ ์ ˆ๋‘์ฒด ์ปฌ๋ง์ด ๋น„ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [29, 30]. ๋˜ํ•œ, ์ธ์Šคํ„ด์Šค ๊ฐ„ ์ž๋™ ์ •๋ ฌ ๋ถ€์žฌ๋กœ ์ธํ•œ ์‹ฌ๊ฐํ•œ ์˜ค๋ฒ„๋“œ๋กœ์šฐ(Overdraw) ํ˜„์ƒ๊ณผ ๋งค ํ”„๋ ˆ์ž„ ์ˆ˜๋งŽ์€ ๋ณ€ํ™˜ ํ–‰๋ ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋Œ€์—ญํญ ํ•œ๊ณ„๋กœ ์ธํ•ด ๋˜ ๋‹ค๋ฅธ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์ด ์œ ๋ฐœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [29, 31, 32]. Unity ๊ฐ™์€ ๊ฒŒ์ž„ ์—”์ง„์—์„œ๋Š” ์ด์™€ ๊ฐ™์€ ๋“œ๋กœ์šฐ ์ฝœ ์ตœ์ ํ™” ๋ฐฉ์‹๋“ค์ด ๊ฒน์น  ๋•Œ SRP Batcher, ์ •์  ๋ฐฐ์นญ(Static batching), GPU ์ธ์Šคํ„ด์‹ฑ ์ˆœ์œผ๋กœ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘์–ด ์ถฉ๋Œ์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค [33, 34]. ## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) - **๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ์™€์˜ ์ถฉ๋Œ:** ์ž๋™ํ™” ์—”์ง„์— ์˜ํ•ด ๋งคํ•‘๋œ ์ง€์‹์œผ๋กœ, ์ถ”ํ›„ ์ •๋ฐ€ ๊ฒ€์ฆ ํ•„์š”. - **์ •์ฑ… ๋ณ€ํ™”:** Programming & Language ๋ถ„์•ผ์˜ ์ž๋™ ์ž์‚ฐํ™” ์ˆ˜ํ–‰. ## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) - **Related Topics:** [[InstancedMesh|InstancedMesh]], [[BatchedMesh|BatchedMesh]], [[Frustum Culling|Frustum Culling]], [[Texture Atlas|Texture Atlas]], [[Level of Detail (LOD)|Level of Detail (LOD)]] - **Projects/Contexts:** [[Three.js|Three.js]], [[WebGL|WebGL]], [[Unity|Unity]] - **Contradictions/Notes:** ์ผ๋ฐ˜์ ์œผ๋กœ ๋“œ๋กœ์šฐ ์ฝœ์„ ์ค„์ด๋Š” ๊ฒƒ์€ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ์ง€๋งŒ, `InstancedMesh`๋ฅผ ํ†ตํ•ด ๋“œ๋กœ์šฐ ์ฝœ์„ 1ํšŒ๋กœ ์ค„์˜€์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ •๋ ฌ๋˜์ง€ ์•Š์€ ์ธ์Šคํ„ด์Šค๋“ค์ด ์œ ๋ฐœํ•˜๋Š” ๋ง‰๋Œ€ํ•œ ์˜ค๋ฒ„๋“œ๋กœ์šฐ(Overdraw) ๋น„์šฉ์ด๋‚˜ ๋น„ํšจ์œจ์ ์ธ ์ปฌ๋ง์œผ๋กœ ์ธํ•ด, ๊ฐœ๋ณ„ ๋ฉ”์‰ฌ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ๋ณด๋‹ค ์˜คํžˆ๋ ค ํ”„๋ ˆ์ž„ ์†๋„(FPS)๊ฐ€ ๋‚ฎ์•„์ง€๋Š” ์—ญ์„ค์ ์ธ ์ƒํ™ฉ์ด ์‹ค์ฆ์  ์—ฐ๊ตฌ์™€ ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ ๋“ฑ์—์„œ ๋ณด๊ณ ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค [29, 31, 35]. --- *Last updated: 2026-04-19* - Raw Source: 00_Raw/2026-04-20/Draw Call Optimization.md ---