作為一個3D的項目,從用戶打開頁面到最終模型的渲染需要經過多個流程,加載的" />

AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

基于 Three.js 的 3D 模型加載優化

來源: 責編: 時間:2024-07-19 08:01:57 198觀看
導讀一、前言近段時間,我們使用three.js完成了vivo擬我形象的開發工作,大家可以在vivo賬號中擬制屬于自己的3D形象,也可以保存作為自己的頭像名片。
作為一個3D的項目,從用戶打開頁面到最終模型的渲染需要經過多個流程,加載的

g1e28資訊網——每日最新資訊28at.com

一、前言

近段時間,我們使用three.js完成了vivo擬我形象的開發工作,大家可以在vivo賬號中擬制屬于自己的3D形象,也可以保存作為自己的頭像名片。g1e28資訊網——每日最新資訊28at.com


g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

作為一個3D的項目,從用戶打開頁面到最終模型的渲染需要經過多個流程,加載的時間也會比普通的H5項目要更長一些。然而過長的等待時間會造成大量的用戶流失,這部分用戶沒有體驗到具體的功能就退出了頁面非常的遺憾,為了提升首屏加載的轉化率,需要盡可能的降低loading的時間。這里就分享一些我們在模型加載優化方面的心得。g1e28資訊網——每日最新資訊28at.com

二、模型加載的優化思路

想對加載進行優化,首先需要了解Three.js加載模型時的工作流程,并分析出其中耗時的部分進行針對性的處理。g1e28資訊網——每日最新資訊28at.com

在Three.js中,模型從加載到渲染需要經過模型下載、序列化模型、網格解析、寫入緩存和渲染模型幾個步驟,經過分析發現主要的瓶頸在網絡請求和網格解析兩個部分,所以整體的優化思路就是減少網絡請求資源的體積和提升網格的解析速度。g1e28資訊網——每日最新資訊28at.com


g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

三、縮小模型的體積

3.1 常見的解決方案

目前主流的壓縮方案是使用google的draco庫對模型進行壓縮。draco的原理類似降低圖片的分辨率,通過減少模型的頂點數起到壓縮體積的效果。g1e28資訊網——每日最新資訊28at.com

也就是說draco是一種有損的壓縮方式,這樣就會帶來諸多的問題g1e28資訊網——每日最新資訊28at.com

  • 可能在網格連接處存在畫面模型撕裂。
  • 僅僅壓縮頂點只能將50.7mb的人物模型壓縮到49.5,壓縮效果有限。
  • draco前臺decoder在h5中的解算效率不理想,可能節省下來的網絡請求時間還沒有增加的數據解算的時間長。

基于以上幾點,最終我們放棄了draco的壓縮方案。g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

使用draco壓縮之后導致的模型撕裂g1e28資訊網——每日最新資訊28at.com

3.2 進階方案

高端的食材,往往只需要采用最樸素的烹飪方式。經過一些嘗試,我們發現將glb模型直接打成zip包可以明顯的提升模型的壓縮效率。50.7mb的人物模型可以壓縮到11.6mb。g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

但是Three.js提供的gltfloader是不能直接加載zip文件的,于是我們需要對其進行功能擴展。g1e28資訊網——每日最新資訊28at.com

Three.js加載gltf模型是首先通過fetch請求獲取到模型的arraybuffer,再對arraybuffer進行格式化。所以我們只需要在模型格式化之前攔截zip文件進行解壓縮即可。g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

于是我們使用jszip,資源加載完成后判斷資源的后綴,如果是zip文件就使用jszip進行解壓縮。g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

看起來還不錯,在保證視覺效果的同時又可以大幅壓縮模型的體積,那么有沒有可能做的再極致一些呢?g1e28資訊網——每日最新資訊28at.com

既然是針對性的場景,我們就可以從解壓縮的解算開始入手,于是我們使用rust寫了一個解壓工具,將其轉換成wasm包代替jszip,可以發現wasm的冷啟動性能確實要比js好很多,可以將解壓的時長從幾十到100毫秒降低到1毫秒左右,適合體積比較小的解壓縮場景。g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

四、文件的加解密

作為一個h5項目,獲取到靜態資源的鏈接并不困難,所以需要對模型文件進行一點點加密,讓破解起來沒有那么容易。同時解密的過程不能顯著延長資源加載的時間,影響用戶體驗。g1e28資訊網——每日最新資訊28at.com

基于數據解密的效率,我們可以截取文件buffer的一部分進行加密,而不對全文進行加密,同時將數據解密的過程也放到wasm中,提升解算效率的同時也增強了安全性。采用對稱加密的算法,同一個方法既可以用于加密,也可以用于解密。g1e28資訊網——每日最新資訊28at.com

按照模型加載的流程,解密的操作應該放在解壓縮之后,序列化之前,那么如何判斷數據是否進行了加密呢,可以通過判斷解壓數據decode以后是否有glTF的標記來確定。g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

如下圖,數據解密的耗時幾乎可以忽略不計,可以放心使用。g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com


g1e28資訊網——每日最新資訊28at.com

五、如何優化首幀的渲染體驗

優化完模型的加載,繼續來優化模型的渲染,在加載一個體積比較大的模型的時候經常會有頁面的卡死的情況出現,需要從兩方面治標也治本的進行優化:g1e28資訊網——每日最新資訊28at.com

  1. 通過減少頁面的卡停來優化用戶的感官體驗。
  2. 通過縮短首屏渲染的時長來解決根本問題。

5.1 減少頁面的卡停

在模型加載的時候通常會設置一個loading頁面來展示當前的加載進度,同時loading頁也可以播放一些動效或者互動來讓用戶等待的過程中不那么無聊。但是由于js單線程的特性,在進行首幀渲染的時候任何事件都不無法響應,會讓用戶誤以為頁面卡死,造成流失。g1e28資訊網——每日最新資訊28at.com

為了解決這個問題我們可以使用分步加載的方案,在模型加載的時候先遍歷第一層網格,將所有的網格隱藏起來,然后循環這些網格,每展示一個就執行一次render方法,這樣就可以把一個大的卡頓分散成多個小的,不至于影響前臺的體驗。g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

但是這樣的方法只能讓用戶感受起來沒那么卡頓,該等的時間一點沒少,過長的等待時間還是會讓用戶等的不耐煩,有沒有其他解決卡頓的方式呢?這就要從Three.js的渲染邏輯來進行分析了。g1e28資訊網——每日最新資訊28at.com

5.2 縮短首幀渲染的時間

由于我們做的是一個捏臉的項目,通過形態鍵來實現不同的臉型,表情等表現。在Three.js中存儲形態鍵信息的屬性在geometry.morphAttributes中,形態鍵存放的頂點信息總數與網格的頂點數相同,這就意味著同一個模型有多少個形態鍵,就額外需要加載多少套網格的頂點信息。在首次渲染的時候Three.js會遍歷每一個形態鍵的頂點信息,生成一個float32array,而這個巨量的遍歷操作就是造成卡頓的根本原因。g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

如何解決這個循環黑洞呢,我想到了steamdeck上的著色器預緩存,通過將著色器編譯的結果進行持久化,縮短頁面加載的時間。那么我們只要將每一個網格的形態鍵編譯的結果儲存起來就行了。g1e28資訊網——每日最新資訊28at.com

/three/src/renderers/webgl/WebGLMorphtargets.jsg1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

通過這種方式成功的將首幀渲染的時間從7秒縮短到0.6秒,大幅的提升了用戶的體驗。g1e28資訊網——每日最新資訊28at.com

講到這里,大家可能發現了,雖然首幀渲染的時長縮短了,但是形態鍵緩存的資源有80mb,壓縮后也有15mb,這塊的時長可不可以繼續壓榨呢,先看一下資源的處理流程,處理解壓后的文件需要將文件解析成JSON字符串,然后在轉換成float32array,這里耗時最大的點就是JSON.parse的操作,有沒有更好的方式處理呢,可以將這部分內容丟到rust里面,平均可以減少0.5s的時間。g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

六、總結與規劃

以上就是我們的優化流程,將glb模型文件壓縮成zip包,配合前臺wasm解壓工具降低模型的加載時間。通過增加形態鍵緩存的方式來降低首幀渲染的時長。g1e28資訊網——每日最新資訊28at.com

圖片g1e28資訊網——每日最新資訊28at.com

經過這一系列的操作,成功的將模型的體積從50mb壓縮到11mb,增加了額外80mb的形態鍵緩存也可以使用zip壓縮到15mb,處理后頁面的首次加載時長從15秒縮短到5秒,算是一個不小的提升。g1e28資訊網——每日最新資訊28at.com

然而,我們也意識到還有進一步的優化空間,譬如目前雖然有了形態鍵緩存,但是原模型中的形態鍵信息還存儲在模型中,這一部分的信息不需要被threejs讀取,卻很大的占用了模型的體積,后續可以開發一個gltf-pipeline類似的處理工具,將形態鍵緩存直接整合進gltf模型中,同時把整個模型的序列化工作放到wasm中處理,降低模型的尺寸的同時也可以減少模型解析的時長。期待為大家帶來更好的使用體驗。g1e28資訊網——每日最新資訊28at.com


g1e28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-101717-0.html基于 Three.js 的 3D 模型加載優化

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Java 函數式接口,一文徹底剖析!

下一篇: 深入探索 Vite 的熱更新(HMR)實現

標簽:
  • 熱門焦點
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數據,像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新換代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • K6:面向開發人員的現代負載測試工具

    K6 是一個開源負載測試工具,可以輕松編寫、運行和分析性能測試。它建立在 Go 和 JavaScript 之上,它被設計為功能強大、可擴展且易于使用。k6 可用于測試各種應用程序,包括 Web
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 三萬字盤點 Spring 九大核心基礎功能

    大家好,我是三友~~今天來跟大家聊一聊Spring的9大核心基礎功能。話不多說,先上目錄:圖片友情提示,本文過長,建議收藏,嘿嘿嘿!一、資源管理資源管理是Spring的一個核心的基礎功能,不
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術的發展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內上線了“本地生活”入口,位置較深,位于首頁的“充值中心”內,目前主要售賣美食相關的
  • 華為Mate60標準版細節曝光:經典星環相機模組回歸

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • Meta盲目擴張致超萬人被裁,重金押注元宇宙而前景未明

    圖片來源:圖蟲創意日前,Meta創始人兼CEO 馬克·扎克伯發布公開信,宣布Meta計劃裁員超11000人,占其員工總數13%。他公開承認了自己的預判失誤:“不僅
Top