--- id: P-REINFORCE-AUTO-F035BF category: "[[10_Wiki/πŸ’‘ Topics/Programming & Language]]" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - InstancedMesh Performance Bottlenecks" --- # [[InstancedMesh Performance Bottlenecks]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > 지식 μš”μ•½ 정보 μΆ”μΆœ 쀑... ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **μ‹œμ•Ό μ ˆλ‘μ²΄ 컬링(Frustum Culling)의 λΉ„νš¨μœ¨μ„±** `InstancedMesh`λŠ” 단일 λ°”μš΄λ”© λ³Όλ₯¨(Bounding Volume)을 κΈ°μ€€μœΌλ‘œ λ Œλ”λ§ μ—¬λΆ€λ₯Ό κ²°μ •ν•˜λ―€λ‘œ, **화면에 단 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ 보여도 GPUλŠ” 보이지 μ•ŠλŠ” λ‚˜λ¨Έμ§€ 수만 개 μΈμŠ€ν„΄μŠ€μ˜ 정점 λ³€ν™˜ 연산을 κ°•μ œλ‘œ μˆ˜ν–‰**ν•΄μ•Ό ν•©λ‹ˆλ‹€ [1, 2]. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ CPU(μžλ°”μŠ€ν¬λ¦½νŠΈ)μ—μ„œ λ§€ ν”„λ ˆμž„ κ°œλ³„ μΈμŠ€ν„΄μŠ€μ˜ κ°€μ‹œμ„±μ„ μˆ˜ν•™μ μœΌλ‘œ νŒλ³„ν•˜μ—¬ 버퍼λ₯Ό μž¬κ΅¬μ„±ν•  수 μžˆμ§€λ§Œ, 이 경우 λ§‰λŒ€ν•œ CPU μ—°μ‚° λΉ„μš©κ³Ό 병λͺ©μ΄ λ°œμƒν•˜μ—¬ 본래의 μ΅œμ ν™” μ·¨μ§€λ₯Ό ν›Όμ†ν•©λ‹ˆλ‹€ [3, 4]. * **μžλ™ 깊이 μ •λ ¬(Sorting) λΆ€μž¬ 및 μ˜€λ²„λ“œλ‘œμš°(Overdraw)** μΈμŠ€ν„΄μŠ€λ“€μ€ μΈμŠ€ν„΄μŠ€ 버퍼에 기둝된 μˆœμ„œλŒ€λ‘œλ§Œ κ·Έλ €μ§€λ©°, 거리에 λ”°λ₯Έ μžλ™ 정렬을 μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ [5, 6]. 이둜 인해 뢈투λͺ… 객체의 경우 뒀에 κ°€λ €μ§„ 픽셀을 λ°˜λ³΅ν•΄μ„œ κ³„μ‚°ν•˜λŠ” **μ˜€λ²„λ“œλ‘œμš°κ°€ λ°œμƒν•˜μ—¬ ν”„λž˜κ·Έλ¨ΌνŠΈ 셰이더(Fragment Shader) μ„±λŠ₯을 μ‹¬κ°ν•˜κ²Œ μ €ν•˜μ‹œν‚΅λ‹ˆλ‹€** [5-7]. 특히 투λͺ… κ°μ²΄λŠ” μ•ŒνŒŒ λΈ”λ Œλ”© 였λ₯˜λ₯Ό 막기 μœ„ν•΄ 'λ’€μ—μ„œ μ•žμœΌλ‘œ(Back-to-Front)' μ •λ ¬ν•΄μ•Ό ν•˜λŠ”λ°, 동적 μ”¬μ—μ„œ 이λ₯Ό μœ„ν•΄ CPU 기반의 μž¬μ •λ ¬(예: Radix Sort)을 λ§€ ν”„λ ˆμž„ μˆ˜ν–‰ν•˜λ©΄ 메인 μŠ€λ ˆλ“œμ— 치λͺ…적인 λΆ€ν•˜κ°€ κ±Έλ¦½λ‹ˆλ‹€ [8]. * **λ©”λͺ¨λ¦¬ λŒ€μ—­ν­ 및 동적 μ—…λ°μ΄νŠΈ ν•œκ³„** λ§€ ν”„λ ˆμž„ μœ„μΉ˜λ‚˜ 색상이 λ°”λ€ŒλŠ” 동적 μ”¬μ—μ„œλŠ” μˆ˜λ§Žμ€ μΈμŠ€ν„΄μŠ€μ˜ $4 \times 4$ λ³€ν™˜ ν–‰λ ¬ 데이터λ₯Ό 맀번 CPUμ—μ„œ GPU둜 전솑해야 ν•©λ‹ˆλ‹€. μ˜ˆμ»¨λŒ€ 200만 개의 μΈμŠ€ν„΄μŠ€ λ³€ν™˜ μ‹œ μ΄ˆλ‹Ή μ•½ 7.68GB/s의 λŒ€μ—­ν­μ„ μ μœ ν•˜μ—¬ μ‹œμŠ€ν…œ λ²„μŠ€μ— κ³ΌλΆ€ν•˜λ₯Ό μΌμœΌν‚΅λ‹ˆλ‹€ [9, 10]. λ˜ν•œ, 생성 및 μ‚­μ œκ°€ λΉˆλ²ˆν•΄ 버퍼 크기λ₯Ό λ™μ μœΌλ‘œ μž¬ν• λ‹Ήν•΄μ•Ό ν•  경우, κ°€λΉ„μ§€ 컬렉터(GC)κ°€ μž‘λ™ν•˜λ©΄μ„œ ν”„λ ˆμž„μ΄ μΌμ‹œμ μœΌλ‘œ λ©ˆμΆ”λŠ” μ§€μ—° ν˜„μƒ(Stuttering)을 μœ λ°œν•©λ‹ˆλ‹€ [11]. * **μ§€μ˜€λ©”νŠΈλ¦¬ 및 ν…μŠ€μ²˜ λ‹€μ–‘μ„± ν™•λ³΄μ˜ 어렀움** ν•˜λ‚˜μ˜ `InstancedMesh`λŠ” 였직 ν•˜λ‚˜μ˜ `BufferGeometry`와 `Material`만 μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ, λͺ¨λΈ μ’…λ₯˜κ°€ λ§Žμ•„μ§€λ©΄ κ²°κ΅­ λ“œλ‘œμš° 콜이 κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ μ¦κ°€ν•©λ‹ˆλ‹€ [12-14]. μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€μ— 각기 λ‹€λ₯Έ ν…μŠ€μ²˜λ₯Ό μž…νžˆκΈ° μœ„ν•΄ ν…μŠ€μ²˜ μ•„ν‹€λΌμŠ€(Texture Atlas)λ₯Ό μ‚¬μš©ν•  경우, λ°‰λ§΅(Mipmap) 생성 μ‹œ 인접 ν…μŠ€μ²˜ 간에 색이 μ„žμ΄λŠ” 경계선 블리딩(Edge Bleeding) λ¬Έμ œκ°€ λ°œμƒν•˜λ©° 셰이더 ꡬ성이 맀우 λ³΅μž‘ν•΄μ§‘λ‹ˆλ‹€ [15-17]. * **ν”Όν‚Ή(Picking) 및 μƒν˜Έμž‘μš©(Raycasting) μ§€μ—°** `InstancedMesh`에 λŒ€ν•œ CPU λ ˆμ΄μΊμŠ€νŒ…μ€ κ΄‘μ„ (Ray)이 각 μΈμŠ€ν„΄μŠ€μ˜ λ³€ν™˜ 행렬을 κ°œλ³„μ μœΌλ‘œ μ—­μ‚°ν•΄μ•Ό ν•˜λ―€λ‘œ μƒν˜Έμž‘μš© μ‹œ 즉각적인 λ°˜μ‘μ„ μ–΄λ ΅κ²Œ ν•©λ‹ˆλ‹€ [18, 19]. μ…°μ΄λ”μ—μ„œ μ• λ‹ˆλ©”μ΄μ…˜(예: λ°”λžŒ, 물리 μ—°μ‚°)을 μ μš©ν–ˆλ‹€λ©΄ CPUλŠ” μ‹€μ œ μœ„μΉ˜λ₯Ό 좔적할 수 μ—†μ–΄ 피킹이 μ–΄κΈ‹λ‚˜λ©°, λŒ€μ•ˆμœΌλ‘œ GPU ν”½μ…€ 피킹을 μ‚¬μš©ν•˜λ”λΌλ„ `readPixels` ν•¨μˆ˜ 호좜 μ‹œ GPU νŒŒμ΄ν”„λΌμΈ 동기화 μ§€μ—°(Sync stall)으둜 인해 ν”„λ ˆμž„ μ €ν•˜κ°€ μΌμ–΄λ‚©λ‹ˆλ‹€ [18, 20]. * **μŠ€ν‚¨λ“œ μ• λ‹ˆλ©”μ΄μ…˜(Skinned Mesh) 연동 λΆˆκ°€** 기본적으둜 λ³Έ(Bone) 기반의 μŠ€ν‚¨λ“œ μ• λ‹ˆλ©”μ΄μ…˜μ„ μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ [21, 22]. μˆ˜λ§Žμ€ μΈμŠ€ν„΄μŠ€μ— κ°œλ³„μ μΈ 포즈λ₯Ό μ μš©ν•˜λ €λ©΄ 각 μΈμŠ€ν„΄μŠ€λ³„ λ³Έ ν–‰λ ¬ 데이터λ₯Ό ν…μŠ€μ²˜ 등을 톡해 μ „λΆ€ GPU둜 전솑해야 ν•˜λ©°, λ°μ΄ν„°μ˜ 폭발적 μ¦κ°€λ‘œ 인해 일반적인 버퍼 μ œν•œμ„ μ΄ˆκ³Όν•˜κ²Œ λ˜λŠ” 물리적 ν•œκ³„μ— λΆ€λ”ͺνž™λ‹ˆλ‹€ [21]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Programming & Language λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[Frustum Culling]], [[Overdraw]], [[Draw Call]], [[BatchedMesh]], [[Texture Atlas]] - **Projects/Contexts:** [[InstancedMesh2 library]], [[Three.js WebGPU Renderer]], [[WebGL multi_draw extension]] - **Contradictions/Notes:** λ§Žμ€ λ Œλ”λ§ μƒν™©μ—μ„œ `InstancedMesh`κ°€ 만λŠ₯ μ΅œμ ν™” κΈ°λ²•μœΌλ‘œ μ—¬κ²¨μ§€μ§€λ§Œ, μ‹€μ œ 벀치마크 μ‚¬λ‘€μ—μ„œλŠ” λ“œλ‘œμš° μ½œμ„ 1회둜 μ€„μ˜€μŒμ—λ„ λΆˆκ΅¬ν•˜κ³  μ˜€λ²„λ“œλ‘œμš° 및 GPU ν”„λž˜κ·Έλ¨ΌνŠΈ 병λͺ© λ•Œλ¬Έμ— κ°œλ³„ λ©”μ‰¬λ‚˜ `BatchedMesh` 방식보닀 였히렀 λ Œλ”λ§ μ‹œκ°„(Frame Time)이 λŠλ €μ§€κ±°λ‚˜ μ„±λŠ₯이 μ €ν•˜λ˜λŠ” λͺ¨μˆœμ μΈ κ²°κ³Όκ°€ λ°œμƒν•˜κΈ°λ„ ν•©λ‹ˆλ‹€ [5, 6, 23]. --- *Last updated: 2026-04-19* - Raw Source: [[00_Raw/2026-04-20/InstancedMesh Performance Bottlenecks.md]] ---