【React-Three-Fiber實踐】放棄Shader!用頂點顏色實現高性能3D可視化

在現代前端開發中,3D可視化已經成為提升用戶體驗的重要手段。然而,許多開發者在實現復雜視覺效果時,往往會首先想到使用Shader(著色器)。雖然Shader功能強大,但學習曲線陡峭,實現復雜度高。本文將介紹一種更簡單高效的替代方案——頂點顏色(Vertex Colors)技術,通過一個彩色二十面體的實現案例,展示如何在不使用Shader的情況下創建令人驚艷的3D效果。

?下圖里每個幾何體有頂點著色的幾何和顯示框線的結合重疊而形成的視覺效果,從左到右分別列舉了三個插值方案

  1. 方案1:基于Y軸高度的HSL全色相變化,從底部到頂部呈現彩虹色漸變(圖1)

  2. 方案2:固定紅色相,飽和度隨高度變化,從灰到純紅(圖3)

  3. 方案3:RGB漸變,從底部的黃色漸變到頂部的紅色(圖2)

本文參考了threejs官網給的下面例子

為什么選擇頂點顏色而非Shader?

Shader無疑是強大的工具,可以實現幾乎任何你能想象到的視覺效果。但對于許多常見的3D可視化需求來說,Shader可能有些"殺雞用牛刀":

  1. 學習成本高:GLSL語言和著色器管線對初學者不友好

  2. 調試困難:著色器錯誤往往難以定位和修復

  3. 性能考量:簡單的頂點顏色渲染通常比復雜著色器更高效

  4. 開發效率:使用Three.js內置材質可以快速迭代

在我們的案例中,使用頂點顏色技術完全能夠滿足需求,同時保持了代碼的簡潔性和可維護性。

實現彩色二十面體完整代碼

讓我們通過一個React Three Fiber實現的彩色二十面體組件,來具體看看頂點顏色技術的應用。

import { useRef } from 'react'
import { useFrame } from '@react-three/fiber'
import * as THREE from 'three'type IcosahedronProps = {position: [number, number, number]colorScheme: 1 | 2 | 3
}const Icosahedron = ({ position, colorScheme }: IcosahedronProps) => {const meshRef = useRef<THREE.Group>(null)const radius = 200useFrame(() => {if (meshRef.current) {meshRef.current.rotation.y += 0.005}})// 創建幾何體和顏色const geometry = new THREE.IcosahedronGeometry(radius, 1)const count = geometry.attributes.position.countgeometry.setAttribute('color',new THREE.BufferAttribute(new Float32Array(count * 3), 3),)const positions = geometry.attributes.position as THREE.BufferAttributeconst colors = geometry.attributes.color as THREE.BufferAttributeconst color = new THREE.Color()for (let i = 0; i < count; i++) {const y = positions.getY(i)switch (colorScheme) {case 1: // 基于Y軸高度的HSL顏色color.setHSL((y / radius + 1) / 2, 1.0, 0.5, THREE.SRGBColorSpace)breakcase 2: // 基于Y軸高度的HSL顏色,固定色相color.setHSL(0, (y / radius + 1) / 2, 0.5, THREE.SRGBColorSpace)breakcase 3: // 基于Y軸高度的RGB漸變color.setRGB(1, 0.8 - (y / radius + 1) / 2, 0, THREE.SRGBColorSpace)break}colors.setXYZ(i, color.r, color.g, color.b)}return (<group ref={meshRef} position={position}><mesh geometry={geometry}><meshPhongMaterialcolor={0xffffff}flatShadingvertexColorsshininess={0}/></mesh><mesh geometry={geometry}><meshBasicMaterialcolor={0x000000}wireframetransparentopacity={0.3}/></mesh></group>)
}export const ColorMap = () => {return (<><Icosahedron position={[-400, 0, 0]} colorScheme={1} /><Icosahedron position={[0, 0, 0]} colorScheme={3} /><Icosahedron position={[400, 0, 0]} colorScheme={2} /></>)
}

我們定義了一個Icosahedron組件,接受位置和顏色方案作為props。使用useRef來獲取對3D對象的引用,以便后續動畫控制。

Icosahedron是什么?

Icosahedron(發音:/?a?k?s??hi?dr?n/ 或 /?a?ko?s??hi?dr?n/)是一個幾何術語,源自希臘語:

  • eíkosi?(ε?κοσι) = "20"

  • hédra?(?δρα) = "面"或"基面"

正二十面體——一種由20個完全相同的正三角形面、30條邊和12個頂點組成的柏拉圖立體(Platonic solid)。每個頂點處有5個三角形面相交。對稱性:具有120°旋轉對稱性;結構:所有面、邊、角均全等;可視化:類似足球的經典結構(現代足球的拼合結構即源自截角二十面體)

幾何體創建與顏色設置代碼解析

核心部分在于如何為二十面體的每個頂點設置顏色:


const positions = geometry.attributes.position as THREE.BufferAttribute
const colors = geometry.attributes.color as THREE.BufferAttribute
const color = new THREE.Color()for (let i = 0; i < count; i++) {const y = positions.getY(i)switch (colorScheme) {case 1: // 基于Y軸高度的HSL顏色color.setHSL((y / radius + 1) / 2, 1.0, 0.5, THREE.SRGBColorSpace)breakcase 2: // 基于Y軸高度的HSL顏色,固定色相color.setHSL(0, (y / radius + 1) / 2, 0.5, THREE.SRGBColorSpace)breakcase 3: // 基于Y軸高度的RGB漸變color.setRGB(1, 0.8 - (y / radius + 1) / 2, 0, THREE.SRGBColorSpace)break}colors.setXYZ(i, color.r, color.g, color.b)
}

這段代碼做了以下幾件事:

  1. 通過new THREE.IcosahedronGeometry(radius, 1)創建一個二十面體幾何體

  2. 為幾何體添加顏色屬性

  3. 遍歷所有頂點,根據Y軸坐標和選定的顏色方案為每個頂點設置顏色

  4. 三種顏色方案分別展示了不同的著色策略

1. 基本結構

遍歷幾何體所有頂點的循環,對每個頂點:

  • 獲取頂點的Y坐標(positions.getY(i))

  • 根據colorScheme選擇不同的顏色計算方式

  • 將計算好的顏色值設置到頂點顏色屬性中(colors.setXYZ)

2. 核心變量

  • count: 幾何體的頂點總數

  • positions: 包含所有頂點位置數據的BufferAttribute

  • colors: 用于存儲頂點顏色數據的BufferAttribute

  • radius: 幾何體的半徑(用于標準化Y坐標)

  • color: THREE.Color對象,用于臨時存儲計算的顏色值

3. 顏色方案解析

方案1 (case 1): 基于Y軸高度的HSL顏色?
        color.setHSL((y / radius + 1) / 2, 1.0, 0.5, THREE.SRGBColorSpace)

?

color.setHSL((y / radius + 1) / 2, 1.0, 0.5, THREE.SRGBColorSpace)?能實現彩虹漸變效果,核心在于?HSL色彩模型的特性和Y坐標的映射關系。以下是逐層解析:


1.?HSL色彩模型基礎

HSL代表:

  • H (Hue):色相(0~1循環,紅→黃→綠→青→藍→紫→紅)

  • S (Saturation):飽和度(0=灰色,1=純色)

  • L (Lightness):亮度(0=黑,0.5=純色,1=白)

代碼中固定了:

  • 飽和度 S=1.0(最鮮艷)

  • 亮度 L=0.5(不偏白不偏黑)


2.?關鍵公式:(y / radius + 1) / 2

分步解析:

  1. y / radius

    • 將頂點Y坐標歸一化到?[-1, 1]?范圍(假設幾何體中心在原點)

    • 底部y ≈ -radius?→ 值接近?-1

    • 頂部y ≈ radius?→ 值接近?1

  2. + 1

    • 將范圍平移為?[0, 2]

    • 底部-1 + 1 = 0

    • 頂部1 + 1 = 2

  3. / 2

    • 最終映射到?[0, 1]?的標準HSL色相范圍

    • 底部0 / 2 = 0(紅色)

    • 中部1 / 2 = 0.5(青色)

    • 頂部2 / 2 = 1(循環回紅色)


3.?彩虹漸變的形成

通過Y坐標與色相H的線性映射:

  • 底部 (y=-radius)?→ H=0 →?紅色

  • 中部偏下 (y≈-0.5radius)?→ H≈0.25 →?黃色

  • 中部 (y=0)?→ H=0.5 →?青色

  • 中部偏上 (y≈0.5radius)?→ H≈0.75 →?藍色

  • 頂部 (y=radius)?→ H=1 →?紅色(循環)

由于色相H在HSL模型中是一個環形光譜(紅→黃→綠→青→藍→紫→紅),這種映射自然形成了連續的彩虹色漸變。


4.?為什么不是從紫色到紅色?

雖然H=1理論上會回到紅色,但在實際渲染中:

  • 頂部頂點通常不會恰好達到H=1(因浮點精度或幾何體細分程度)

  • 人眼對藍-紫色的變化更敏感,視覺上會感覺漸變完整

    方案2 (case 2):?基于Y軸高度的HSL顏色,固定色相

            color.setHSL(0, (y / radius + 1) / 2, 0.5, THREE.SRGBColorSpace)

    固定色相H=0(紅),僅調整飽和度 → 紅-灰漸變?

    ?方案3 (case 3): 基于Y軸高度的RGB漸變

            color.setRGB(1, 0.8 - (y / radius + 1) / 2, 0, THREE.SRGBColorSpace)
    

    ?

    color.setRGB(1, 0.8 - (y / radius + 1) / 2, 0, THREE.SRGBColorSpace)?能實現?從黃色到紅色的漸變,核心在于?RGB通道的數學關系和Y坐標的映射。以下是逐層解析:


    1.?RGB顏色模型基礎

    • R (Red):紅色分量(0~1)

    • G (Green):綠色分量(0~1)

    • B (Blue):藍色分量(0~1)

    組合效果:

    • (1, 1, 0)?= 黃色(紅+綠)

    • (1, 0, 0)?= 純紅色

    • (1, 0.5, 0)?= 橙紅色


    2.?關鍵公式解析:0.8 - (y / radius + 1) / 2

    分步計算綠色分量(G):

    1. y / radius

      • 將Y坐標歸一化到?[-1, 1](幾何體中心在原點時)

      • 底部y ≈ -radius?→ 值接近?-1

      • 頂部y ≈ radius?→ 值接近?1

    2. + 1

      • 平移范圍到?[0, 2]

      • 底部-1 + 1 = 0

      • 頂部1 + 1 = 2

    3. / 2

      • 壓縮到?[0, 1]

      • 底部0 / 2 = 0

      • 頂部2 / 2 = 1

    4. 0.8 - ...

      • 反轉并偏移計算結果

      • 底部0.8 - 0 = 0.8

      • 頂部0.8 - 1 = -0.2(實際會被限制為0)


    3.?顏色漸變過程

    Y坐標位置綠色分量 (G) 計算RGB值顏色表現
    底部?(y=-radius)0.8 - (0)/2 = 0.8(1, 0.8, 0)亮黃色
    中部偏下0.8 - (0.5)/2 = 0.55(1, 0.55, 0)橙黃色
    中部?(y=0)0.8 - (1)/2 = 0.3(1, 0.3, 0)橙紅色
    頂部?(y=radius)0.8 - (2)/2 = -0.2 → 0(1, 0, 0)純紅色

    4.?為什么是黃→紅?

    1. 底部黃色

      • R=1(最大紅) + G=0.8(高綠) + B=0 →?接近純黃

    2. 過渡階段

      • 綠色分量從0.8線性減少 → 顏色逐漸偏向紅色

    3. 頂部紅色

      • G被限制為0 → 僅剩R=1 →?純紅


    5.?設計巧思

    • 固定R=1:保持紅色主導,避免顏色跳躍

    • G的遞減公式:通過Y坐標控制綠色衰減速度

    • B=0:完全禁用藍色通道,確保暖色漸變

    • 0.8的偏移量:避免底部顏色過暗(若用1 - (y/radius+1)/2,底部G=1,頂部G=0,效果類似)


    對比其他方案

    • HSL方案:通過色相H變化實現彩虹漸變

    • 此RGB方案:通過固定R、衰減G,實現暖色系線性過渡,更適合需要單一色調漸變的場景(如溫度可視化、危險等級提示等)。

    這種設計以極簡的數學映射,實現了符合直覺的顏色過渡效果。

    4. 數學關系可視化

    對于Y坐標從-bottom到top的變化:

    方案底部顏色(y=-radius)頂部顏色(y=radius)漸變方向
    1色相=0(紅)色相=1(回到紅)彩虹色
    2飽和度=0(灰)飽和度=1(純紅)紅漸變
    3RGB(1,0.8,0)黃RGB(1,0,0)紅黃到紅

    5. 實際應用

    這種技術常用于:

    • 可視化高度數據

    • 創建彩色3D地形

    • 調試3D模型(查看頂點分布)

    • 藝術化渲染效果

    渲染與動畫

    return (<group ref={meshRef} position={position}><mesh geometry={geometry}><meshPhongMaterialcolor={0xffffff}flatShadingvertexColorsshininess={0}/></mesh><mesh geometry={geometry}><meshBasicMaterialcolor={0x000000}wireframetransparentopacity={0.3}/></mesh></group>
    )

    我們使用兩個網格疊加的方式實現最終效果:

    • 第一個使用meshPhongMaterial并啟用vertexColors,顯示彩色表面

    • 第二個使用meshBasicMaterial的線框模式,添加輪廓增強立體感

    無邊框的效果

    有邊框的效果

    動畫通過useFrame鉤子實現簡單旋轉:

    useFrame(() => {if (meshRef.current) {meshRef.current.rotation.y += 0.005}
    })

    改變顏色插值取值

    上面我們使用了模型的坐標Y值進行了從下到上的顏色插值。本質上是根據頂點的某個信息的值在一個區間內映射得到的值進行顏色插值。

    根據坐標的X值在[-radius,radius]進行插值

    for (let i = 0; i < count; i++) {const y = positions.getX(i)switch (colorScheme) {case 1: // 基于Y軸高度的HSL顏色color.setHSL((y / radius + 1) / 2, 1.0, 0.5, THREE.SRGBColorSpace)breakcase 2: // 基于Y軸高度的HSL顏色,固定色相color.setHSL(0, (y / radius + 1) / 2, 0.5, THREE.SRGBColorSpace)breakcase 3: // 基于Y軸高度的RGB漸變color.setRGB(1, 0.8 - (y / radius + 1) / 2, 0, THREE.SRGBColorSpace)break}colors.setXYZ(i, color.r, color.g, color.b)}

    根據坐標的z值進行插值

      for (let i = 0; i < count; i++) {const y = positions.getZ(i)switch (colorScheme) {case 1: // 基于Y軸高度的HSL顏色color.setHSL((y / radius + 1) / 2, 1.0, 0.5, THREE.SRGBColorSpace)breakcase 2: // 基于Y軸高度的HSL顏色,固定色相color.setHSL(0, (y / radius + 1) / 2, 0.5, THREE.SRGBColorSpace)breakcase 3: // 基于Y軸高度的RGB漸變color.setRGB(1, 0.8 - (y / radius + 1) / 2, 0, THREE.SRGBColorSpace)break}colors.setXYZ(i, color.r, color.g, color.b)}

    由于threejs是默認z軸是從里到外的,可以看到屏幕最近的顏色是顏色插值的最大值?

    如何確定某個頂點的顏色?

    ?首先確定要映射的顏色區間。然后要考慮用頂點的什么屬性值參與映射,比如像CAE仿真中后處理結果中模擬溫度的顏色,就取頂點對應的溫度值在溫度的上下限中的[0,1]標準化區間的值,在結合上面所的比如彩虹映射得到該頂點的顏色值

    性能優勢

    頂點顏色技術的主要性能優勢在于:

    1. 減少繪制調用:所有顏色信息已經包含在頂點數據中,無需額外紋理或uniform

    2. GPU友好:顏色計算在初始化時完成,渲染時直接使用預計算數據

    3. 內存高效:相比紋理貼圖,頂點顏色占用內存更少

    對于需要渲染大量相似對象的場景(如科學可視化、地圖標記等),這種技術可以顯著提升性能。

    適用場景

    頂點顏色技術特別適合以下場景:

    • 數據可視化(熱力圖、高度圖等)

    • 簡單的顏色漸變效果

    • 需要高性能的移動端3D應用

    • 快速原型開發,避免復雜著色器編寫

    總結

    通過這個彩色二十面體的實現,我們展示了頂點顏色技術在3D可視化中的強大能力。相比Shader方案,這種方法:

    • 更易于理解和實現

    • 調試和維護更簡單

    • 性能表現優異

    • 足夠滿足許多常見可視化需求

    當你的項目不需要Shader提供的極端靈活性時,考慮使用頂點顏色技術可能會帶來更好的開發體驗和性能表現。Three.js和React Three Fiber提供的豐富API使得這種實現方式既簡單又強大,是前端開發者進入3D可視化世界的理想起點。

    下次當你面臨3D可視化需求時,不妨先問問自己:我真的需要Shader嗎?也許頂點顏色就能完美解決問題!

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/news/915713.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/news/915713.shtml
    英文地址,請注明出處:http://en.pswp.cn/news/915713.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    MSTP技術

    一、STP/RSTP 的局限性STP&#xff08;生成樹協議&#xff09;和 RSTP&#xff08;快速生成樹協議&#xff09;存在一些明顯的局限&#xff0c;主要包括&#xff1a;所有 VLAN 共享一顆生成樹&#xff0c;這導致無法實現不同 VLAN 在多條 Trunk 鏈路上的負載分擔。例如&#xf…

    [IMX][UBoot] 16.Linux 內核移植

    目錄 1.修改 Makefile 2.新增配置文件 3.新增設備樹文件 4.新建編譯腳本 5.修改 CPU 頻率 6.EMMC 適配 7.網絡驅動適配 1.修改 Makefile 修改頂層 Makefile 中的架構信息 ARCH 和交叉編譯器 CROSS_COMPILE&#xff0c;修改后不需要在執行 make 時手動指定這兩個變量的值…

    數據庫 × 緩存雙寫策略深度剖析:一致性如何保障?

    前言 緩存&#xff0c;幾乎是現在互聯網項目中最常見的一種加速工具了。 通過緩存&#xff0c;我們能大幅提升接口響應速度&#xff0c;減少數據庫的訪問壓力&#xff0c;還能支撐各種復雜的業務功能&#xff0c;比如排行榜、風控系統、黑名單校驗等等。 不管你用的是本地緩存…

    主流Java Redis客戶端深度對比:Jedis、Lettuce與Redisson性能特性全解析

    &#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 持續學習&#xff0c;不斷…

    AI問答系統完整架構規劃文檔

    ?? 目錄 現有代碼架構分析 AI核心組件缺口分析 完整技術架構設計 開發路線圖 技術實現要點 ??? 現有代碼架構分析 當前項目結構 ai問答/ ├── main.py # FastAPI服務入口,API路由 ├── model.py # 基礎LLM模型加載與推理 ├── rag.py …

    圓柱電池自動分選機:全流程自動化檢測的革新之路

    在新能源產業快速發展的背景下&#xff0c;圓柱電池作為動力電池和儲能領域的核心組件&#xff0c;其生產效率與質量把控至關重要。圓柱電池自動分選機的出現&#xff0c;通過全流程自動化檢測技術&#xff0c;為電池制造與分選環節提供了高效、精準的解決方案。傳統電池分選依…

    leetcode 1695. 刪除子數組的最大得分 中等

    給你一個正整數數組 nums &#xff0c;請你從中刪除一個含有 若干不同元素 的子數組。刪除子數組的 得分 就是子數組各元素之 和 。返回 只刪除一個 子數組可獲得的 最大得分 。如果數組 b 是數組 a 的一個連續子序列&#xff0c;即如果它等于 a[l],a[l1],...,a[r] &#xff0c…

    netty的編解碼器,以及內置的編解碼器

    一、編碼器和解碼器 1、什么是編碼和解碼 解碼常用于入站操作&#xff0c;將字節轉換為消息。編碼用于出站&#xff0c;將消息轉換為字節流 2、解碼器ByteToMessageDecoder和ReplayingDecoder&#xff0c;ReplayingDecoder擴展了ByteToMessageDecoder類&#xff0c;使得我們不必…

    一個基于現代C++智能指針的優雅內存管理解決方案

    目錄 問題陳述 (Problem Statement) 1.1 問題背景與動機1.2 問題復雜性分析1.3 傳統解決方案的局限性1.4 目標需求定義 預備知識 (Preliminaries) 2.1 C智能指針基礎2.2 循環引用問題詳解2.3 自定義刪除器2.4 引用計數機制深入理解 核心解決方案 (Core Solution) 3.1 設計思路…

    LabVIEW單片機溫控

    基于 LabVIEW 與單片機設計溫度控制系統&#xff0c;整合硬件電路、串口通信、控制算法及監控功能&#xff0c;適用于教學實驗及中小型設備溫控場景。系統以低成本實現高精度溫控&#xff0c;為同類控制系統設計提供參考。應用場景教學場景&#xff1a;作為自動化專業綜合實驗項…

    【初識數據結構】CS61B中的最小生成樹問題

    本教程總結CS61B 關于圖章節中的最小生成樹&#xff08;Minimum Spanning Trees, MST&#xff09;問題&#xff0c;以及對應的的算法什么是最小生成樹&#xff08;MST&#xff09; 考慮這樣一個問題&#xff0c;給你一個無向圖&#xff0c;你能不能找出這個圖中的一組邊&#x…

    vue apk返回鍵不好使

    在 Android 設備上&#xff0c;你可以通過監聽物理返回鍵來實現特定的邏輯。這可以通過在 Vue 組件中添加一個事件監聽器來實現&#xff1a;mounted() {this.$once(hook:beforeDestroy, () > {if (document.removeEventListener) {document.removeEventListener(backbutton,…

    Ubuntu 22.04 安裝 MySQL 8.0 完整步驟文檔

    1、安裝 1.1、下載 cd /usr/local/在 /usr/local/ 下執行&#xff0c;下載資源包&#xff0c;可以本地下載上傳 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz1.2、解壓安裝 tar -Jxvf mysql-8.0.32-linux-glibc2.…

    Docker,其他機器下載鏡像并copy到目標機器導入docker鏡像

    Docker&#xff0c;其他機器下載鏡像并copy到目標機器導入docker鏡像源機器 【下載鏡像】目標機器slave1 【無法下載鏡像】步驟 1&#xff1a;在網絡正常的機器&#xff08;cg&#xff09;上下載鏡像&#xff0c;導出鏡像到指定路徑# 1. 下載鏡像docker pull ubuntu:20.04# 2.…

    基于現代R語言【Tidyverse、Tidymodel】的機器學習方法與案例分析

    機器學習已經成為繼理論、實驗和數值計算之后的科研“第四范式”&#xff0c;是發現新規律&#xff0c;總結和分析實驗結果的利器。機器學習涉及的理論和方法繁多&#xff0c;編程相當復雜&#xff0c;一直是阻礙機器學習大范圍應用的主要困難之一&#xff0c;由此誕生了Python…

    如何將 git 遠程 URL 從 https 更改為 ssh

    在項目開發中&#xff0c;使用 SSH 連接 Git 倉庫可以提高安全性和便利性。本文將指導你如何將 Git 遠程 URL 從 HTTPS 更改為 SSH。操作指南步驟 1: 查看當前遠程 URL首先&#xff0c;確認當前的遠程 URL 使用的是 https。打開終端并輸入以下命令&#xff1a;git remote -v如&…

    PyCharm 高效入門指南(核心模塊詳解二)

    四、生產力工具集成PyCharm 不僅僅是 Python 編輯器&#xff0c;更是集成了多種開發工具的綜合平臺。通過內置的生產力工具&#xff0c;開發者可以在一個界面內完成數據庫操作、科學計算、遠程開發和測試等全流程工作&#xff0c;避免工具切換帶來的效率損耗。4.1 數據庫工具鏈…

    WebkitSpeechRecognition 語音識別

    JavaScript WebkitSpeechRecognition:使用語音識別技術增強 Web 應用程序 WebkitSpeechRecognition 是一種 JavaScript API,它可以讓您的 Web 應用程序使用語音識別技術。使用 WebkitSpeechRecognition,您可以讓用戶通過說話來與您的 Web 應用程序進行交互,這可以使您的應…

    CUDA C++核心庫(CCCL)

    文章目錄CUDA C核心庫&#xff08;CCCL&#xff09;核心庫介紹CUDA C 開發工具的層級范圍各層級工具的具體內容Thrust自動內存管理類型安全自定義分配器&#xff08;頁鎖定內存&#xff09;高級API替代底層操作thrust::transform基本使用幾種執行策略iteratorload_cs高效索引md…

    MySQL InnoDB存儲引擎深度解析:從原理到優化

    InnoDB的優勢InnoDB之所以成為眾多應用的首選&#xff0c;主要得益于以下幾個顯著優勢&#xff1a;事務支持&#xff1a;InnoDB是MySQL中唯一支持ACID&#xff08;原子性、一致性、隔離性、持久性&#xff09;事務的存儲引擎。它通過日志和鎖機制確保事務的完整性&#xff0c;這…