# Three.js Memory Management - FikoYT

## 🧹 Dispose Pattern

**Complete cleanup:**
```typescript
// FikoCizimYalin dispose()
dispose() {
  // Mesh cleanup
  if (this.mesh) {
    this.mesh.geometry?.dispose();
    (this.mesh.material as THREE.Material)?.dispose?.();
  }

  // Line cleanup
  if (this.cizgiler) {
    this.cizgiler.geometry?.dispose();
    (this.cizgiler.material as THREE.Material)?.dispose?.();
  }

  // Geometry cleanup
  this.meshGeom?.dispose();
  this.edgesGeom?.dispose();
  this.vertexGeom?.dispose();
}
```

## 🏊 Object Pooling

**Multi-level pools:**
```typescript
// Pre-configured pools
meshPool: ObjectPool<THREE.Mesh> = new ObjectPool(50);
geometryPool: ObjectPool<THREE.BufferGeometry> = new ObjectPool(20);
materialPool: ObjectPool<THREE.Material> = new ObjectPool(30);
```

**Usage pattern:**
```typescript
// Acquire
const mesh = meshPool.acquire();

// Use
mesh.geometry = geometry;
mesh.material = material;

// Release
meshPool.release(mesh);
```

## 💾 Resource Caching

**Cache levels:**
```typescript
// Multi-level caching
textureCache = new Map<string, THREE.Texture>();
materialCache = new Map<string, THREE.Material>();
geometryCache = new Map<string, THREE.BufferGeometry>();
```

## 🔄 Garbage Collection

**Component cleanup:**
```typescript
ngOnDestroy() {
  // Event listeners
  this.renderListeners.forEach(listener => listener());
  this.renderListeners.clear();

  // WebGL resources
  this.renderer.dispose();
  this.animationFrameId = undefined;

  // NgZone cleanup
  this.ngZone = null;
}
```

## ⚠️ Memory Leaks

**Common causes:**
- **Event listeners:** Always cleanup
- **Textures:** Dispose all
- **Geometries:** Complex shapes
- **Render loops:** Cancel requestAnimationFrame

---

2025-11-06