# [[threejs Issue _30352|three.js Issue]] ## πŸ“Œ Brief Summary three.js Issue #30352λŠ” 곡유 속성을 κ°€μ§„ μ—¬λŸ¬ 개의 일반 `Mesh` 객체λ₯Ό λ Œλ”λ§ν•  λ•Œλ³΄λ‹€ `InstancedMesh`λ₯Ό μ‚¬μš©ν•  λ•Œ μ„±λŠ₯이 였히렀 크게 μ €ν•˜λ˜λŠ” ν˜„μƒμ„ λ³΄κ³ ν•œ μ΄μŠˆμž…λ‹ˆλ‹€ [1, 2]. 이 ν˜„μƒμ˜ μ£Όμš” 원인은 `InstancedMesh`κ°€ λ‚΄λΆ€ μΈμŠ€ν„΄μŠ€λ“€μ„ λ Œλ”λ§ν•  λ•Œ μ•žλ’€λ‘œ μžλ™ μ •λ ¬(Sorting)ν•˜μ§€ μ•Šμ•„ λ°œμƒν•˜λŠ” λ§‰λŒ€ν•œ μ˜€λ²„λ“œλ‘œμš°(Overdraw) λΉ„μš© λ•Œλ¬Έμž…λ‹ˆλ‹€ [3, 4]. 즉, 단일 λ“œλ‘œμš° 콜둜 μΈν•œ CPU μ—°μ‚° κ°μ†Œ 이득보닀 λΆˆν•„μš”ν•œ ν”½μ…€ 처리 λΆ€ν•˜κ°€ 더 μ»€μ§€λ©΄μ„œ 씬이 ν”„λž˜κ·Έλ¨ΌνŠΈ λ°”μš΄λ“œ(Fragment-bound) μƒνƒœμ— λΉ μ§€λŠ” ꡬ쑰적 ν•œκ³„λ₯Ό λ³΄μ—¬μ£ΌλŠ” μ‚¬λ‘€μž…λ‹ˆλ‹€ [5]. ## πŸ“– Core λŒ€ Content * **이슈 λ°œμƒ λ°°κ²½ 및 증상:** μž‘μ„±μž(MHebes)λŠ” 2025λ…„ 1μ›” 17일에 μƒμ„±ν•œ μ΄μŠˆμ—μ„œ, 50λΆ„ν• λœ ꡬ체 5,000개λ₯Ό λ Œλ”λ§ν•˜λŠ” ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€ [1, 2]. 일반적으둜 단일 λ“œλ‘œμš° μ½œμ„ μ‚¬μš©ν•˜λŠ” `InstancedMesh`κ°€ 훨씬 λΉ λ₯Ό κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜μ§€λ§Œ, μ‹€μ œλ‘œλŠ” κΈ°ν•˜ν•™μ  ꡬ쑰와 μž¬μ§ˆμ„ κ³΅μœ ν•˜λŠ” λ‹€μˆ˜μ˜ κ°œλ³„ `Mesh`λ₯Ό λ Œλ”λ§ν•  λ•Œλ³΄λ‹€ `InstancedMesh`의 ν”„λ ˆμž„ 레이트(FPS)κ°€ λˆˆμ— λ„κ²Œ λŠλ¦¬λ‹€λŠ” 것을 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€ [1, 2, 5]. * **원인 뢄석 (μ˜€λ²„λ“œλ‘œμš°μ™€ μ •λ ¬μ˜ λΆ€μž¬):** three.js κΈ°μ—¬μžλ“€(donmccurdy, gkjohnson)κ³Ό λ Œλ”λ§ νŒŒμ΄ν”„λΌμΈ 사둀 연ꡬ에 λ”°λ₯΄λ©΄, μ„±λŠ₯ μ €ν•˜μ˜ 핡심 원인은 μ˜€λ²„λ“œλ‘œμš°(Overdraw)μž…λ‹ˆλ‹€ [3-5]. 뢈투λͺ…ν•œ λ¬Όμ²΄λŠ” 일반적으둜 'μ•žμ—μ„œ λ’€λ‘œ' μ •λ ¬ν•˜μ—¬ 뒀에 κ°€λ €μ§„ ν”½μ…€ 연산을 μ‘°κΈ° μ’…λ£Œ(Early-Z)ν•΄μ•Ό ν•˜μ§€λ§Œ, `InstancedMesh`λŠ” μΈμŠ€ν„΄μŠ€μ˜ μžλ™ μ •λ ¬ κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ [5]. μ •λ ¬λ˜μ§€ μ•Šμ€ μΈμŠ€ν„΄μŠ€λ“€μ΄ 버퍼 μˆœμ„œλŒ€λ‘œ λ Œλ”λ§λ˜λ©΄μ„œ λ™μΌν•œ ν”½μ…€ μœ„μΉ˜μ— λ Œλ”λ§ μ“°κΈ° μž‘μ—…μ΄ μ—¬λŸ¬ 번 μ€‘μ²©λ˜μ—ˆκ³ , 이둜 μΈν•œ ν”½μ…€ 처리 λΉ„μš©μ΄ λ“œλ‘œμš° 콜 κ°μ†Œλ‘œ 얻은 CPU 이득을 μƒνšŒν•΄ λ²„λ ΈμŠ΅λ‹ˆλ‹€ [4, 5]. * **셰이더 및 재질의 영ν–₯:** μ΄λŸ¬ν•œ μ˜€λ²„λ“œλ‘œμš° λ¬Έμ œλŠ” λ³΅μž‘ν•œ μ‘°λͺ… 연산이 ν¬ν•¨λœ `MeshStandardMaterial`을 μ‚¬μš©ν•  λ•Œ ν”„λž˜κ·Έλ¨ΌνŠΈ λ°”μš΄λ“œ(Fragment-bound) μƒνƒœλ₯Ό μœ λ°œν•˜μ—¬ λ”μš± μ‹¬ν™”λ©λ‹ˆλ‹€ [3, 5]. λ”°λΌμ„œ 문제의 원인을 λͺ…ν™•νžˆ νŒŒμ•…ν•˜κΈ° μœ„ν•΄ μ˜€λ²„λ“œλ‘œμš° λΉ„μš©μ΄ 적은 `MeshBasicMaterial`둜 μž¬μ§ˆμ„ λ³€κ²½ν•˜μ—¬ 비ꡐ해 λ³Ό 것이 μ œμ•ˆλ˜κΈ°λ„ ν–ˆμŠ΅λ‹ˆλ‹€ [3]. * **μ œμ•ˆλœ λŒ€μ•ˆ 및 이슈 μ’…κ²°:** κΈ°μ—¬μžλ“€μ€ μ •λ ¬ κΈ°λŠ₯이 μ—†λŠ” `InstancedMesh` λŒ€μ‹ , μΈμŠ€ν„΄μŠ€μ˜ μ •λ ¬(Sorting)을 μ§€μ›ν•˜λŠ” `BatchedMesh`λ₯Ό μ‚¬μš©ν•΄ λ³Ό 것을 λŒ€μ•ˆμœΌλ‘œ ꢌμž₯ν–ˆμŠ΅λ‹ˆλ‹€ [4]. ν•΄λ‹Ή μ΄μŠˆλŠ” νŠΉμ • 기기의 버그가 μ•„λ‹ˆλΌ μ •λ ¬ λΆ€μž¬μ™€ μ˜€λ²„λ“œλ‘œμš°λ‘œ μΈν•œ 정상적인 ν•˜λ“œμ›¨μ–΄ ν•œκ³„ μ§€μ μž„μ΄ ν™•μΈλ˜μ–΄ 2025λ…„ 1μ›” 23일에 μ’…κ²°(Closed)λ˜μ—ˆμŠ΅λ‹ˆλ‹€ [4, 6]. ## πŸ”— Knowledge Connections - **Related Topics:** [[InstancedMesh|InstancedMesh]], [[Overdraw|Overdraw]], [[BatchedMesh|BatchedMesh]], [[Fragment-bound|Fragment-bound]] - **Projects/Contexts:** [[Threejs ᄉα…₯α†Όα„‚α…³α†Ό α„Žα…¬α„Œα…₯ᆨᄒα…ͺ|three.js]] - **Contradictions/Notes:** 이둠적으둜 `InstancedMesh`λŠ” λ“œλ‘œμš° 콜 횟수λ₯Ό 1회둜 쀄여주어 λ Œλ”λ§ μ„±λŠ₯을 ν–₯μƒμ‹œμΌœμ•Ό ν•˜μ§€λ§Œ, 이슈 #30352의 μ‚¬λ‘€μ—μ„œλŠ” κ°œλ³„ μ •λ ¬ λΆ€μž¬λ‘œ μΈν•œ μ˜€λ²„λ“œλ‘œμš° λΉ„μš© λ•Œλ¬Έμ— 였히렀 κ°œλ³„ λ“œλ‘œμš° 콜(5,000회)을 μˆ˜ν–‰ν•˜λŠ” 일반 `Mesh` 방식보닀 μ„±λŠ₯이 λ–¨μ–΄μ§€λŠ” λͺ¨μˆœμ μΈ κ²°κ³Όλ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€ [1, 2, 5]. --- *Last updated: 2026-04-19*