47 lines
5.1 KiB
Markdown
47 lines
5.1 KiB
Markdown
---
|
|
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]]
|
|
---
|