--- id: P-REINFORCE-AUTO-E9A644 category: "10_Wiki/πŸ’‘ Topics/Graphics & Performance" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - Draw Call" --- # [[Draw Call|Draw Call]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > λ“œλ‘œμš° 콜(Draw Call)은 CPUκ°€ GPUμ—κ²Œ λ Œλ”λ§ν•  κΈ°ν•˜ν•™μ  ꡬ쑰, 재질 및 λ Œλ”λ§ μƒνƒœλ₯Ό μ „λ‹¬ν•˜λ©° 객체λ₯Ό 화면에 그리도둝 μ§€μ‹œν•˜λŠ” λͺ…λ Ήμž…λ‹ˆλ‹€ [1, 2]. μ‹€μ œ κ·Έλž˜ν”½μ„ λ Œλ”λ§ν•˜λŠ” μ—°μ‚° μžμ²΄λ³΄λ‹€, λ Œλ”λ§μ„ μ€€λΉ„ν•˜κ³  μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” κ³Όμ •μ—μ„œ λ°œμƒν•˜λŠ” CPU μ˜€λ²„ν—€λ“œκ°€ 맀우 μ»€μ„œ μ„±λŠ₯ 병λͺ©μ˜ 주된 원인이 λ©λ‹ˆλ‹€ [3-5]. λ”°λΌμ„œ μ‹€μ‹œκ°„ 3D κ·Έλž˜ν”½ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” 높은 ν”„λ ˆμž„ 속도 μœ μ§€λ₯Ό μœ„ν•΄ μΈμŠ€ν„΄μ‹±, λ°°μΉ­, μ§€μ˜€λ©”νŠΈλ¦¬ 병합 λ“±μ˜ μ΅œμ ν™” 기법을 톡해 λ“œλ‘œμš° 콜의 횟수λ₯Ό μ΅œμ†Œν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€ [6-9]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **λ“œλ‘œμš° 콜의 μž‘λ™ 원리** λ“œλ‘œμš° 콜이 λ°œμƒν•  λ•Œλ§ˆλ‹€ μ‹œμŠ€ν…œμ€ μ—¬λŸ¬ 단계λ₯Ό κ±°μΉ©λ‹ˆλ‹€. 첫째, CPUκ°€ λ³€ν™˜ ν–‰λ ¬, 셰이더 μ°Έμ‘°, μœ λ‹ˆνΌ(Uniform) 및 정점 버퍼 등을 μˆ˜μ§‘ν•˜μ—¬ μ€€λΉ„ν•©λ‹ˆλ‹€ [3]. λ‘˜μ§Έ, GPU λ‚΄μ—μ„œ 셰이더 ν”„λ‘œκ·Έλž¨ μ „ν™˜, ν…μŠ€μ²˜ 바인딩, λ Œλ”λ§ μƒνƒœ ꡬ성 λ“±μ˜ λ Œλ”λ§ μƒνƒœ λ³€κ²½(State Change)이 μΌμ–΄λ‚©λ‹ˆλ‹€ [3, 5, 10]. μ…‹μ§Έ, μ‹œμŠ€ν…œ λ²„μŠ€λ₯Ό 톡해 CPU-GPU κ°„ 톡신이 이루어진 ν›„ λ§ˆμ§€λ§‰μœΌλ‘œ GPUκ°€ μ‹€μ œ 정점을 μ²˜λ¦¬ν•˜κ³  λ Œλ”λ§ν•˜κ²Œ λ©λ‹ˆλ‹€ [3]. * **λ“œλ‘œμš° 콜 μ˜€λ²„ν—€λ“œμ™€ CPU 병λͺ©** μ‚Όκ°ν˜•μ΄ 10κ°œμ΄λ“  10,000κ°œμ΄λ“  λ Œλ”λ§μ„ μ€€λΉ„ν•˜λŠ” 1~3λ‹¨κ³„μ˜ μ‹œκ°„μ€ 거의 λ™μΌν•˜κ²Œ μ†Œλͺ¨λ©λ‹ˆλ‹€ [3]. 즉, 화면에 κ·Έλ¦¬λŠ” 폴리곀의 κ°œμˆ˜λ³΄λ‹€ λ“œλ‘œμš° 콜의 νšŸμˆ˜κ°€ μ„±λŠ₯에 훨씬 더 결정적인 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€ [11]. λ§Œμ•½ 수천 개의 객체λ₯Ό κ°œλ³„μ μœΌλ‘œ λ Œλ”λ§ν•œλ‹€λ©΄ CPUκ°€ λͺ…령을 λ°œν–‰ν•˜λŠ” 속도가 GPU의 λ Œλ”λ§ 속도λ₯Ό 따라가지 λͺ»ν•΄ 병λͺ© ν˜„μƒμ΄ λ°œμƒν•˜κ³  GPUκ°€ κ΅Άμ£Όλ¦¬λŠ”(Starve) μƒνƒœκ°€ λ©λ‹ˆλ‹€ [6]. 일반적으둜 μ›ν™œν•œ 60fps μ„±λŠ₯을 μœ μ§€ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν”„λ ˆμž„λ‹Ή 100회 미만의 λ“œλ‘œμš° μ½œμ„ λͺ©ν‘œλ‘œ ν•˜λŠ” 것이 μ’‹μœΌλ©° [11, 12], κΈ°κΈ°λ‚˜ λΈŒλΌμš°μ €μ— 따라 1,000~2,000회λ₯Ό μ΄ˆκ³Όν•˜λ©΄ CPU λ°”μš΄λ“œμ— μ˜ν•œ μ‹¬κ°ν•œ ν”„λ ˆμž„ μ €ν•˜κ°€ λ°œμƒν•©λ‹ˆλ‹€ [8]. * **μ£Όμš” λ“œλ‘œμš° 콜 μ΅œμ ν™” 기법** * **μΈμŠ€ν„΄μ‹±(Instancing):** λ™μΌν•œ κΈ°ν•˜ν•™μ  ꡬ쑰와 μž¬μ§ˆμ„ κ³΅μœ ν•˜λŠ” μ—¬λŸ¬ 객체(예: ν’€μžŽ, λ‚˜λ¬΄, μž…μž λ“±)의 경우, λ³€ν™˜ ν–‰λ ¬λ§Œ λ‹€λ₯΄κ²Œ μ μš©ν•˜μ—¬ 단 ν•œ 번의 λ“œλ‘œμš° 콜둜 수백~수천 개의 객체λ₯Ό λ Œλ”λ§ν•  수 μžˆμŠ΅λ‹ˆλ‹€ (`InstancedMesh` ν™œμš©) [7, 13, 14]. * **λ°°μΉ­(Batching) 및 병합(Merging):** ꡬ쑰가 λ‹€λ₯΄λ”라도 λ™μΌν•œ μž¬μ§ˆμ„ κ³΅μœ ν•˜λŠ” 객체듀을 λ¬Άμ–΄ ν•˜λ‚˜μ˜ λ“œλ‘œμš° 콜둜 μ²˜λ¦¬ν•˜κ±°λ‚˜(`BatchedMesh`), μ•„μ˜ˆ 움직이지 μ•ŠλŠ” 정적 κ°μ²΄λ“€μ˜ κΈ°ν•˜ν•™μ  ꡬ쑰λ₯Ό ν•˜λ‚˜λ‘œ 병합(Geometry Merging)ν•˜μ—¬ 호좜 횟수λ₯Ό 획기적으둜 μ€„μž…λ‹ˆλ‹€ [9, 15, 16]. * **μƒνƒœ λ³€κ²½ μ΅œμ†Œν™”:** μ—¬λŸ¬ 개의 ν…μŠ€μ²˜λ₯Ό ν…μŠ€μ²˜ μ•„ν‹€λΌμŠ€(Texture Atlases)λ‚˜ 데이터 λ°°μ—΄ ν…μŠ€μ²˜(Data Array Textures)둜 κ²°ν•©ν•˜μ—¬, λ“œλ‘œμš° 콜 쀑간에 ν…μŠ€μ²˜λ₯Ό μ „ν™˜ν•˜λ©° λ°œμƒν•˜λŠ” GPU λ Œλ”λ§ μƒνƒœ λ³€κ²½ μ˜€λ²„ν—€λ“œλ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€ [17-19]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Graphics & Performance λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[Render State|Render State]], [[CPU Bottleneck|CPU Bottleneck]], [[InstancedMesh|InstancedMesh]], [[BatchedMesh|BatchedMesh]], [[Geometry Merging|Geometry Merging]], [[Texture Atlas|Texture Atlas]] - **Projects/Contexts:** [[Three.js|Three.js]], [[WebGL|WebGL]], [[WebGPU|WebGPU]], [[Unity|Unity]] - **Contradictions/Notes:** μ†ŒμŠ€μ— λ”°λ₯΄λ©΄, λ“œλ‘œμš° μ½œμ„ 1회둜 μ€„μ΄λŠ” 것(`InstancedMesh` λ“±μ˜ λ„μž…)이 무쑰건 ν”„λ ˆμž„ 속도 μƒμŠΉμœΌλ‘œ μ΄μ–΄μ§€μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. 수만 개의 객체가 ν•˜λ‚˜μ˜ λ“œλ‘œμš° 콜둜 묢이게 되면 μ—”μ§„μ˜ μ‹œμ•Ό μ ˆλ‘μ²΄ 컬링(Frustum Culling) 정밀도가 λ–¨μ–΄μ§€κ±°λ‚˜ 투λͺ… 객체의 μ •λ ¬(Sorting) λΆ€μž¬λ‘œ 인해 λ§‰λŒ€ν•œ μ˜€λ²„λ“œλ‘œμš°(Overdraw)κ°€ λ°œμƒν•˜μ—¬, 결과적으둜 CPU λͺ…령은 쀄어도 GPU μ—°μ‚°λŸ‰μ€ 였히렀 κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ λŠ˜μ–΄λ‚˜λŠ” ν˜„μƒμ΄ 일어날 수 μžˆμŠ΅λ‹ˆλ‹€ [10, 20-22]. --- *Last updated: 2026-04-19* - Raw Source: 00_Raw/2026-04-20/Draw Call.md ---