uniapp中使用web-worker性能優化的分享

為什么要使用 web-workers

原因很簡單,將復雜的計算邏輯和耗時邏輯放到線程中運行,避免ui阻塞,防止卡頓問題

場景:本次運用于GPS 位置更新

接入小程序

注意事項:微信小程序中只允許存在一個 worker所以,需要再一個worker里面完成多個任務,或者在開心的woker時,需要關閉當前的worker

一,在static/workers 下放你需要的worker.js文件

gps-workers.js

//用于接收外部消息
worker.onMessage(function (res) {console.log('worker內部線程')console.log(res)//用于發送// worker.postMessage({//   message: '收到worker的消息'// });const { type, data } = res;let result;switch (type) {case 'PROCESS_GPS_DATA': {result = processGpsData(res.data);break;}case 'PROCESS_POSITION': {result = filterPlayerPositions(data);break;}}worker.postMessage({data: result,type,});
});
// 處理GPS數據
function processGpsData(data) {// 業務代碼return data
}
// 篩選用戶
function filterPlayerPositions(data) {// 業務代碼return data
}

二,在pages.json中配置workers目錄

三,在頁面引入使用

// 注冊
// #ifdef MP
let worker: UniApp.Worker | null = null
try {worker = uni.createWorker('static/workers/gps-workers.js', {useExperimentalWorker: true,})worker.onMessage((res) => {const { type, data } = resconsole.log('Worker 收到消息:', data)switch (type) {case WebWorkerTypeEnum.PROCESS_GPS_DATA:// 業務代碼breakcase WebWorkerTypeEnum.PROCESS_POSITION:// 業務代碼break}})
} catch (e) {console.error('創建 Worker 失敗:', e)
}
// #endif// 發現消息給web-worker處理worker?.postMessage({data: {positions: cloneDeep(positionBsResult.list),players: cloneDeep(players.value),},type: WebWorkerTypeEnum.PROCESS_GPS_DATA,})
// 釋放
onUnload(() => {worker?.terminate()
})

優化后的對標

接入web

在未更改前,由于數據量大,信息更新除了接口請求,耗時在7s+,ui會卡頓,特別是第一次加載數據以及位置更新的時候,后面優化后基本達到毫秒級別

一,在適合的目錄創建

gps-worker.ts

// 處理 GPS 數據的邏輯
function processGpsData(data) {// 業務代碼。。。return data
}// 添加新的 worker 處理函數
function filterPlayerPositions(data: xxx) {// 業務代碼。。。return data
}// 修改消息監聽方式
globalThis.addEventListener('message', (e) => {const { type, data } = e.data;let result: any;switch (type) {case WebWorkerTypeEnum.PROCESS_GPS_DATA: {result = processGpsData(data);break;}case WebWorkerTypeEnum.PROCESS_POSITION: {result = filterPlayerPositions(data);break;}}globalThis.postMessage({data: result,type,});
});
// export default {} as typeof Worker & { new (): Worker };
export default null;

二,在需要的位置加載和使用

// 加載web workerworker.value = new Worker(new URL('../data/gps-worker.ts', import.meta.url), {type: 'module',});worker.value.addEventListener('message', (e) => {const { type, data } = e.data;if (type === WebWorkerTypeEnum.PROCESS_GPS_DATA) {// 處理 worker 返回的數據}});

總結

  • 合理利用web-worker處理復雜的數據,特別是數據兩比較大的更新

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

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

相關文章

5118 API智能處理采集數據教程

簡數采集器支持調用5118 API接口處理采集的數據標題和內容、關鍵詞、描述等,還可配合簡數采集的SEO功能優化文章數據,對提高收錄有積極的作用。 簡數采集器支持5118接口:5118智能核心詞提取API 和 5118智能摘要提取API 。 接入使用教程 1. …

【深度學習:進階篇】--4.2.詞嵌入和NLP

在RNN中詞使用one_hot表示的問題 假設有10000個詞 每個詞的向量長度都為10000,整體大小太大 沒能表示出詞與詞之間的關系 例如Apple與Orange會更近一些,Man與Woman會近一些,取任意兩個向量計算內積都為0 目錄 1.詞嵌入 1.1.特點 1.3.wor…

WebRTC 的 ICE candidate 協商

文章目錄 前言WebRTC 的 ICE candidate 協商1. 什么是 ICE candidate?2. ICE 協商的流程3.前端使用 ICE candidate 協商代碼示例1)收集 candidate 并發送2)WebSocket 接收 candidate 并添加 4. ICE candidate 的類型5. ICE 協商常見問題6. 關…

卡爾曼濾波介紹

卡爾曼濾波介紹📖 **卡爾曼濾波原理簡介**🔑 **核心思想**📦 **卡爾曼濾波的組成**🔍 **代碼分析(kalman_filter.py)**🏗? 1. 狀態空間定義🔄 2. 初始化模型矩陣🚀 3. 核…

遞歸與循環

文章目錄遞歸TestRecursiveListRemoveNodeTestRecursiveListRemoveNode2循環TestWhileLoopListRemoveNodeTestWhileLoopListRemoveNode2遞歸 關鍵理解這幾點: 1、求解基本問題 2、將原問題拆分為小問題,直至基本問題(難點) 3、借…

3D魔方游戲

# 3D魔方游戲 這是一個基于Three.js的3D魔方游戲,支持2到6階魔方的模擬操作。 ## 功能特點 - 支持2到6階魔方 - 真實的3D渲染效果 - 鼠標操作控制 - 隨機打亂功能 - 提示功能 - 重置功能 ### 安裝依賴 bash npm install ### 啟動游戲 bash npm start 然…

下載安裝 com0com

下載 在 sourceforge 網站下載安裝器:下載鏈接 安裝完成后可以在設備管理器中看到默認創建的一對虛擬串口 使用串口調試助手收發 使用串口調試助手分別打開。如下圖所示,在端口選擇的下拉列表中可以看到剛才在設備管理器中看到的 COM3 和 COM5 分…

C++ 應用軟件開發從入門到實戰詳解

目錄 1、引言 2、IDE 開發環境介紹 2.1、Visual Studio 2.2、Qt Creator 3、 C語言特性 3.1、熟悉泛型編程 3.2、了解C/C異常處理 3.3、熟練使用STL容器 3.4、熟悉C11新特性 4、Windows 平臺的編程技術與調試技能 4.1、需要掌握的若干編程技術和基礎知識 4.2、需…

Python爬蟲實戰:研究slug相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網技術的快速發展,網絡上的信息量呈爆炸式增長。如何從海量的非結構化數據中提取有價值的信息,成為當前數據科學領域的重要研究方向。網絡爬蟲作為一種自動化數據采集工具,可以高效地獲取網頁內容,為數據分析提供豐富的數據來源。 Sl…

人工智能-基礎篇-18-什么是RAG(檢索增強生成:知識庫+向量化技術+大語言模型LLM整合的技術框架)

RAG(Retrieval-Augmented Generation,檢索增強生成)是一種結合外部知識檢索與大語言模型(LLM)生成能力的技術框架,旨在提升生成式AI在問答、內容創作等任務中的準確性、實時性和領域適應性。 1、核心概念 …

CppCon 2018 學習:What do you mean “thread-safe“

什么是“線程安全”? “線程安全”指的是一個函數、方法或代碼塊能夠在多個線程同時執行時,不會出現意外的交互或破壞共享數據,能夠安全地運行。 POSIX 對線程安全的定義很清楚: “一個線程安全的函數可以在多個線程中被安全地并…

熱方程初邊值問題解法

已知公式: u ( x , t ) ∫ ? ∞ ∞ G ( x , y , t ) g ( y ) d y . u(x,t)\int_{-\infty}^{\infty}G(x,y,t)g(y)dy. u(x,t)∫?∞∞?G(x,y,t)g(y)dy. (1) 其中 G ( x , y , t ) 1 2 k π t e ? ( x ? y ) 2 4 k t G(x,y,t)\frac{1}{2…

怎樣理解:source ~/.bash_profile

場景復現 $ source ~/.bash_profileAnalysis 分析 一句話概括 source ~/.bash_profile “在 當前 終端會話里,立刻執行并加載 ~/.bash_profile 中的所有命令,讓其中定義的環境變量、函數、alias 等即時生效,而無需重新登錄或開新 Shell。…

搜索問答技術概述:基于知識圖譜與MRC的創新應用

目錄 一、問答系統應用分析 二、搜索問答技術與系統 (一)需求和信息分析 問答需求類型 多樣的數據源 文本組織形態 (二)主要問答技術介紹 發展和成熟度分析 重點問答技術基礎:KBQA和DeepQA KBQA(…

TCP數據的發送和接收

本篇文章結合實驗對 TCP 數據傳輸中的重傳機制、滑動窗口以及擁塞控制做簡要的分析學習。 重傳 實驗環境 這里使用兩臺騰訊云服務器:vm-1(172.19.0.3)和vm-2(172.19.0.6)。 超時重傳 首先 vm-1 作為服務端啟動 nc…

python 保存二維數組到本地

Python中保存二維數組有多種方法,以下是常用的幾種方式:1. 使用NumPy(推薦)import numpy as np# 創建二維數組 arr np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 保存為.npy文件(NumPy專用格式) np.save…

LIN總線通訊中從節點波特率同步原理

波特率同步原理:從節點如何通過0x55校準時鐘? 一、同步場的核心作用:統一“時間標尺” 在LIN總線中,主節點與從節點各自擁有獨立的時鐘源(如MCU內部RC振蕩器),但由于制造工藝差異,…

【Unity筆記02】訂閱事件-自動開門

流程 當玩家移動到觸發區域的時候,門自動打開 事件系統 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;public class EventSystem : MonoBehaviour {public static EventSystem Instance { get; private set; }…

控制臺字符動畫

旋轉的立方體 #include <cstdint> #include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <cstdlib> #include <ctime> #include <thread> using namespace std;float angleX .0f; float a…

基于 PyTorch 的貓狗圖像分類實戰

基于 PyTorch 的貓狗圖像分類實戰 項目背景簡介 深度學習框架 PyTorch 因其動態計算圖和靈活易用性&#xff0c;被廣泛應用于圖像分類等計算機視覺任務。在入門計算機視覺領域時&#xff0c;常常以手寫數字識別&#xff08;MNIST&#xff09;作為 “Hello World”&#xff0c…