--- id: P-REINFORCE-AUTO-715F80 category: "10_Wiki/πŸ’‘ Topics/Graphics & Performance" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - OffscreenCanvas" --- # [[OffscreenCanvas|OffscreenCanvas]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > **OffscreenCanvas**λŠ” DOMκ³Ό λΆ„λ¦¬λœ λ°±κ·ΈλΌμš΄λ“œ μŠ€λ ˆλ“œ(μ›Ή μ›Œμ»€)μ—μ„œ κ·Έλž˜ν”½ λ Œλ”λ§μ„ μˆ˜ν–‰ν•  수 있게 ν•΄μ£ΌλŠ” μ›Ή API둜, 무거운 3D λ Œλ”λ§μ΄λ‚˜ μΊ”λ²„μŠ€ μ—°μ‚° 쀑에도 메인 μŠ€λ ˆλ“œμ˜ UI λ°˜μ‘μ„±μ„ μΎŒμ ν•˜κ²Œ μœ μ§€ν•  수 μžˆλ„λ‘ λ•λŠ” 핡심 μ΅œμ ν™” κΈ°μˆ μž…λ‹ˆλ‹€. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) **1. DOM μ˜μ‘΄μ„± 뢄리 및 Web Worker ν™œμš©** 기쑴의 μΊ”λ²„μŠ€ λ Œλ”λ§μ€ `` λ¬Έμ„œμ˜ `` μš”μ†Œ(DOM)와 μ§μ ‘μ μœΌλ‘œ κ²°ν•©λ˜μ–΄ μžˆμ–΄ 메인 μŠ€λ ˆλ“œμ—μ„œλ§Œ 싀행이 κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ OffscreenCanvasλŠ” 이름 κ·ΈλŒ€λ‘œ ν™”λ©΄ λ°–(Off-screen)μ—μ„œ λ™μž‘ν•˜μ—¬ DOM과의 동기화 과정을 μƒλž΅ν•©λ‹ˆλ‹€. 이 덕뢄에 DOM에 μ ‘κ·Όν•  수 μ—†λŠ” μ›Ή μ›Œμ»€(Web Worker) ν™˜κ²½μ—μ„œλ„ Canvas API와 WebGL을 μ‚¬μš©ν•˜μ—¬ λ°±κ·ΈλΌμš΄λ“œ λ Œλ”λ§μ΄ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€. **2. 메인 μŠ€λ ˆλ“œ 차단 λ°©μ§€ (Unblocking Main Thread)** λ³΅μž‘ν•œ Three.js μ”¬μ΄λ‚˜ 무거운 2D/3D 연산을 메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰ν•˜λ©΄ UIκ°€ λ©ˆμΆ”λŠ”(Freezing) ν˜„μƒμ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. `transferControlToOffscreen()` λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μΊ”λ²„μŠ€μ˜ μ œμ–΄κΆŒμ„ μ›Œμ»€ μŠ€λ ˆλ“œλ‘œ λ„˜κΈ°λ©΄(Offloading), 무거운 κ·Έλž˜ν”½ 연산이 메인 μŠ€λ ˆλ“œ(μ‚¬μš©μžμ˜ 슀크둀, 클릭 λ“± μƒν˜Έμž‘μš©)와 λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜μ–΄ μ‹œκ°μ μΈ 버벅거림(Jank) 없이 λΆ€λ“œλŸ¬μš΄ μ• λ‹ˆλ©”μ΄μ…˜μ„ 보μž₯ν•©λ‹ˆλ‹€. **3. 이벀트 ν¬μ›Œλ”©(Event Forwarding)κ³Ό 톡신 μ˜€λ²„ν—€λ“œ** μ›Ή μ›Œμ»€ λ‚΄λΆ€μ—λŠ” `window`λ‚˜ `document` 객체가 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μ‚¬μš©μžμ˜ 마우슀 클릭, ν„°μΉ˜ λ“±μ˜ 이벀트λ₯Ό 직접 μˆ˜μ‹ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ OffscreenCanvasλ₯Ό μΈν„°λž™ν‹°λΈŒν•˜κ²Œ μ‚¬μš©ν•˜λ €λ©΄ 메인 μŠ€λ ˆλ“œμ—μ„œ DOM 이벀트λ₯Ό μΊ‘μ²˜ν•œ λ’€, μ’Œν‘œ λ“±μ˜ 정보λ₯Ό `postMessage` APIλ₯Ό 톡해 μ›Œμ»€λ‘œ 전달(Forwarding)ν•˜λŠ” 좔가적인 λž˜ν•‘(Wrapping) μž‘μ—…μ΄ ν•„μš”ν•©λ‹ˆλ‹€. **4. μƒνƒœ 동기화 (State Synchronization)** DOM을 μ œμ–΄ν•˜λŠ” React 메인 μ•±κ³Ό WebGL을 λ Œλ”λ§ν•˜λŠ” μ›Œμ»€ μŠ€λ ˆλ“œλŠ” λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœλ₯Ό μ–‘μͺ½μ—μ„œ 읽고 써야 ν•  경우 μƒνƒœ 동기화가 ν•„μˆ˜μ μž…λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ `SharedArrayBuffer`λ₯Ό 톡해 λ©”λͺ¨λ¦¬λ₯Ό 직접 κ³΅μœ ν•˜κ±°λ‚˜, `Valtio`와 같은 ν”„λ‘μ‹œ 기반 μƒνƒœ 관리 도ꡬ와 `Broadcast Channel API`λ₯Ό κ²°ν•©ν•˜μ—¬ λ³€κ²½λœ 데이터(Delta)만 λ©”μ‹œμ§€λ‘œ μ£Όκ³ λ°›λŠ” ꡬ쑰λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€. **5. React μƒνƒœκ³„ 톡합 (React Three Fiber)** R3F μƒνƒœκ³„μ—μ„œλŠ” `@react-three/offscreen` νŒ¨ν‚€μ§€λ₯Ό 톡해 μ†μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 기쑴의 `` λŒ€μ‹  이 νŒ¨ν‚€μ§€μ˜ ``λ₯Ό μ‚¬μš©ν•˜λ©΄ 이벀트 ν¬μ›Œλ”©κ³Ό Three.js μΈν„°νŽ˜μ΄μŠ€ 패치 μž‘μ—…μ΄ μžλ™μœΌλ‘œ μ²˜λ¦¬λ˜μ–΄, κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ½”λ“œλ₯Ό μˆ˜μ •ν•  ν•„μš” 없이 μ›Œμ»€μ—μ„œ μ‹€ν–‰λ˜λ„λ‘ λ§Œλ“€μ–΄μ€λ‹ˆλ‹€. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Graphics & Performance λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[Web Worker (α„‹α…°α†Έ 워ᄏα…₯)|Web Worker (μ›Ή μ›Œμ»€)]], Multi-threaded Architecture (λ©€ν‹°μŠ€λ ˆλ“œ μ•„ν‚€ν…μ²˜), [[React Three Fiber (R3F)|React Three Fiber (R3F)]], Valtio (Proxy State 관리), [[SharedArrayBuffer|SharedArrayBuffer]] - **Projects/Contexts:** [[고ᄉα…₯α†Όα„‚α…³α†Ό ᄆα…₯ᆯ타스레드 React α„‹α…’α†Έ α„‹α…‘α„α…΅α„α…¦α†¨α„Žα…₯|κ³ μ„±λŠ₯ λ©€ν‹°μŠ€λ ˆλ“œ React μ•± μ•„ν‚€ν…μ²˜]], 무거운 λ Œλ”λ§ 연산을 λ™λ°˜ν•˜λŠ” WebGL 데이터 μ‹œκ°ν™” - **Contradictions/Notes:** OffscreenCanvas κΈ°λŠ₯은 κ³Όκ±° Safari λΈŒλΌμš°μ €μ—μ„œ μ˜€λž«λ™μ•ˆ μ™„λ²½νžˆ μ§€μ›λ˜μ§€ μ•Šμ•„ ν”„λ‘œμ νŠΈλ₯Ό 메인 μŠ€λ ˆλ“œμš©κ³Ό μ›Œμ»€μš© 두 갈래(Fork)둜 μœ μ§€λ³΄μˆ˜ν•΄μ•Ό ν•˜λŠ” 치λͺ…적인 단점이 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 2025λ…„ 9μ›”(Safari v26)λΆ€ν„° 지원이 ν™•λŒ€λ˜μ—ˆμœΌλ‚˜, μ™„λ²½ν•œ 크둜슀 λΈŒλΌμš°μ € ν˜Έν™˜μ„±μ„ μœ„ν•΄μ„œλŠ” API 지원 μ—¬λΆ€λ₯Ό κ°μ§€ν•˜μ—¬ μ›Œμ»€λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” ν™˜κ²½μ—μ„œλŠ” 메인 μŠ€λ ˆλ“œμ—μ„œ λ Œλ”λ§μ΄ 이루어지도둝 `fallback` μ»΄ν¬λ„ŒνŠΈλ₯Ό λ°˜λ“œμ‹œ μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€. --- _Last updated: 2026-04-15_ - Raw Source: 00_Raw/2026-04-20/OffscreenCanvas.md ---