数据库
首页 > 数据库> > 浏览器数据库IndexedDB和前端多线程webWorker在3D场景中的实战应用

浏览器数据库IndexedDB和前端多线程webWorker在3D场景中的实战应用

作者:互联网

背景

1.IndexedDB 就是浏览器提供的本地数据库,它可以被网页脚本创建和操作。

2.在3D场景中模型数据很大,有可能存在数十万级的数据存储,大量数据存储在内存中会很容易导致内存溢出,因此采用indexedDB存储大量数据,减少占用浏览器内存引发的页面卡顿或者页面崩溃等性能问题

3.现有的浏览器数据储存方案都不适合储存大量数据:Cookie 的大小不超过4KB;LocalStorage 在 2.5MB 到 10MB 之间;IndexedDB的储存量视磁盘大小而定,具体说明如下:

 

 

 

 

 

 4.3D点云的文件格式.pcd,threejs加载3d点云的需要使用PCDLoader加载器,在PCDLoader.js源码中加载pcd文件需要遍及数十万级的数据并计算position,points的信息,这个过程耗时较长,会导致js阻塞从而页面会出现较长时间的卡顿,采用web worker增加多线程把计算position,points的信息这一步放在worker中执行,减少页面卡顿时间

 

 

 

 

 

 

 

 前端代码

1.indexedDB数据库

第一步:创建数据库

 1 var indexedDB = window.indexedDB;
 2     if (!indexedDB) {
 3       console.log('你的浏览器不支持IndexedDB');
 4     } else {
 5       var request = indexedDB.open("pcdpointsDB", 1);
 6       console.log('数据库创建.....');
 7       let db = null;
 8       request.onupgradeneeded = event => {
 9         db = (event as any).target.result;
10         //建表 名为person,主键为id
11         let store = db.createObjectStore('pcdInfo', {
12           keyPath: 'index'
13         });
14         store.createIndex('position', 'position', {
15           unique: false
16         });
17         store.createIndex('pcdPoints', 'pcdPoints', {
18           unique: false
19         });
20         store.createIndex('index', 'index', {
21           unique: false
22         });
23         store.createIndex('mesh', 'mesh', {
24           unique: false
25         });
26       }
27       request.onsuccess = event => {
28         db = (event as any).target.result;
29         console.log('数据库创建成功')
30         db.transaction(['pcdInfo'], 'readwrite').objectStore('pcdInfo').add({
31           index: index,
32           position: position,
33           pcdPoints: pcdPoints,
34           mesh:mesh.toJSON()
35         })
36         console.log('数据库新增数据......')
37         db.close()//关闭数据库
38       }
39       request.onerror = function (event) {
40         console.log('打开数据库失败');
41       }
42     }

第二步:获取数据库中的数据

 

 1 getIndexedDB(index) {
 2     return new Promise((resolve, reject) => {
 3       let request = indexedDB.open('pcdpointsDB');
 4       request.onsuccess = event => {
 5         console.log('数据库获取----open成功');
 6         let db = (event as any).target.result;
 7         var transaction = db.transaction(['pcdInfo']);
 8         let objectStore = transaction.objectStore('pcdInfo');
 9         let res = objectStore.get(index);
10         res.onsuccess = function (event) {
11           if (res.result) {
12             console.log(`${'数据库获取成功' + (index + 1)}`);
13             resolve(res.result)
14           } else {
15             console.log(`${'数据库获取---未获得数据记录' + (index + 1)}`);
16             resolve(null)
17           }
18           db.close()//关闭数据库
19 
20 
21         };
22         res.onerror = function (err) {
23           reject(err)
24         }
25 
26       }
27       request.onerror = function (err) {
28         reject(err)
29       }
30     })
31   }
通过async/await获取具体值
1 async loadPcdData() {
2       let result: any = await this.getIndexedDB(this.fileIndex);
3       let { pcdPoints = [],mesh } = result;
4         let loader = new THREE.ObjectLoader();
5         let parseMesh = loader.parse(mesh,()=>{});
6   }

第三步:删除数据库中的数据

 1 let request = indexedDB.open('pcdpointsDB');
 2     request.onsuccess = event => {
 3       console.log('数据库删除----open成功');
 4       let db = (event as any).target.result;
 5       var transaction = db.transaction(['pcdInfo'], 'readwrite');
 6       let objectStore = transaction.objectStore('pcdInfo');
 7       let res = objectStore.delete(index);
 8       res.onsuccess = function (event) {
 9         console.log(`${'数据库删除成功' + (index + 1)}`);
10         db.close()//关闭数据库
11 };

 

2.web worker多线程

开发过程中的问题验证

  1.场景使用:worker.js有可能需要引入模块化的包,比如import或者require,目前导入模块包会导致脚本文件不执行,无法查看报错原因

  技术方案:采用worker-loader插件,webpack配置

npm I –D worker-loader

1 {
2   test: /\.testWorker\.js$/,
3   use: { loader: "worker-loader" },
4 },

入口文件配置

1    entry: {
2         worker: './src/utils/worker.js',
3     },

 

 

 

 2.3d点云中的mesh模型对象存储到indexedDB时,从indexedDB中获取到对象之后怎么反解析成Mesh对象

技术方案实现:

其他导致内存溢出的情况

标签:IndexedDB,indexedDB,console,数据库,worker,webWorker,let,多线程,event
来源: https://www.cnblogs.com/wsqspace/p/16613943.html