--- id: P-REINFORCE-AUTO-9C6ABB category: "10_Wiki/πŸ’‘ Topics/Graphics & Performance" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - Sorting" --- # [[Sorting|Sorting]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > 3D λ Œλ”λ§ ν™˜κ²½μ—μ„œ μ •λ ¬(Sorting)은 μΉ΄λ©”λΌμ™€μ˜ 거리λ₯Ό κΈ°μ€€μœΌλ‘œ 객체의 λ Œλ”λ§ μˆœμ„œλ₯Ό κ²°μ •ν•˜λŠ” 핡심 ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€. 뢈투λͺ…ν•œ κ°μ²΄λŠ” μ•žμ—μ„œ λ’€λ‘œ(Front-to-Back) μ •λ ¬ν•˜μ—¬ μ˜€λ²„λ“œλ‘œμš°λ₯Ό μ΅œμ†Œν™”ν•˜κ³ , 투λͺ…ν•œ κ°μ²΄λŠ” λ’€μ—μ„œ μ•žμœΌλ‘œ(Back-to-Front) μ •λ ¬ν•˜μ—¬ μ•ŒνŒŒ λΈ”λ Œλ”©(Alpha Blending)을 μ˜¬λ°”λ₯΄κ²Œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ ν•„μˆ˜μ μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μˆ˜λ§Žμ€ 객체λ₯Ό λ‹€λ£¨λŠ” μΈμŠ€ν„΄μ‹± ν™˜κ²½μ—μ„œλŠ” λ§€ ν”„λ ˆμž„ 정렬을 κ³„μ‚°ν•˜κ³  버퍼λ₯Ό μž¬λ°°μ—΄ν•˜λŠ” 과정이 μ‹¬κ°ν•œ CPU 병λͺ© ν˜„μƒμ„ μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€ [1, 2]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) - **μ •λ ¬μ˜ λͺ©μ κ³Ό ν•„μš”μ„±** 뢈투λͺ…ν•œ 물체λ₯Ό μ•žμ—μ„œ λ’€λ‘œ μ •λ ¬ν•˜λ©΄ 뒀에 κ°€λ €μ§„ ν”½μ…€ 연산을 쑰기에 μ’…λ£Œ(Early-Z)ν•  수 μžˆμ–΄ GPU μ„±λŠ₯이 ν–₯μƒλ©λ‹ˆλ‹€ [1]. 반면 투λͺ…도λ₯Ό κ°€μ§„ 객체의 경우, μ‹œκ°μ μΈ 였λ₯˜ 없이 μ˜¬λ°”λ₯Έ μ•ŒνŒŒ λΈ”λ Œλ”© κ²°κ³Όλ₯Ό μ–»κΈ° μœ„ν•΄ λ°˜λ“œμ‹œ λ’€μ—μ„œ μ•žμœΌλ‘œ λ Œλ”λ§ν•΄μ•Ό ν•©λ‹ˆλ‹€ [2, 3]. - **InstancedMesh의 μ •λ ¬ ν•œκ³„** 기본적으둜 Three.js의 `InstancedMesh`λŠ” 단일 λ“œλ‘œμš° 콜 λ‚΄μ—μ„œ 객체의 λ Œλ”λ§ μˆœμ„œλ₯Ό λ™μ μœΌλ‘œ λ³€κ²½ν•˜κ±°λ‚˜ μžλ™ μ •λ ¬ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ [1, 2]. 정렬을 κ΅¬ν˜„ν•˜λ €λ©΄ λ§€ ν”„λ ˆμž„ μΉ΄λ©”λΌμ™€μ˜ 거리λ₯Ό κ³„μ‚°ν•˜κ³  색상, λ³€ν™˜ ν–‰λ ¬ λ“± λͺ¨λ“  μΈμŠ€ν„΄μŠ€ 속성 데이터λ₯Ό μž¬μ •λ ¬ν•΄μ•Ό ν•˜λ―€λ‘œ λ§‰λŒ€ν•œ CPU μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•©λ‹ˆλ‹€ [2, 4]. - **μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ 및 처리 λΉ„μš©** 수만 개의 객체λ₯Ό μ •λ ¬ν•˜κΈ° μœ„ν•΄ 기수 μ •λ ¬(Radix Sort)κ³Ό 같은 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•  수 μžˆμœΌλ‚˜, 이λ₯Ό 메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰ν•˜λ©΄ CPU에 치λͺ…적인 λΆ€ν•˜λ₯Ό μ£Όμ–΄ ν”„λ ˆμž„ λ“œλžμ„ μœ λ°œν•©λ‹ˆλ‹€ [2, 5]. μ‹€μ œλ‘œ `BatchedMesh`μ—μ„œ `.sortObjects` μ˜΅μ…˜μ„ ν™œμ„±ν™”ν•˜λ©΄ `texSubImage2D` ν•¨μˆ˜ λ“±μ˜ 호좜둜 인해 CPU μ‚¬μš©λŸ‰μ΄ κΈ‰μ¦ν•˜κ³  ν”„λ ˆμž„ 속도가 30FPSμ—μ„œ 9FPS둜 λ–¨μ–΄μ§€λŠ” λ“± μ„±λŠ₯이 크게 μ €ν•˜λ˜λŠ” 사둀가 ν™•μΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€ [6-8]. - **λŒ€μ•ˆμ  μ •λ ¬ 기법** - **μΈλ””λ ‰μ…˜(Indirection) ν™œμš©:** `InstancedMesh2`와 같은 ν™•μž₯ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λ Œλ”λ§ν•  μΈμŠ€ν„΄μŠ€ 인덱슀λ₯Ό κ΄€λ¦¬ν•˜λŠ” λ³„λ„μ˜ `InstancedBufferAttribute`λ₯Ό μ‚¬μš©ν•˜μ—¬, μ‹€μ œ ν–‰λ ¬ 데이터λ₯Ό 직접 μ„žμ§€ μ•Šκ³ λ„ 효율적으둜 μ •λ ¬ 및 컬링을 μˆ˜ν–‰ν•©λ‹ˆλ‹€ [9]. - **닀쀑 그리기(Multi-Draw) ν™•μž₯:** WebGL의 `multi_draw` κΈ°λŠ₯을 μ‚¬μš©ν•˜λ©΄ 단일 λ“œλ‘œμš° μ½œμ„ μœ μ§€ν•˜λ©΄μ„œ μΈμŠ€ν„΄μŠ€ 그리기의 μˆœμ„œλ₯Ό μ§€μ •ν•  수 μžˆμ–΄ μ •λ ¬ 문제λ₯Ό μ™„ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [3, 10]. - **인덱슀 버퍼 μ—…λ°μ΄νŠΈ:** 정점 버퍼(Vertex Buffer) λŒ€μ‹  인덱슀 버퍼(Index Buffer)λ₯Ό μ—…λ°μ΄νŠΈν•˜μ—¬ 객체λ₯Ό μ •λ ¬ν•˜κ±°λ‚˜ μΈμŠ€ν„΄μŠ€ν™”ν•˜λŠ” 것도 μ˜€λ²„ν—€λ“œλ₯Ό μ€„μ΄λŠ” 효과적인 μ €μˆ˜μ€€ μ΅œμ ν™” κΈ°λ²•μž…λ‹ˆλ‹€ [11]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Graphics & Performance λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[InstancedMesh|InstancedMesh]], [[BatchedMesh|BatchedMesh]], [[Overdraw|Overdraw]], [[Alpha Blending|Alpha Blending]], [[Frustum Culling|Frustum Culling]], [[Radix Sort|Radix Sort]] - **Projects/Contexts:** [[Three.js|Three.js]], [[InstancedMesh2|InstancedMesh2]] - **Contradictions/Notes:** 투λͺ…도 및 μ˜€λ²„λ“œλ‘œμš° 해결을 μœ„ν•΄ 정렬이 ν•„μˆ˜μ μ΄μ§€λ§Œ, μ •λ ¬ μ—°μ‚° 자체(버퍼 μž¬λ°°μ—΄ λ“±)κ°€ CPU에 큰 λΆ€ν•˜λ₯Ό κ°€ν•˜κΈ° λ•Œλ¬Έμ— 였히렀 전체 ν”„λ ˆμž„ 레이트λ₯Ό λ–¨μ–΄λœ¨λ¦¬λŠ” 역섀적인 κ²°κ³Όλ₯Ό 낳을 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” GPU μ••λ°•κ³Ό CPU 병λͺ© μ‚¬μ΄μ˜ κ°€ν˜Ήν•œ μ ˆμΆ©μ•ˆμ„ μš”κ΅¬ν•©λ‹ˆλ‹€ [1, 2, 7, 8]. --- *Last updated: 2026-04-19* - Raw Source: 00_Raw/2026-04-20/Sorting.md ---