Framework entegrasyonları · Angular + Three
Zone Kaçışı & Performans: Ne Zaman Ada Yetmez?
runOutsideAngular çoğu vitrini kurtarır; sıcak yollarda
hâlâ Angular vergisi kalır. Bu sayfa ölçülmüş kaçış
eşiğini anlatır: NgZone 101 tekrarı veya R3F imperatif kaçış kopyası
değildir.
Holodepth bu yaprağı genel «optimize et» sloganı olarak yazmaz. Temel tik politikası Kare döngüsü & NgZone yaprağındadır. R3F ada modeli Performans & imperatif kaçış yaprağındadır (Fiber uzlaştırma vergisi). Ms / CPU-GPU Platform · FPS / CPU / GPU yapraklarındadır. Instancing matematiği Three'dedir. glTF LOD format / Platform asset'tedir.
Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz: «OutsideAngular ilk kapıdır, son kapı değildir. CD / liste / bind yağmuru ayrı vergidir. Sıcak ada Object3D + dar API ister. Ölçüm olmadan zoneless ezberi borçtur. Angular + Three izleği burada kapanır.»
Bu sayfanın sınırı · komşu konularla ayrım
Bu sayfa Angular + Three'de Zone kaçış / performans eşiğini anlatır:
- Outside yetmez sinyalleri
- CD / OnPush / dar API adası
- Liste vs instance · ölçüm köprüsü
- Üç kaçış profili · izlek kapanışı
Bilinçli olarak dışarıda bırakılan konular:
- Temel rAF / Outside döngü → Kare döngüsü & NgZone
- R3F ref/instance kaçış → R3F · Performans & kaçış
- Host / şablon / yük / pick → önceki Angular yapraklar
- FPS ms / CPU-GPU dilimleri → Platform
- Zoneless CD tam müfredatı · InstancedMesh formül · glTF
Kısa ayrım: Bu sayfa «Outside sonrası ne zaman daha sert kaçılır?» · NgZone yaprağı «tik nasıl Outside'ta yaşar?» · R3F kaçış «Fiber uzlaştırma adası» · Platform «ms dilimi».
OutsideAngular yetmez sinyalleri
Döngü Outside'ta olsa bile: her kare async pipe, geniş
@for, parent'tan inen input sağanağı, global
store select'leri Angular ağacını sarsar. Holodepth sinyal listesi:
profilde JS dilimi yüksek, GPU sakin; CD sayısı kareyle korelasyonlu;
Three tick ince ama şablon «yanıyor».
Bu sinyal yokken zoneless veya full imperatif'e zıplamak prematüre borçtır. Önce ölçün (Platform), sonra eşiği yazın.
Outside kapıyı açar; vergi bazen içerideki salondadır.
CD adası: dar yüzey
Holodepth model: 3D host bileşeni OnPush (veya eşdeğeri), dışarıya 2–3 input / output; içeride Object3D mutasyonu. Parent her saniye yeni object literal basıyorsa OnPush bile kırılır — şablon haritasındaki «kur bir kez» kuralının performans kuzeni.
detach() / elle mark nadiren; çoğu üründe dar API + Outside
yeter. detach'i «sihir kill switch» yapmayın; ölçüm ve belge şart.
Liste vergisi vs instance
Binlerce app-part-node Angular + Object3D çifti doğurur.
Holodepth: kalabalık benzeri sahnelerde şablon döngüsünü bırakıp
instance köprüsüne geçin (Three derinliği link). Karar cümlesi ürün
ticket'ında: N eşik, track maliyeti, draw maliyeti.
| Ölçek | İlk tercih | Kaçış |
|---|---|---|
| Onlarca unique parça | Bileşen + group | Nadiren |
| Yüzler–binler benzer | Instance + dar host | Liste CD / draw |
| Unique material graph | Atlas / sınırlı varyant | Instance tek başına yetmez |
Ağır işi şeritten çıkarın
Parse, pathfinding, büyük dizi map'i ana iş parçacığında Zone fark etmeksizin jank üretir. Worker / async chunk Offload ürün kararıdır; sonuç main'de seyrek merge edilir. Holodepth: kaçış yalnızca Zone değildir; CPU şeridi de olabilir (Platform CPU/GPU).
Zoneless sinyali (eşik)
Deneysel / olgunlaşan zoneless change detection tüm uygulamayı yeniden sözleşmeye zorlar. Holodepth: Three vitrini için varsayılan reçete değildir. Sinyal: uygulama zaten signal-first ve ölçüm Outside'ın yetmediğini gösteriyor. Bu sayfa zoneless kurulum öğretmez; «tüm Angular'ı silmeden önce ada ve OnPush» sırasını mühürler.
Kaçış disiplini
- Ölç (taban ms, CD sayımı, dilim).
- Outside + dar API dene.
- Liste / bind vergisine dokun.
- Instance veya worker eşiği.
- Zoneless / radikal ancak kanıtla.
R3F kaçışındaki «shell deklaratif · ada elle» burada «shell Angular · çekirdek Object3D» olur. Aynı borç: belge, tavan (COUNT), sahiplik.
Yanlış kaçışlar
- Ölçüm yokken zoneless.
- GPU bound sorunu görüp yalnız Zone'u suçlamak.
- Her vitrini instance yapmak.
- detach edip unutmak (UI ölür).
- Outside yazıp her kare markForCheck yağdırmak.
Güvenli ada: simüle kaçış
Örnekler öğretim amaçlıdır. Outside döngü önceki yaprakta varsayılır.
Simüle · OnPush host + dar input.
import {
ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges,
} from '@angular/core'
/**
* Shell Angular · sıcak çekirdek FrameLoopService / Object3D'de.
* active seyrek UI input'udur · her kare yeni object literal gelmez.
*/
@Component({
selector: 'app-hot-stage',
template: `<canvas #glCanvas></canvas>`,
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class HotStageComponent implements OnChanges {
/** Yalnız anlamlı değişimde · {x,y,z} her CD'de yeni referans üretmeyin */
@Input() active = true
@Input() quality: 'low' | 'high' = 'high'
ngOnChanges(changes: SimpleChanges): void {
if (changes['active'] || changes['quality']) {
// Loop service / particle tavanı güncelle — CD selı yok
}
}
}
Simüle · instance yüzeyi (Angular host ince).
import * as THREE from 'three'
const COUNT = 400 // Ürün tavanı · profil ile doğrula · kullanıcıdan sınırsız alma
/** Angular @for YOK · tek InstancedMesh · tick Outside loop'ta */
export function createCrowd(scene) {
const geo = new THREE.BoxGeometry(0.2, 0.2, 0.2)
const mat = new THREE.MeshStandardMaterial({
color: '#9aa6b8', roughness: 0.5, metalness: 0.15,
})
const mesh = new THREE.InstancedMesh(geo, mat, COUNT)
const dummy = new THREE.Object3D()
scene.add(mesh)
return {
mesh,
tick(elapsed) {
for (let i = 0; i < COUNT; i++) {
const col = i % 20
const row = (i / 20) | 0
dummy.position.set(col * 0.35 - 3.5, Math.sin(elapsed + i * 0.01) * 0.15, row * 0.35 - 3.5)
dummy.rotation.y = elapsed * 0.4 + i * 0.02
dummy.updateMatrix()
mesh.setMatrixAt(i, dummy.matrix)
}
mesh.instanceMatrix.needsUpdate = true
},
dispose() {
scene.remove(mesh)
geo.dispose()
mat.dispose()
},
}
}
Güvenlik: COUNT / buffer boyutunu kullanıcı girdisinden doğrulamadan şişirmeyin. Worker mesajlarında structured clone maliyetini bilin.
Kaçış tuzakları
- Premature zoneless: uygulamayı böler.
- Outside + mark yağmuru: vergi geri gelir.
- Liste unutulmuş: instance yok CD var.
- GPU'yu Zone sanmak: yanlış dilim.
- COUNT sınırsız: bellek DoS.
- Dispose yok: ada sızıntısı.
- R3F useFrame ezberi: Fiber store yok.
Üç kaçış profili
-
01 · Kaçış
Vitrin (yumuşak)
- Seviye
- Outside + OnPush
- Liste
- Az unique parça
- Risk
- Erken radikalizm
-
02 · Kaçış
Sıcak FX adası
- Seviye
- Dar input · buffer tick
- CD
- Parent'tan object literal yok
- Risk
- needsUpdate / sızıntı
-
03 · Kaçış
Kalabalık
- Seviye
- Instance · @for terk
- Tavan
- COUNT ürün sabiti
- Risk
- Unique material tuzağı
Ölçüm köprüsü
«Daha akıcı hissettim» kapı değildir. Aynı kamera yolu, taban ms / p99 (Platform FPS), mümkünse CD sayımı / performance mark. Outside sonrası JS dilimi düştü mü? Liste mi instance mı? GPU aynı mı kaldı?
Holodepth perspektifleri
Sırayı unutmayın
Outside → dar API → liste/instance → radikal. Tersten başlamak pahalıdır.
Shell'i koruyun
Tüm Angular'ı silmek nadiren kazançtır; ada çoğu zaman yeter.
Borcu yazın
COUNT, sahiplik, neden kaçıldığı: üç satır ticket.
Teşhis maddeleri
- Outside yapıldıktan sonra hâlâ CD yangını var mı?
- Input referansları her tur yenileniyor mu?
- @for ölçeği instance eşiğini geçti mi?
- GPU bound yanlışlıkla Zone'a mı yükleniyor?
- Önce-sonra ölçüm alındı mı?
- COUNT tavanı var mı?
- Dispose / stop loop bağlı mı?
- R3F veya glTF bu sayfaya sızmış mı?
Holodepth içgörüsü
Angular + Three performansı «Zone'u kapat» sloganı değildir; verginin hangi salonda olduğunu bilmektir. İzlek: host → harita → tik → kargo → bağ → kaçış.
İzlek kapanışı · sonraki kapılar
Angular + Three alt ana konusu bu yaprakla kapanır. Ölçüm için Platform FPS / CPU-GPU'ya dönün. Framework'te Vue + Three iskeleti bekler; R3F ve Angular omurgaları kardeş köprülerdir. Döngü için Host köküne dönebilirsiniz.