当前位置: 首页 > news >正文

webgl(three.js 与 cesium 等实例应用)之浏览器渲染应用及内存释放的关联与应用

文章目录

  • WebGL 概念
    • 1. 纹理(Texture)
      • 📌 概念:
      • 🧩 应用方向:
      • 💡 示例代码(加载一张图片作为纹理):
    • 2. 缓冲区(Buffer)
      • 📌 概念:
      • 🧩 应用方向:
      • 💡 示例代码(创建一个顶点缓冲区):
    • 3. 着色器(Shader)
      • 📌 概念:
      • 🧩 应用方向:
      • 💡 示例代码(简单着色器程序):
        • 🧪 HTML:
        • 🧪 JavaScript:
    • 总结对比表:
    • 顶点着色与片元着色器延伸
    • ✅ 一、基本概念对比
    • ✅ 二、详细区别
      • 1. 🧠 顶点着色器(Vertex Shader)
        • 🔧 功能:
        • 📦 输入:
        • 🎯 输出:
        • 🧪 示例代码(顶点着色器):
      • 2. 🧠 片元着色器(Fragment Shader)
        • 🔧 功能:
        • 📦 输入:
        • 🎯 输出:
        • 🧪 示例代码(片元着色器):
    • ✅ 三、应用场景划分
    • ✅ 四、协作流程图解(简化版)
    • ✅ 五、性能优化建议
    • ✅ 六、总结表格对比
    • 浏览器dom移除,其three.js 与 cesium 相关内存并未释放
    • 🧠 一、核心原因分析
      • 1. **DOM 元素与 WebGL 渲染无关**
      • 2. **Three.js / Cesium 管理的是 GPU 资源**
      • 3. **JavaScript 垃圾回收不处理原生资源**
    • 📌 二、Three.js 场景下未释放的原因和解决办法
      • ✅ 原因:
      • ✅ 解决方案:
    • 📌 三、Cesium 场景下未释放的原因和解决办法
      • ✅ 原因:
      • ✅ 解决方案:
    • 🧪 四、验证内存是否释放的方法
      • 方法 1:Memory 面板查看对象保留情况
      • 方法 2:Performance 面板记录 GC 行为
    • 🔒 五、避免内存泄漏的最佳实践
    • ✅ 总结
    • webgl 与 浏览器 以及 内存 显存之间的联系
      • **1. 浏览器**
        • **主要职责**:
        • **内存管理**:
      • **2. WebGL**
        • **主要功能**:
        • **显存管理**:
      • **3. 内存(RAM)与显存(VRAM)**
        • **内存(RAM)**
        • **显存(VRAM)**
      • **4. 浏览器、WebGL、内存和显存的交互流程**
      • **5. 如何优化资源管理?**
      • **总结**

WebGL 概念

WebGL 是一种底层的图形 API,允许开发者通过 JavaScript 在浏览器中渲染 2D 和 3D 图形。它基于 OpenGL ES 2.0,提供了与 GPU 交互的能力。在 WebGL 中,纹理(Texture)缓冲区(Buffer)着色器(Shader) 是三个核心概念,它们分别负责不同的图形处理任务。


1. 纹理(Texture)

📌 概念:

纹理是图像数据的一种封装形式,可以被映射到几何体表面,用于增强视觉效果。WebGL 支持多种类型的纹理格式,包括 2D 纹理、立方体贴图等。

🧩 应用方向:

  • 给模型贴图(如地形、角色皮肤)
  • 实现光照和阴影(法线贴图、深度贴图)
  • 后期处理(屏幕空间效果)

💡 示例代码(加载一张图片作为纹理):

const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);// 创建一个空白图像作为占位符
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 255, 255]));const image = new Image();
image.src = 'texture.jpg';
image.onload = () => {gl.bindTexture(gl.TEXTURE_2D, texture);gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);// 设置纹理参数gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);// 触发重新绘制drawScene();
};

2. 缓冲区(Buffer)

📌 概念:

缓冲区用于存储 GPU 可以高效访问的数据,比如顶点坐标、颜色、纹理坐标等。常见的缓冲区类型有 ARRAY_BUFFER(顶点数据)和 ELEMENT_ARRAY_BUFFER(索引数据)。

🧩 应用方向:

  • 存储顶点位置、颜色、法线
  • 存储索引信息用于绘制三角形
  • 实现动态更新顶点数据(如粒子系统)

💡 示例代码(创建一个顶点缓冲区):

const vertices = new Float32Array([-0.5, -0.5,0.5, -0.5,0.0,  0.5
]);const vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);// 在顶点着色器中使用该缓冲区
const positionAttributeLocation = gl.getAttribLocation(program, "a_position");
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);

3. 着色器(Shader)

📌 概念:

着色器是运行在 GPU 上的小程序,分为两种主要类型:

  • 顶点着色器(Vertex Shader):处理每个顶点的位置、颜色等属性。
  • 片段着色器(Fragment Shader):决定最终像素的颜色。

🧩 应用方向:

  • 控制物体外观(颜色、材质)
  • 实现光照计算
  • 实现复杂的视觉效果(如模糊、边缘检测、粒子)

💡 示例代码(简单着色器程序):

🧪 HTML:
<canvas id="glCanvas" width="640" height="480"></canvas>
🧪 JavaScript:
const canvas = document.getElementById('glCanvas') as HTMLCanvasElement;
const gl = canvas.getContext('webgl');if (!gl) {alert("无法初始化 WebGL");
}// 顶点着色器源码
const vsSource = `
attribute vec2 a_position;
void main() {gl_Position = vec4(a_position, 0.0, 1.0);
}
`;// 片段着色器源码
const fsSource = `
precision mediump float;
uniform vec4 u_color;
void main() {gl_FragColor = u_color;
}
`;function createShader(gl: WebGLRenderingContext, type: number, source: string): WebGLShader {const shader = gl.createShader(type)!;gl.shaderSource(shader, source);gl.compileShader(shader);if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {alert('An error occurred compiling the shaders: ' + gl.getShaderInfoLog(shader));gl.deleteShader(shader);return null!;}return shader;
}const vertexShader = createShader(gl, gl.VERTEX_SHADER, vsSource);
const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fsSource);const program = gl.createProgram()!;
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {alert('Unable to initialize the shader program: ' + gl.getProgramInfoLog(program));
}gl.useProgram(program);// 使用缓冲区和着色器绘制一个三角形
const vertices = new Float32Array([-0.5, -0.5,0.5, -0.5,0.0,  0.5
]);const vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);const positionAttributeLocation = gl.getAttribLocation(program, "a_position");
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);const colorUniformLocation = gl.getUniformLocation(program, "u_color");
gl.uniform4f(colorUniformLocation, 1.0, 0.0, 0.0, 1.0); // 红色gl.drawArrays(gl.TRIANGLES, 0, 3);

总结对比表:

概念类型作用常见用途
纹理Texture存储图像数据,映射到几何体表面贴图、后期处理
缓冲区Buffer存储顶点、索引等结构化数据顶点数据、动态更新
着色器Vertex/Fragment Shader定义图形渲染逻辑光照、颜色控制、复杂视觉效果

如果你正在开发一个基于 WebGL 的应用(例如 Cesium、Three.js 或原生 WebGL),理解这三者的作用及其协作方式是非常关键的。合理管理这些资源可以显著提升性能并避免内存泄漏。

顶点着色与片元着色器延伸

顶点着色器(Vertex Shader)和片元着色器(Fragment Shader,也称像素着色器 Pixel Shader)是 WebGL(以及 OpenGL、DirectX 等图形 API)中可编程渲染管线的两个关键阶段。它们分别处理不同的任务,具有不同的输入输出结构和应用场景。


✅ 一、基本概念对比

特性顶点着色器(Vertex Shader)片元着色器(Fragment Shader)
执行频率每个顶点执行一次每个像素(片元)执行一次
输入数据顶点属性(如位置、颜色、法线等)插值后的顶点输出、纹理坐标、光照信息等
输出数据裁剪空间中的顶点位置 gl_Position 和其他插值变量最终颜色值 gl_FragColor
主要作用坐标变换、动画计算、顶点光照等颜色计算、纹理采样、光照模型、后期处理

✅ 二、详细区别

1. 🧠 顶点着色器(Vertex Shader)

🔧 功能:
  • 对每个顶点进行处理,通常用于:
    • 坐标变换:将顶点从模型空间变换到裁剪空间(通过 MVP 矩阵)
    • 顶点动画:骨骼动画、顶点位移(如水面波动)
    • 光照计算(逐顶点):简单的 Phong 或 Gouraud 着色
    • 传递数据给片元着色器:例如颜色、纹理坐标、法线等
📦 输入:
  • attribute:每个顶点独有的属性(如 a_position, a_normal
  • uniform:全局一致的参数(如视图矩阵、投影矩阵)
  • varying:用于向片元着色器传递插值后的数据
🎯 输出:
  • gl_Position:必须设置,表示顶点在裁剪空间的位置
  • 其他插值变量(如颜色、纹理坐标)将被光栅化插值后传入片元着色器
🧪 示例代码(顶点着色器):
attribute vec3 a_position;
attribute vec2 a_texCoord;uniform mat4 u_modelViewMatrix;
uniform mat4 u_projectionMatrix;varying vec2 v_texCoord;void main() {gl_Position = u_projectionMatrix * u_modelViewMatrix * vec4(a_position, 1.0);v_texCoord = a_texCoord;
}

2. 🧠 片元着色器(Fragment Shader)

🔧 功能:
  • 对每个“片元”(即潜在的像素)进行处理,通常用于:
    • 纹理采样:使用纹理坐标从纹理中获取颜色
    • 光照模型(逐像素):实现更真实的光照效果(如 Phong 分量光照)
    • 颜色混合:透明度、叠加、遮罩等效果
    • 后期处理:模糊、边缘检测、HDR 效果等
📦 输入:
  • varying:来自顶点着色器的插值变量(如纹理坐标、颜色)
  • uniform:常量参数(如光源位置、材质属性)
  • texture2D() 函数:用于访问纹理资源
🎯 输出:
  • gl_FragColor:最终的颜色值,写入帧缓冲区
🧪 示例代码(片元着色器):
precision mediump float;varying vec2 v_texCoord;
uniform sampler2D u_texture;void main() {gl_FragColor = texture2D(u_texture, v_texCoord);
}

✅ 三、应用场景划分

应用场景推荐阶段原因
坐标变换(MVP)顶点着色器每个顶点只需计算一次
动画(骨骼、变形)顶点着色器在顶点层面处理运动逻辑
简单光照(Gouraud)顶点着色器在顶点上计算光照,插值到像素
复杂光照(Phong)片元着色器在像素级别计算光照以获得更真实的效果
纹理映射片元着色器每个像素需要采样纹理
材质反射/折射片元着色器需要高精度颜色计算
后期处理(模糊、抗锯齿)片元着色器对每个像素进行图像处理
边缘检测、深度测试片元着色器操作最终像素颜色或深度值

✅ 四、协作流程图解(简化版)

顶点数据(CPU) → Vertex Shader(GPU) → 光栅化插值 → Fragment Shader(GPU) → 写入帧缓冲区

✅ 五、性能优化建议

类型建议
顶点着色器尽量减少计算复杂度,避免过多依赖动态分支
片元着色器控制分辨率、减少纹理采样次数、避免过深循环
共通建议
  • 使用 varying 时注意插值精度(低精度可用 lowp
  • 合理使用 discard(会破坏 GPU 的 early-z 优化)
  • 尽量复用已有的 uniform 数据,避免重复上传

✅ 六、总结表格对比

项目顶点着色器片元着色器
执行频率每顶点一次每像素一次
主要任务坐标变换、顶点动画、光照纹理采样、颜色计算、光照、特效
输入类型attribute、uniform、varyingvarying、uniform、texture
输出gl_Position + varyinggl_FragColor
性能敏感度中等高(影响帧率)
常见用途模型变换、骨骼动画、顶点颜色纹理贴图、光照模型、后处理

如果你正在开发基于 WebGL 的应用(如 Cesium、Three.js、PixiJS 或原生 WebGL),理解这两个着色器的作用与协作方式,有助于你写出高性能、视觉丰富的图形程序。

浏览器dom移除,其three.js 与 cesium 相关内存并未释放

“浏览器 DOM 被移除后,Three.js 或 Cesium 相关的内存仍未释放”,涉及到 JavaScript 内存管理机制WebGL 资源生命周期框架内部状态维护


🧠 一、核心原因分析

1. DOM 元素与 WebGL 渲染无关

  • <canvas> 是 WebGL 的渲染目标,但它的存在与否并不影响 WebGL 资源(如纹理、缓冲区、着色器)是否被释放。
  • 即使你从 DOM 中移除了 <canvas>,只要 JavaScript 仍持有对 WebGLRenderingContext 或相关对象(如 THREE.WebGLRendererCesium.Viewer)的引用,GPU 资源就不会被回收。

2. Three.js / Cesium 管理的是 GPU 资源

  • Three.js 和 Cesium 都是基于 WebGL 构建的高级图形库。
  • 它们创建的对象(如 [Mesh](file://f:\2025\project-files\algo_dispatch_hub\src\plugins\map\mapbox-gl.d.ts#L6259-L6279), [Texture](file://f:\2025\project-files\algo_dispatch_hub\src\plugins\map\mapbox-gl.d.ts#L10953-L10980), BufferGeometry, Entity, DataSource)会封装底层的 GPU 资源(显存),这些资源不会自动释放。
  • 这些资源由开发者负责手动销毁。

3. JavaScript 垃圾回收不处理原生资源

  • JavaScript 的垃圾回收器(GC)只管理堆内存中的对象(即 JS 对象),但它无法感知或释放 GPU 资源。
  • 如果你不手动调用销毁方法(如 dispose()destroy()),即使对象不再使用,它们所持有的 GPU 资源也不会被释放。

📌 二、Three.js 场景下未释放的原因和解决办法

✅ 原因:

  • 没有调用 renderer.dispose()
  • 没有手动清除场景中的对象(如 scene.remove(mesh)
  • 没有清理几何体、材质、纹理等资源(如 geometry.dispose(), material.dispose()

✅ 解决方案:

// 示例:正确销毁 Three.js 场景资源
function disposeScene() {// 清除所有 mesh、light、camerawhile (scene.children.length > 0) {const object = scene.children[0];if (object instanceof THREE.Mesh) {if (object.geometry) object.geometry.dispose();if (object.material) {if (Array.isArray(object.material)) {object.material.forEach(m => m.dispose());} else {object.material.dispose();}}}scene.remove(object);}// 销毁 rendererif (renderer && !renderer.isContextLost()) {renderer.dispose();renderer = null;}// 移除 canvas(如果需要)const canvas = document.getElementById('webgl-canvas');if (canvas && canvas.parentNode) {canvas.parentNode.removeChild(canvas);}
}

📌 三、Cesium 场景下未释放的原因和解决办法

✅ 原因:

  • 没有调用 viewer.destroy()scene.destroy()
  • 没有手动清除实体、数据源、影像图层等对象

✅ 解决方案:

if (viewer && !viewer.isDestroyed()) {viewer.entities.removeAll();       // 清除所有实体viewer.dataSources.removeAll();    // 清除所有数据源viewer.imageryLayers.removeAll();  // 清除所有影像图层viewer.scene.postRender.removeAllListeners(); // 清除监听器viewer.destroy(); // 销毁整个 viewer 实例
}

🧪 四、验证内存是否释放的方法

你可以使用 Chrome DevTools 来检查资源是否真正释放:

方法 1:Memory 面板查看对象保留情况

  • 打开 DevTools → Memory → 选择 “Allocation instrumentation on timeline”
  • 加载并卸载 Three.js / Cesium 场景,观察内存曲线变化
  • 查看是否有对象未被回收(如 WebGLTexture, WebGLBuffer

方法 2:Performance 面板记录 GC 行为

  • 使用 Performance 面板记录加载和卸载过程
  • 观察是否有大量未释放的 GPU 资源(如 Texture、Buffer)

🔒 五、避免内存泄漏的最佳实践

类别建议
资源管理所有创建的资源(纹理、几何体、材质)都要手动销毁
事件监听器添加的事件监听器必须在销毁时移除(如 removeEventListener
全局变量引用避免将 Three.js / Cesium 对象挂到 window 或全局变量中
组件生命周期(Vue/React)在组件卸载时执行销毁逻辑(如 Vue 的 beforeUnmount
循环引用避免对象之间互相引用导致 GC 无法回收

✅ 总结

问题原因解决方式
DOM 移除但内存未释放DOM 不等于 WebGL 资源显式调用 dispose()destroy()
Three.js/Cesium 内存未回收资源由 GPU 管理,JS 无法自动释放手动清理所有对象、纹理、材质、场景
浏览器 GC 无效GC 只管 JS 堆内存必须开发者自己管理 GPU 资源生命周期

如果你正在开发一个包含多个 3D 场景切换或动态加载卸载功能的应用(如地图平台、三维可视化系统),务必遵循上述资源管理规范,以确保良好的性能表现和用户体验。

webgl 与 浏览器 以及 内存 显存之间的联系

浏览器、WebGL 和内存(显存)之间存在紧密的关系,它们共同协作来渲染复杂的 3D 图形。以下是它们之间的关系以及如何相互作用的详细说明:


1. 浏览器

浏览器是运行 WebGL 应用程序的主要环境。它通过 JavaScript 引擎执行代码,并与底层硬件(如 GPU)进行交互。

主要职责
  • JavaScript 执行:浏览器负责解析和执行 JavaScript 代码,包括 WebGL 相关的逻辑。
  • DOM 管理:浏览器提供 <canvas> 元素作为 WebGL 渲染的目标容器。
  • 资源加载:浏览器负责从网络或本地文件系统加载模型、纹理等资源。
  • 安全性:浏览器通过同源策略(CORS)限制对某些资源的访问,以确保安全。
内存管理
  • 浏览器使用 JavaScript 堆内存来存储 JavaScript 对象、变量、函数等数据。
  • 这些对象可能包含指向 GPU 资源的引用(例如 WebGL 的 WebGLTextureWebGLBuffer)。
  • 如果不手动释放这些资源,即使 DOM 元素被移除,它们也可能导致内存泄漏。

2. WebGL

WebGL 是一种基于 OpenGL ES 2.0 的跨平台 API,允许在浏览器中直接使用 GPU 来渲染 2D 和 3D 图形。它通过 JavaScript 与浏览器通信,并最终调用底层的图形驱动程序(如 OpenGL、DirectX)。

主要功能
  • GPU 资源管理:WebGL 提供了创建和操作 GPU 资源的接口,例如:
    • 纹理(Textures):用于存储图像数据。
    • 缓冲区(Buffers):用于存储几何数据(顶点、索引等)。
    • 着色器(Shaders):用于定义图形渲染的算法。
  • 渲染管线控制:WebGL 允许开发者控制图形渲染管线的各个阶段,包括顶点处理、光栅化、片段处理等。
显存管理
  • WebGL 使用 GPU 显存来存储纹理、缓冲区等资源。
  • 这些资源由浏览器分配并通过 WebGL 接口暴露给开发者。
  • 开发者需要显式地销毁这些资源(例如通过 gl.deleteTexture()),否则即使 JavaScript 对象被垃圾回收,显存中的资源仍然不会被释放。

3. 内存(RAM)与显存(VRAM)

内存(RAM)
  • 用途:内存主要用于存储 JavaScript 对象、应用程序逻辑、临时数据等。
  • 与 WebGL 的关系:JavaScript 中的对象(如模型数据、纹理数据)会占用内存。这些数据通常会被上传到 GPU 显存中,但原始数据仍保留在内存中,直到手动清除。
  • 垃圾回收机制:JavaScript 的垃圾回收机制会自动清理不再使用的内存对象,但它无法直接管理 GPU 显存。
显存(VRAM)
  • 用途:显存是 GPU 专用的高速内存,用于存储纹理、缓冲区、着色器等图形资源。
  • 与 WebGL 的关系:WebGL 通过调用底层图形 API(如 OpenGL、DirectX)将数据上传到显存中。这些数据由 GPU 直接处理,渲染效率高。
  • 资源生命周期:显存中的资源需要显式销毁(例如通过 gl.deleteTexture() 或 Cesium 的 viewer.destroy()),否则即使 JavaScript 对象被销毁,显存中的资源也不会被释放。

4. 浏览器、WebGL、内存和显存的交互流程

  1. 资源加载

    • 浏览器从服务器或本地文件系统加载模型、纹理等资源。
    • 这些资源最初存储在内存中(RAM)。
  2. 资源上传到 GPU

    • WebGL 将内存中的资源(如纹理数据、顶点数据)上传到 GPU 显存中。
    • 浏览器通过 WebGL 接口与 GPU 驱动程序通信,完成数据传输。
  3. 渲染过程

    • GPU 使用显存中的资源执行渲染任务。
    • 浏览器通过 WebGL 控制渲染管线,将结果输出到 <canvas> 元素。
  4. 资源释放

    • 如果不再需要某些资源,开发者需要显式销毁它们(例如通过 gl.deleteTexture()viewer.destroy())。
    • 否则,即使 JavaScript 对象被垃圾回收,显存中的资源仍会保留,可能导致内存泄漏。

5. 如何优化资源管理?

  1. 及时销毁资源

    • 在不需要时,调用 gl.deleteTexture()gl.deleteBuffer() 等方法释放显存资源。
    • 对于复杂库(如 Cesium),调用 viewer.destroy() 来释放所有相关资源。
  2. 避免内存泄漏

    • 确保没有全局或不必要的引用指向已销毁的对象。
    • 移除事件监听器,避免循环引用。
  3. 分块加载和卸载

    • 对于大型场景,可以按需加载和卸载资源,减少内存和显存占用。
  4. 监控性能

    • 使用浏览器的开发者工具(如 Chrome DevTools 的 Performance 面板)监控内存和显存使用情况。
    • 检查是否存在内存泄漏或资源未正确释放的情况。

总结

  • 浏览器:负责执行 JavaScript 代码、管理 DOM 和内存,并通过 WebGL 与 GPU 通信。
  • WebGL:提供低层接口,允许开发者直接操作 GPU 资源(显存)。
  • 内存(RAM):存储 JavaScript 对象和临时数据,由浏览器垃圾回收机制管理。
  • 显存(VRAM):存储 GPU 处理的图形资源,需要开发者显式管理。

通过理解这四者之间的关系,开发者可以更好地优化资源管理,避免内存泄漏,并提高应用的性能。

相关文章:

  • go-carbon v2.6.8 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
  • 在 Flutter 项目中iOS 的 App 图标和 App 名称 的设置
  • Spring依赖注入的四种方式(面)
  • 集装箱残损识别系统如何检测残损?它的识别率能达到多少?
  • MySQL 索引学习笔记
  • OpenCV CUDA模块图像变形------对图像进行下采样操作函数pyrDown()
  • 基于Node.js的线上教学系统的设计与实现(源码+论文+调试+安装+售后)
  • Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型时序预测对比
  • LSTM助力迁移学习!深度学习架构性能提升,准确率达到99.91%!
  • 【无标题】六边形铺砖拓扑模型的深度解析:从几何结构到量子优势
  • 【机器学习】Teacher-Student框架
  • 使用freemarker模板 生成 word文档
  • 【论文阅读笔记】高光反射实时渲染新突破:3D Gaussian Splatting with Deferred Reflection 技术解析
  • Spring MVC 常用请求处理注解总结
  • 三轴云台之运动控制系统篇
  • uniapp——input 禁止输入 ,但是可以点击(禁用、可点击)
  • php列表头部增加批量操作按钮,多选订单数据批量微信退款(含微信支付SDK)
  • Kafka入门:解锁核心组件,开启消息队列之旅
  • 如何“下载安转Allure”?
  • UML和模式应用(软件分析设计与建模期末复习)
  • 怎么给网站做域名重定向/seo技术外包公司
  • 移动网络建设/seo引擎优化怎么做
  • 线上推广工作是做什么的/seo站长工具平台
  • 合山网站建设/如何建造自己的网站
  • 网站制作的核心技术/做网站公司
  • 湖南省金力电力建设有限公司 网站/设计网络营销方案