Framework entegrasyonları · React Three Fiber
Canvas & Kök Sözleşme: Sahnenin Gümrük Kapısı
<Canvas> bir mesheden önce gelen
kök sözleşmedir: WebGL bağlamını kim açar, boyut ve
DPR kim yazar, kare ritmi kim onaylar, unmount'ta kim
temizler. Bu sayfa JSX veya hook temeli öğretmez; React varsayılır · kapı
kilidini anlatır.
Holodepth bu yaprağı «hello cube» turu veya React Vitae'nin bileşen dilinin tekrarı olarak yazmaz. Bakış açısı: imperatif Three kökü ile R3F Canvas'ının diplomatik farkı. Mesh / materyal / buffer teorisi Three.js ve WebGL omurgasındadır; kare milisaniye SLA'sı Platform · FPS mantığı yaprağındadır. JSX ile sahne grafı yazmak sonraki R3F yaprağındadır. glTF paket şeması veya loader sözleşmesi bu kapının konusu değildir.
Sayfayı bitirdiğinizde şu cümleyi kurabilmelisiniz: «Canvas, React ağacı ile GPU bağlamı arasındaki tek gümrük kapısıdır. Boyut ve DPR CSS kutusundan ayrı yazılır. frameloop ürün politikasıdır. gl bayrakları renderer imzasını mühürler. İkinci Canvas ikinci context demektir. Mount/unmount bağlam ömrünü yönetir. Sonraki kapı deklaratif sahne grafıdır.»
Bu sayfanın sınırı · komşu konularla ayrım
Bu sayfa R3F'de Canvas kök sözleşmesini anlatır:
- Context tekelliği · host DOM yerleşimi
- size / dpr · frameloop
glimzası · güvenli mount / unmount- Üç kök profili (vitrin / panel / tam ekran)
Bilinçli olarak dışarıda bırakılan konular:
- React temeli, hooks, Suspense 101 → React Vitae
- JSX ↔ Object3D haritası → Deklaratif sahne grafı
useFrame/ store → useFrame / useThree- Yükleme / dispose / async → Yükleme & Suspense köprüsü
- Kare ms / FPS SLA → FPS mantığı
- glTF / GLB şema ve DCC export → 3D format / modelleme izlekleri
Kısa ayrım: Bu sayfa «kapı nasıl mühürlenir?» · Deklaratif graf «kapının arkasında ne yazılır?» · useFrame «kapı açıkken kim tik atar?» · Platform FPS «tik'in ms bütçesi».
Kök sözleşme: gümrük kapısı
Imperatif Three'de çoğu ekip new WebGLRenderer({ canvas }),
bir Scene, bir Camera ve kendi
requestAnimationFrame döngüsünü elle bağlar. R3F'de bu torba
<Canvas> altına toplanır: React çocukları Three
nesnelerine çevrilmeden önce bağlam, boyut, döngü ve olay
kökü mühürlenir.
Kapı metaforu bilinçlidir. Mesh'i yanlış yazmak sahneyi bozar; kökü yanlış mühürlemek ise tüm oturumu bozar: bulanık çıktı, çift context, sessiz kare durması, unmount sonrası sızıntı. Holodepth: önce kapı, sonra kargo.
Sahne grafı yük taşır; kök sözleşme gümrük mührüdür.
Imperatif kök ile Canvas diplomasi
İkisi de aynı GPU API'ye yaslanır. Fark, yetki dağılımıdır: imperatif kökte resize, pixel ratio, tone mapping ve dispose sizin elinizdedir; Canvas'ta varsayılanlar R3F'nin kök imzasından gelir ve prop'larla bilinçli olarak ezilir. «Sihir» yoktur: ezmediğiniz her şey varsayılandır; varsayılan ürün değildir.
Holodepth üretiminde karar cümlesi şudur: R3F kullanıyorsanız kök
davranışını Canvas prop'larında yazın; imperatif kaçış
sonraki yaprakta konuşulur. İkisini de yarıda bırakmak («biraz R3F,
biraz elle setSize») çift kaynaktan beslenen kırılgan bir köprü üretir.
React'e özel dil (props drilling, Context Provider temeli) buranın dersi değildir. Buranın dersi: hangi API yüzeyi kök imzasını taşır?
Tek context · çok Canvas tuzağı
Her <Canvas> tipik olarak kendi
WebGLRenderer / WebGL bağlamını açar. Sayfada üç küçük
vitrin = üç context; mobil GPU'da bu, ürün kararından önce bütçe
felaketidir. Holodepth kuralı: mümkün olduğunca tek canlı
Canvas; ikinci kök ancak bilinçli ürün ihtiyacıysa
(ör. ayrı HUD ile tam ayrı GPU oturumu) açılır.
Alternatifler kök sözleşmenin parçasıdır: tek Canvas içinde birden fazla kamera / katman; veya UI'yi DOM'da tutup 3D'yi tek panoya bağlamak. «Her kart kendi Canvas'ı» pazarlama demosunda hoş, üretimde pahalıdır.
- Paylaşılan doku / FBO: ikinci kökten daha zor ama çoğu zaman daha ucuz (derinlik Three/WebGL omurgasında).
- Gizli sekme: arka planda boşta dönen ikinci Canvas, pil ve termal bütçeyi yer.
- SSR / hydration: kök yalnızca istemcide açılmalı; sunucuda WebGL yoktur (React SSR stratejisi Vitae'ye aittir; burada yalnızca «Canvas client-only» kuralı mühürlenir).
Boyut ve DPR: iki defter
CSS kutusu (layout px) ile çizim tamponu (backing store) aynı şey
değildir. Retina / yüksek DPI'de devicePixelRatio
2 veya 3 olabilir; tamponu sınırsız şişirmek fill-rate'i yakar. R3F
dpr prop'u bu diplomasiyi mühürler: çoğu ürün
dpr={[1, 2]} gibi bir tavan yazar.
size / yeniden boyut: Canvas host'unun layout'u değişince
renderer setSize yoluna düşer. Host'u height: 0 veya
yüzde/flex hatasında bırakmak «siyah kutu» veya 1×1 tampon üretir.
Holodepth: host'a açık yükseklik sözleşmesi verin; sonra Canvas'ın
boyut gözlemcisinin çalışmasına izin verin.
| Defter | Ne ölçer? | Kök kararı |
|---|---|---|
| CSS / layout | Host kutunun ekrandaki yeri | Flex/grid · min-height · aspect |
| Backing store | Gerçek piksel tamponu | dpr tavanı · setSize |
| Görsel keskinlik | Kullanıcının algıladığı netlik | DPR ↑ maliyeti ↑; tavan ürün kararı |
Platform FPS yaprağı ms bütçesini anlatır; burada yalnızca şunu mühürleriz: kökte yanlış DPR, bütçeyi daha semptom görmeden yakar.
frameloop: her zaman mı, talepte mi?
Varsayılan sürekli döngü vitrinde doğaldır; dashboard paneli veya
durağan ürün görselinde israftır. R3F frameloop kök
politikasıdır:
always: sürekli tik · animasyon / orbit canlılığıdemand: yalnızca geçersizkılınca çizer ·invalidate()ile uyanırnever: elle yönetilen uç senaryo · nadiren ürün varsayılanı
Holodepth: panelli UI + seyrek güncellemede demand varsayılan
adayıdır; sürekli motion'ta always. Bu seçim
useFrame yazmayı öğretmez (sonraki yaprak); kökte hangi
metronomun çalışacağını seçer. Ms SLA ve jank politikası Platform FPS
yaprağındadır.
Boşta dönen Canvas, sessizce yanan bir bütçedir.
gl kapısı: renderer imzası
gl prop'u (veya eşdeğeri kök ayarları) antialiasing,
powerPreference, alpha, preserveDrawingBuffer gibi
bağlam oluşturma kararlarını taşır. Tone mapping /
outputColorSpace gibi renderer imza alanları da kökte
bilinçli mühürlenmelidir; aksi hâlde her sahne «neden gri / neden
yanık?» tartışmasına düşer.
Holodepth kuralı: renk uzayı ve tone mapping'i ürün sabitleri gibi kökte yazın; her mesh'te rastgele değiştirmek yerine tek kapıdan geçirin. Shader/PBR teorisi WebGL ve materyal omurgasındadır; burada yalnızca imzanın nerede mühürlendiği netleşir.
shadows, flat, linear gibi kök
bayrakları da aynı diplomasiye aittir: varsayılanı ezmeden «neden gölge
yok?» demek, kapıyı okumamaktır.
Host DOM: Canvas'ın oturduğu kutu
Canvas bir React çocuğu olarak bir host'a yerleşir. Host'un
position, overflow, aspect-ratio ve pointer-events
politikası, 3D olay kökünün çalışıp çalışmayacağını belirler. Host
display: none iken boyut sıfırlanır; tekrar görünür
olduğunda resize yolunun tetiklenmesi gerekir.
Layout thrashing: stil değişiminde her karede host ölçüsü okuyup yazmak ana iş parçacığını yer. Kök yerleşimi mümkün olduğunca kararlı tutun; animasyonu Three tarafında (sonraki yapraklar) veya CSS transform ile host'u sürekli ölçtürmeden taşıyın.
Erişilebilirlik ve odak: 3D vitrin çoğu zaman fare/dokunmatik odaklıdır; klavye ve azaltılmış hareket tercihleri ürün politikasına aittir. Holodepth: kök host'a anlamlı bir etiket / rol stratejisi düşünün; «kör tuval» üretmeyin. Pointer picking derinliği ayrı R3F yaprağındadır.
Güvenli kök: simüle mühür
Aşağıdaki örnekler öğretim amaçlı, güncel R3F yüzeyine yaslanan simüle kalıplardır. Sürüm API'si değişebilir; projede paket sürümünüzü doğrulayın. React kurulumu, Vite iskeleti veya hook temeli anlatılmaz.
Simüle · vitrin kökü (sürekli döngü + DPR tavanı).
children, host kutusu ve Canvas önceden ürün ağacına
bağlanmış kabul edilir.
import { Canvas } from '@react-three/fiber'
export function ProductStage({ children }) {
return (
<div className="r3f-host" style={{ width: '100%', height: '100%', minHeight: 360 }}>
<Canvas
dpr={[1, 2]}
frameloop="always"
gl={{
antialias: true,
alpha: false,
powerPreference: 'high-performance',
// Eğitim notu: preserveDrawingBuffer yalnızca ekran görüntüsü ihtiyacında.
preserveDrawingBuffer: false,
}}
camera={{ position: [0, 1.4, 4], fov: 42, near: 0.1, far: 200 }}
onCreated={({ gl }) => {
// Kök imza: renk uzayı / tone mapping ürün sabitine bağlanır.
gl.outputColorSpace = 'srgb'
gl.toneMapping = 4 // THREE.ACESFilmicToneMapping (sürüme göre import edin)
}}
>
{children}
</Canvas>
</div>
)
}
Simüle · panel kökü (demand · boşta çizme). Veri
seed değişince kök invalidate ile uyanır.
import { Canvas, useThree } from '@react-three/fiber'
import { useEffect } from 'react'
function WakeOnProp({ seed }) {
const invalidate = useThree((s) => s.invalidate)
useEffect(() => {
invalidate()
}, [seed, invalidate])
return null
}
export function DashboardPanel({ seed, children }) {
return (
<div className="r3f-host r3f-host--panel" style={{ height: 240 }}>
<Canvas
dpr={[1, 1.5]}
frameloop="demand"
gl={{ antialias: true, alpha: true, powerPreference: 'default' }}
orthographic
camera={{ position: [0, 0, 10], zoom: 48 }}
>
<WakeOnProp seed={seed} />
{children}
</Canvas>
</div>
)
}
Unmount: rota değişiminde Canvas ağaçtan düşer; R3F renderer'ı ve GL kaynaklarını salmaya çalışır. Yine de kök dışında elle eklediğiniz listener / worker / paylaşılmış texture referansları sizin borcunuzdur. «loseContext» ve sekme gizleme politikası ürün kontrol listesine yazılır.
Güvenlik notu: kullanıcıya açık URL'den shader / model çekmek kök
sözleşmenin değil asset borusunun işidir; yine de Canvas host'unda
CORS ve crossOrigin hataları siyah ekran üretebilir.
Loader derinliği yükleme yaprağındadır.
Üç kök profili
Aynı Canvas API'si üç farklı mühür ister. Profil seçmeden
«best practice» ezberlemek kırılganlık üretir.
-
01 · Kök
Vitrin / ürün sahnesi
- frameloop
always(canlı orbit / idle motion)- dpr
[1, 2]· keskinlik öncelikli- Risk
- İkinci Canvas ile kart ızgarası
-
02 · Kök
Dashboard paneli
- frameloop
demand+ veri değişince invalidate- dpr
[1, 1.5]· dolgu maliyeti düşük- Risk
- Boşta always bırakmak
-
03 · Kök
Tam ekran deneyim
- Host
- Viewport kilidi · sabit min-height
- gl
- high-performance · alpha bilinçli
- Risk
- DPR 3 sınırsız · termal boğulma
Varsayılan kamera ve ışık: imza mı yük mü?
Canvas çoğu kurulumda bir kamera (ve isteğe bağlı ışık yardımcıları) ile ayağa kalkar. Holodepth: varsayılan kamerayı «geçici iskele» kabul edin; ürün kamerasını kökte veya sahne grafında bilinçli yazın. İki aktif kamera çakışması sessiz kırılmalara yol açar.
Işık: kökte «her şeyi aydınlatan» varsayılan ile sahne içi ışık hiyerarşisini karıştırmayın. PBR ve ışık teorisi Three/WebGL yapraklarındadır; burada yalnızca şunu mühürleriz: görünürlük politikası kökte mi, sahnede mi yazılacak? Cevabı ürün sözleşmesine tek satır olarak koyun.
Holodepth perspektifleri
Önce kapı, sonra kargo
Mesh optimize etmek, kötü mühürlü kökün üstüne parfümdür. Context, DPR, frameloop ve host önce gelir.
Bir Canvas varsayılan, ikinci istisna
İkinci kökü «kolay» diye açmayın; GPU kontenjanı üründür.
İki defteri ayırın
Layout px ile backing store px aynı cümlede konuşulmamalı; DPR tavanı ürün sabitidir.
Teşhis maddeleri
- Sayfada kaç canlı Canvas var? Her biri gerekçeli mi?
- Host'un min-height / aspect sözleşmesi yazılı mı?
dprtavanı var mı, yoksa device sınırsız mı?frameloopürün profiline uyuyor mu?gl/ colorSpace / tone mapping kökte mühürlü mü?- preserveDrawingBuffer bilinçli mi, yoksa tesadüf mü?
- Unmount'ta kök dışı dinleyiciler temizleniyor mu?
- React temeli veya glTF şeması bu sayfaya sızmış mı?
Holodepth içgörüsü
«Canvas koydum çalışmadı» çoğu zaman mesh hatası değil, kök sözleşmesi hatasıdır: sıfır yükseklik, çift context, yanlış frameloop veya mühürlenmemiş renk imzası. Kapıyı okuyun.
Sonraki kapı: deklaratif sahne grafı
Kök mühürlendikten sonra soru şudur: JSX çocukları Three nesnelerine nasıl
bağlanır, prop hangi constructor / hangi runtime alanına gider?
Sonraki sayfa
Deklaratif sahne grafı
bu haritayı anlatır. useFrame, yükleme ve picking sonraki
yapraklardadır.