欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何threejs利用indexeddb緩存加載glb模型

 更新時間:2024年04月26日 10:41:13   作者:K歌、之王  
這篇文章主要介紹了如何threejs利用indexeddb緩存加載glb模型問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

threejs利用indexeddb緩存加載glb模型

有個坑,時不時的下載文件會遇到206錯誤。

用axios的時候啊 responseType: 'blob’下載不一定會成功。

與文件的格式與編碼有關系。

后面我就換成fetch方式了,但fetch的blob()爭對所有文件下載也不是都成功,比如json文件得用json(),還有一些編碼為gbk格式的用Blob()也不一定回成功,用arraybuffer();

1、加載工具類 indexeddb.js

使用 IndexedDB

const DB_NAME = 'daxue1';
const DB_VERSION = 1; // Use a long long for this value (don't use a float)
const DB_STORE_NAME = 'model_glb';

export class DBUtil {

    async get(url, onProgress) {
        this.db = await this.initDataBase();
        let getRequest = this.db
            .transaction([DB_STORE_NAME], "readwrite").objectStore(DB_STORE_NAME).get(url);
        let that = this;
        return new Promise((resolve, reject) => {
            getRequest.onsuccess = function (event) {
                let modelFile = event.target.result;
                // 假如已經有緩存了 直接用緩存
                if (modelFile) {
                    if (onProgress) {
                        onProgress(100);
                    }
                    resolve(modelFile.blob)
                } else {
                    // 假如沒有緩存 請求新的模型存入
                    that.put(url, onProgress).then((blob) => {
                        resolve(blob)
                    }).catch(() => {
                        reject()
                    });
                }
            };
            getRequest.onerror = function (event) {
                console.log('error', event)
                reject()
            }
        })
    }

    async put(url, onProgress) {
        const response = await fetch(url);

        if (response.status !== 200) {
            throw new Error('Request failed');
        }

        const contentLength = response.headers.get('Content-Length');
        console.log(contentLength)
        const totalBytes = parseInt(contentLength, 10);
        let downloadedBytes = 0;

        const readableStream = response.body;

        const { readable, writable } = new TransformStream();

        const writer = writable.getWriter();

        const reader = readableStream.getReader();

        const pump = async () => {
            const { done, value } = await reader.read();

            if (done) {
                writer.close();
                return;
            }

            writer.write(value);

            downloadedBytes += value.length;

            if (onProgress) {
                const progress = (downloadedBytes / totalBytes) * 100;
                console.log(progress.toFixed(2))
                onProgress(progress.toFixed(2));
            }

            return pump();
        };

        await pump();

        let blob = null;
        try {
                    blob = await new Response(readable).arrayBuffer();
                } catch (e) {
                    console.log('請求arrayBuffer失敗,用blob方式')
                    blob = await new Response(readable).blob();
                }

        let obj = {
            ssn: url
        }
        obj.blob = new Blob([blob])
        const inputRequest = this.db
                    .transaction([DB_STORE_NAME], "readwrite")
                    .objectStore(DB_STORE_NAME)
                    .add(obj);

        return new Promise((resolve, reject) => {
            inputRequest.onsuccess = function() {
                console.log('glb數據添加成功');
                resolve(obj.blob);
            };
            inputRequest.onerror = function(evt) {
                console.log('glb數據添加失敗', evt);
                reject();
            };
        });
    }

    initDataBase() {
        if (!window.indexedDB) {
            console.log("Your browser doesn't support a stable version of IndexedDB.")
            return;
        }
        let request = indexedDB.open(DB_NAME, DB_VERSION);
        return new Promise((resolve, reject) => {
            request.onerror = function () {
                console.log("error: create db error");
                reject()
            };
            request.onupgradeneeded = function (evt) {
                evt.currentTarget.result.createObjectStore(
                    DB_STORE_NAME, {keyPath: 'ssn'});
            };
            request.onsuccess = function (evt) {
                console.log("onsuccess: create db success ");
                resolve(evt.target.result)
            };
        })
    }
}


2、加載模型

let url = URL.createObjectURL(new Blob([blob])) 

利用URL.createObjectURL把blob轉成load可加載的url

import * as THREE from 'three/build/three.module.js';
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
import {DBUtil} from "../util/DBUtil";

let model = new THREE.Group();

new DBUtil().get('/droc_model/changsharelease.glb',(progress) => {
    console.log(progress)
}).then((blob) => {
    console.log('getModel獲取成功', blob);
    let loader = new GLTFLoader();
    let url = URL.createObjectURL(new Blob([blob]));
    loader.load(url, function (gltf) {
        model.add(gltf.scene);
    }, function ( xhr ) {
        console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );
    })
})

export {
    model
}

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Javascript實現顏色rgb與16進制轉換的方法

    Javascript實現顏色rgb與16進制轉換的方法

    這篇文章主要介紹了Javascript實現顏色rgb與16進制轉換的方法,實例分析了顏色值轉換的常用技巧與使用方法,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • 原生js實現簡單貪吃蛇小游戲

    原生js實現簡單貪吃蛇小游戲

    這篇文章主要為大家詳細介紹了原生js實現貪吃蛇小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 微信小程序定位當前城市的方法

    微信小程序定位當前城市的方法

    這篇文章主要為大家詳細介紹了微信小程序定位當前城市的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 微信小程序接入微信支付實現過程詳解

    微信小程序接入微信支付實現過程詳解

    這篇文章主要介紹了微信小程序接入微信支付實現過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • ExtJs的Ext.Ajax.request實現waitMsg等待提示效果

    ExtJs的Ext.Ajax.request實現waitMsg等待提示效果

    這篇文章主要介紹了ExtJs的Ext.Ajax.request實現waitMsg等待提示效果,需要的朋友可以參考下
    2017-06-06
  • JavaScript實現京東秒殺效果

    JavaScript實現京東秒殺效果

    這篇文章主要為大家詳細介紹了JavaScript實現京東秒殺效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Bootstrap 網站實例之單頁營銷網站

    Bootstrap 網站實例之單頁營銷網站

    這篇文章主要介紹了Bootstrap 網站實例之單頁營銷網站的相關資料,本文給大家介紹的非常詳細具有一定的參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • javascript實現了照片拖拽點擊置頂的照片墻代碼

    javascript實現了照片拖拽點擊置頂的照片墻代碼

    這篇文章主要介紹了javascript實現了照片拖拽點擊置頂的照片墻代碼,效果非常不錯,這里推薦給大家,有需要的小伙伴可以參考下。
    2015-04-04
  • javascript用rem來做響應式開發(fā)

    javascript用rem來做響應式開發(fā)

    這篇文章主要介紹了javascript用rem來做響應式開發(fā),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 實用又漂亮的BootstrapValidator表單驗證插件

    實用又漂亮的BootstrapValidator表單驗證插件

    這篇文章主要為大家詳細介紹了好用又漂亮的BootstrapValidator表單驗證插件,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評論