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 處理的圖形資源,需要開發者顯式管理。

通過理解這四者之間的關系,開發者可以更好地優化資源管理,避免內存泄漏,并提高應用的性能。

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

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

相關文章

黑馬點評【緩存】

目錄 一、為什么要使用緩存 二、添加商戶緩存 1.緩存的模型和思路 2.代碼 3.緩存更新策略 Redis內存淘汰機制&#xff1a; 3.1 被動淘汰策略&#xff08;不主動淘汰&#xff0c;僅在查詢時觸發&#xff09; 3.2 主動淘汰策略&#xff08;主動掃描內存&#xff0c;按規則…

【地圖服務限制范圍】

根據你提供的 eb_service_area 表結構&#xff0c;其中有兩個字段與地理坐標相關&#xff1a;latlng 和 limit_latlng。這兩個字段分別用于存儲服務范圍區域的坐標和限制區域的坐標。下面是對這兩個字段的具體分析以及如何使用它們來定義執行范圍。 字段分析 latlng&#xff0…

python數據結構和算法(1)

數據結構和算法簡介 數據結構&#xff1a;存儲和組織數據的方式&#xff0c;決定了數據的存儲方式和訪問方式。 算法&#xff1a;解決問題的思維、步驟和方法。 程序 數據結構 算法 算法 算法的獨立性 算法是獨立存在的一種解決問題的方法和思想&#xff0c;對于算法而言&a…

Linux操作系統-性能優化

1. 基礎工具 top / htop top # 實時查看CPU、內存、進程 htop # 增強版&#xff08;支持鼠標操作&#xff09; 關鍵指標&#xff1a;%CPU&#xff08;CPU占用&#xff09;、%MEM&#xff08;內存占用&#xff09;、LOAD AVERAGE&#xff08;系統負載&#…

如何徹底解決緩存擊穿、緩存穿透、緩存雪崩

一、緩存擊穿 成因&#xff1a;緩存擊穿通常發生在某個熱點數據失效或清空后&#xff0c;大量請求同時涌入后端數據庫&#xff0c;導致數據庫崩潰或宕機。 解決方案&#xff1a; 互斥鎖&#xff1a;在獲取數據時&#xff0c;使用分布式鎖&#xff08;如Redis的分布式鎖&…

JDK 8、JDK 17和JDK 19綜合對比分析

JDK 8、JDK 17和JDK 19在性能、特性、易用性及普及性等方面的綜合對比分析&#xff0c;結合了各版本的核心改進和實際應用場景 目錄 ? 一、性能對比 ? 二、語言與特性演進 &#x1f6e0;? 三、API與功能增強 &#x1f3af; 四、易用性改進 &#x1f4ca; 五、市場普及…

Vue-理解 vuex

一、前言 在開發中大型 Vue 應用時&#xff0c;我們常常會遇到多個組件之間共享數據、通信復雜的問題。例如&#xff1a; 多個組件需要訪問同一個用戶信息&#xff1b;組件之間需要傳遞狀態或事件&#xff1b;數據變更需要同步更新多個組件&#xff1b; 這時&#xff0c;Vue…

【209】VS2022 C++對排好序的vector使用二分查找算法的例子

本文介紹了如何對已經排序的 vector 進行二分法查找。 首先&#xff0c;我們先看一下存儲數據的類&#xff0c;我們假設所有數據的 id 是唯一的&#xff1a; DataItem.h #pragma once #include<string>namespace zc {class DataItem{public:int m_id;std::string m_na…

ABAP 上傳 excel 報表

&#xff08;1&#xff09;先在屏幕上增加上傳文件的按鈕 "屏幕選擇條件" SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. PARAMETERS : p_source LIKE rlgrap-filename . SELECTION-SCREEN END OF BLOCK b1. 你會發現&#xff0c;上面的代碼只…

Compose與View系統互操作方案

本文將全面解析 Android 現代 UI 框架 Jetpack Compose 與傳統 View 系統的互操作方案&#xff0c;涵蓋基礎原理、實戰技巧、性能優化和高級應用&#xff0c;助你實現漸進式遷移和混合開發。 一、互操作的必要性與整體架構 1.1 為什么需要互操作性 漸進式遷移&#xff1a;大型…

HNCTF 2025 Just Ping Write-up

part 1 路由部分主邏輯逆向 package mainimport ("net/http" )func main() {// 注冊路由和處理函數// 當訪問 "/api/ping" 路徑時&#xff0c;調用 pingHandler 函數處理請求http.HandleFunc("/api/ping", pingHandler)// 注冊開發測試API路由//…

OpenCV CUDA模塊中用于稠密光流計算的 TV-L1(Dual TV-L1)算法類cv::cuda::OpticalFlowDual_TVL1

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::OpticalFlowDual_TVL1類是基于變分優化方法的稠密光流算法實現&#xff08;Dual TV-L1 光流模型&#xff09;&#xff0c;在 GPU 上加…

ThreadPoolTaskExecutor+CompletableFuture實現多線程異步數據同步和自定義線程池監控和動態調整實現

前言 ThreadPoolTaskExecutor是Spring框架提供的一個線程池實現&#xff0c;它是對Java標準庫中ThreadPoolExecutor的封裝&#xff0c;提供了更便捷的配置和集成方式&#xff0c;特別適合在Spring環境中使用。相關線程池概念見線程&線程池相關 CompletableFuture 是 Java…

一篇文章理解js閉包和作用于原理

一、js閉包的作用原理 JS閉包是指內部函數訪問外部函數變量的機制&#xff0c;常用于數據封裝和模塊化。典型應用包括創建私有變量、解決循環中的異步問題、實現函數柯里化等。案例分析展示了閉包在計數器、防抖函數等場景的使用&#xff0c;同時揭示了可能的內存泄漏風險。正…

GUI絲滑教程-python tinker

在 Tkinter GUI 應用中&#xff0c;線程可以幫助你在后臺執行長時間運行的任務&#xff0c;而不阻塞界面響應。下面是一些技巧&#xff0c;幫助你在使用線程時避免 Tkinter 界面卡頓的問題。 為什么 Tkinter 界面會卡頓&#xff1f; Tkinter 使用 主線程 來處理 UI 更新&…

第一部分-數據通信網絡基礎

目錄 一、什么是網絡通信&#xff1f; 二、網絡通信設備的基本識別 1.雙絞線 2.集線器&#xff08;物理層設備&#xff09; 3.中繼器&#xff08;物理層設備&#xff09; 4.接入交換機 5.匯聚交換機 6.核心交換機 7.路由器 8.無線路由器 9.光貓 一、什么是網絡通信&#xff1f;…

windows電腦解決筆記本搜索不到wifi問題

windows筆記本電腦明明打開了wifi功能&#xff0c;卻搜索不到wifi&#xff0c;此問題可能是網絡適配器被禁用的原因導致&#xff0c;通過以下方法也許能解決&#xff0c;無需重啟電腦 1、右鍵點擊網絡或wifi圖標&#xff0c;打開界面”網絡和internet“ 2、選擇”高級網絡設置…

C# 界面檢測顯示器移除并在可用顯示器上顯示

C# 檢測顯示器被移除&#xff0c;將界面在當前可用的顯示器上顯示&#xff0c;避免程序在任務欄點擊無響應。 using System; using System.Linq; using System.Windows.Forms;public class MonitorWatcher : IDisposable {private readonly Form _targetForm;private Screen …

JAVA實戰開源項目:青年公寓服務平臺 (Vue+SpringBoot) 附源碼

本文項目編號 T 233 &#xff0c;文末自助獲取源碼 \color{red}{T233&#xff0c;文末自助獲取源碼} T233&#xff0c;文末自助獲取源碼 目錄 一、系統介紹二、數據庫設計三、配套教程3.1 啟動教程3.2 講解視頻3.3 二次開發教程 四、功能截圖五、文案資料5.1 選題背景5.2 國內…

阿里云服務狀態監控:實時掌握云服務健康狀況

前言 在云計算時代,企業和開發者越來越依賴云服務提供商的基礎設施和服務。當我們的應用部署在云上,服務的可用性和穩定性就與云服務提供商息息相關。一旦云服務出現故障或維護,可能會對我們的業務造成直接影響。因此,實時了解云服務的運行狀態變得尤為重要。阿里云作為國…