holodepth

Framework entegrasyonları · Vue + Three

Reaktif Kaçış & Performans: rAF Sonrası Vergi Ne Zaman Kalır?

markRaw ve doğru rAF çoğu vitrini taşır; sıcak yollarda reaktivite vergisi hâlâ ürünü yer. Bu sayfa ölçülmüş kaçış eşiğini anlatır: Vue 101 tekrarı, watchEffect kare dersi veya R3F / Angular kaçış kopyası değildir.

Holodepth bu yaprağı genel «optimize et» sloganı olarak yazmaz. Temel tik ve watchEffect yasağı Kare döngüsü & watchEffect yaprağında mühürlendi; burada soru «rAF nasıl kurulur?» değil, «doğru rAF sonrası hangi Vue vergisi kalır?». Proxy sınırı Reaktif şablon → Object3D yaprağındadır. R3F imperatif ada modeli Performans & imperatif kaçış yaprağındadır (Fiber uzlaştırma vergisi). Angular Zone eşiği Zone kaçışı & performans yaprağındadır (CD / OnPush adası). Ms / jank SLA Platform · FPS yaprağındadır. glTF LOD format / Platform asset izleklerindedir.

Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz: «markRaw ve rAF ilk kapılardır, son kapı değildir. Şablon seli, pause edilmemiş effect ve v-for kalabalığı ayrı vergidir. Sıcak çekirdek dar composable + Object3D ister. Ölçüm olmadan full imperatif borçtur. Vue + Three izleği burada kapanır.»

Bu sayfanın sınırı · komşu konularla ayrım

Bu sayfa Vue 3 + Three'de reaktif kaçış / performans eşiğini anlatır:

  • rAF doğruyken kalan reaktivite sinyalleri
  • stop / pauseEffect · effect ömrü
  • v-for kalabalığı vs instance köprüsü
  • Worker şeridi · ölçüm eşiği · izlek kapanışı

Bilinçli olarak dışarıda bırakılan konular:

Kısa ayrım: Bu sayfa «rAF sonrası ne zaman daha sert kaçılır?» · Kare döngüsü «tik grafiği üretmesin» · R3F kaçış «Fiber uzlaştırma adası» · Angular kaçış «Zone / CD adası» · Platform «ms dilimi».

Ölçüm eşiği: kapı önce burada

«Daha akıcı hissettim» kaçış kararı değildir. Holodepth: aynı kamera yolu, aynı sahne yoğunluğu, taban ms / p99 (Platform · FPS). rAF ve markRaw uygulandıktan sonra JS dilimi hâlâ şişiyor mu? Şablon patch sayısı kareyle korelasyonlu mu? GPU sakin ama Vue «yanıyor» mu?

Eşik yazılmadan full imperatif composable veya her kalabalığı instance yapmak prematüre borçtür. Önce ölçün, sonra hangi salonda vergi kaldığını adlandırın.

Kaçış ölçümsüz slogan değil; kanıtlı eşik kararıdır.

rAF doğru, vergi kalır

Kare döngüsü reaktif kapı dışında, Object3D markRaw hattında yaşasa bile Vue ağacı başka kanallardan sarsılabilir. Holodepth sinyal listesi: parent her tur yeni object literal prop basıyor; computed her kareye bağlı ref okuyor; global store / provide-inject seyrek değil sık güncelleniyor; Tres şablonu sürekli prop yeniliyor; picking her pointermove'da ref yazıyor (önceki yaprakta seyreltildi mi?).

Bu tablo «Vue yavaş» değil «vergi hangi salonda?» sorusudur. R3F'de uzlaştırma, Angular'da CD; Vue'da şablon patch + effect grafiğidir. markRaw tek başına şablon selini durdurmaz.

stop ve pauseEffect: ömür vergisi

Kare yaprak watchEffect yasağını anlattı; kaçış yaprak effect ömürünü anlatır. Mount'ta açılan watch, watchEffect veya watchPostEffect unmount'ta stop() ile kapatılmazsa hayalet izleme devam eder. Gizli sekme veya vitrin pause bayrağı varken effect hâlâ graf güncelliyorsa pil ve CPU faturası sürer.

Holodepth: sıcak sahne composable'ı dar API sunar; dışarıdan gelen active veya quality seyrek ref'tir. Effect içinde her kare mesh itmek yerine pause edilmiş effect veya manuel pause / resume (Vue 3.5+) ile grafı dondurun. onBeforeUnmount yalnızca rAF stop değil; tüm effect stop siluetinin parçasıdır.

v-for kalabalığı vs instance

Binlerce <TresMesh v-for="item in crowd" :key="item.id"> hem Vue patch hem Three draw tarafında pahalıdır. Reaktif harita yaprak :key remount uyarısını verdi; kaçış yaprak eşiği sorar: N kaçta v-for terk edilip InstancedMesh köprüsüne geçilir? Karar ürün ticket'ında yazılır; instancing matematiği Three omurgasındadır.

Kaba süzgeç
Ölçek İlk tercih Kaçış
Onlarca unique parça v-for + dar prop Nadiren
Yüzler–binler benzer Instance + ince shell Şablon patch / draw
Her biri unique material graph Atlas / sınırlı varyant Instance tek başına yetmez

Shell şablon · sıcak composable

Holodepth model: canvas host, ışık, kamera, seyrek panel bağları şablonda veya Tres deklaratifinde kalır; parçacık, trail, kalabalık gibi sıcak çekirdek useHotStage benzeri composable içinde markRaw Object3D üzerinde yaşar. R3F «shell deklaratif · ada ref» ile aynı diplomatiktir; fark Vue'da composable + provide-inject sınırıdır.

Parent her saniye yeni { x, y, z } literal gönderiyorsa OnPush benzeri «seyrek prop» kuralı kırılır. Dar API: 2–3 ref veya emit; içeride buffer tick. Tüm uygulamayı «Vue'suz Three»ye çevirmek nadiren kazançtır.

Ağır işi şeritten çıkarın

Büyük dizi map'i, pathfinding, mesh birleştirme ana iş parçacığında reaktivite fark etmeksizin jank üretir. Worker veya async chunk offload ürün kararıdır; sonuç main'de seyrek watch ile merge edilir. Holodepth: kaçış yalnızca Proxy değildir; CPU şeridi de olabilir. Worker mesajlarında structured clone maliyetini ve COUNT tavanını bilin.

Kaçış disiplini

  1. Ölç (taban ms, patch / effect sayımı, dilim).
  2. rAF + markRaw + effect stop doğrula.
  3. Şablon seli ve prop referans yağmuruna dokun.
  4. v-for eşiğinde instance veya worker.
  5. Full imperatif ancak kanıtla ve belgele.

Angular kaçışındaki Outside sırası burada «doğru tik → dar composable → liste/instance → radikal» olur. Borç: COUNT tavanı, sahiplik, neden kaçıldığı üç satır ticket.

Yanlış kaçışlar

  • Ölçüm yokken tüm sahneyi composable'a taşımak.
  • GPU bound sorunu görüp yalnız Vue Proxy'sini suçlamak.
  • Her kalabalığı instance yapmak (unique graph varken).
  • Effect stop unutup «pause» bayrağına güvenmek.
  • markRaw yazıp her kare :rotation-y bağlamak (çift kapı).
  • useFrame veya NgZone ezberi (Vue'da Fiber store veya Zone yok).

Güvenli ada: simüle kaçış

Örnekler öğretim amaçlıdır. rAF / markRaw önceki yapraklarda varsayılır. Vue reaktivite 101 öğretilmez.

Simüle · dar shell + effect stop. Dışarıya yalnız active ve quality; sıcak tick composable içinde.

import { shallowRef, watch, onBeforeUnmount, markRaw } from 'vue'
import * as THREE from 'three'

/**
 * Shell şablon seyrek prop alır · sıcak çekirdek composable'da.
 * active/quality her tur yeni object literal DEĞİL · primitive veya sabit ref.
 */
export function useHotStage(
  scene: THREE.Scene,
  active: { value: boolean },
  quality: { value: 'low' | 'high' },
) {
  const root = shallowRef(markRaw(new THREE.Group()))
  scene.add(root.value)

  let raf = 0
  const clock = new THREE.Clock()
  const COUNT = quality.value === 'high' ? 128 : 64

  const tick = () => {
    if (!active.value) return
    const t = clock.getDelta()
    root.value.rotation.y += t * 0.6
    raf = requestAnimationFrame(tick)
  }

  const stopWatch = watch(
    () => [active.value, quality.value] as const,
    ([on]) => {
      cancelAnimationFrame(raf)
      raf = 0
      if (on) {
        clock.start()
        raf = requestAnimationFrame(tick)
      }
    },
    { immediate: true },
  )

  onBeforeUnmount(() => {
    stopWatch()
    cancelAnimationFrame(raf)
    scene.remove(root.value)
  })

  return { root, COUNT }
}

Simüle · v-for terk · instance yüzeyi. Angular @for veya R3F JSX listesi yok; tek InstancedMesh.

import { markRaw, shallowRef } from 'vue'
import * as THREE from 'three'

const COUNT = 400 // Ürün tavanı · profil ile doğrula · kullanıcıdan sınırsız alma

/** v-for YOK · tek InstancedMesh · tick useLoop / rAF'ta */
export function useCrowdInstances(scene: THREE.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 = markRaw(new THREE.InstancedMesh(geo, mat, COUNT))
  const shell = shallowRef(mesh)
  scene.add(mesh)

  const dummy = new THREE.Object3D()

  return {
    shell,
    tick(elapsed: number) {
      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. Composable dispose yükleme yaprağıyla aynı sahiplik dilimindedir.

Kaçış tuzakları

  1. Premature composable: ölçüm yok, okunabilirlik yok.
  2. Hayalet effect: stop unutulmuş watchEffect.
  3. Çift kapı: markRaw + her kare şablon prop.
  4. v-for unutulmuş: instance yok patch var.
  5. GPU'yu Vue sanmak: yanlış dilim.
  6. COUNT sınırsız: bellek DoS.
  7. Dispose yok: composable sızıntısı.
  8. Kare dersi tekrarı: watchEffect yasağı bu sayfada yeniden öğretilmez.

Üç kaçış profili

  • 01 · Kaçış

    Vitrin (yumuşak)

    Seviye
    rAF + markRaw + effect stop
    Şablon
    Az unique parça · seyrek prop
    Risk
    Erken full imperatif
  • 02 · Kaçış

    Sıcak FX composable

    Seviye
    Dar ref · buffer tick
    Effect
    pause / stop mühürlü
    Risk
    Parent object literal
  • 03 · Kaçış

    Kalabalık

    Seviye
    Instance · v-for terk
    Tavan
    COUNT ürün sabiti
    Risk
    Unique material tuzağı

Holodepth perspektifleri

Sırayı unutmayın

Doğru tik → effect ömrü → şablon seli → v-for/instance → radikal. Tersten başlamak pahalıdır.

Shell'i koruyun

Tüm Vue şablonunu silmek nadiren kazançtır; dar composable çoğu zaman yeter.

Borcu yazın

COUNT, effect stop, neden kaçıldığı: üç satır ticket.

Teşhis maddeleri

  1. rAF doğruyken hâlâ şablon patch yangını var mı?
  2. Effect'ler unmount'ta stop ediliyor mu?
  3. Prop referansları her tur yenileniyor mu?
  4. v-for ölçeği instance eşiğini geçti mi?
  5. GPU bound yanlışlıkla Vue'ya mı yükleniyor?
  6. Önce-sonra ölçüm alındı mı?
  7. COUNT tavanı var mı?
  8. watchEffect kare dersi bu sayfaya sızmış mı?

Holodepth içgörüsü

Vue + Three performansı «Proxy'yi kapat» sloganı değildir; verginin hangi salonda olduğunu bilmektir. İzlek: mount → harita → tik → kargo → bağ → kaçış.

İzlek kapanışı · sonraki kapılar

Vue + Three alt ana konusu bu yaprakla kapanır. Ölçüm için Platform · FPS yaprağına dönün. Framework kardeş köprüleri: R3F imperatif kaçış ve Angular Zone eşiği yukarıda linklendi. Döngü için Mount & kök sözleşmesi yaprağına dönebilirsiniz; Angular host omurgası Host & kök sözleşmesi yaprağında karşılaştırmalı okunabilir.