分享一下我是怎麼解決這個問題的,原因大概在兩方面:
一、把three.js中的物件定義到了data裡
首先非資料的東西不要掛在到data上,比如three.js中的renderer, camera,scene這些物件,可以在created或者mounted鉤子裡設定到this上或者儲存在其它變數裡,如果是定義在data上的話,Vue會遍歷整個物件樹設定對應的getter/setter,造成不必要的效能開銷。
二、元件銷燬時沒有做清理工作
如果是把renderer,mesh這些物件儲存在當前vm例項上的話,需要手動清理(這裡假設Vue不對自定義屬性做清理,未驗證過)。特別是你開啟了熱更新,每改動一次js程式碼例項就被銷燬和重新建立,如果不斷掉引用,它們就會一直儲存在記憶體中,可想而知佔用有多大。
最後,記得每一次動畫裡的requestAnimationFrame都要把id儲存下來,在元件銷燬時cancelAnimationFrame掉。
分享一下我是怎麼解決這個問題的,原因大概在兩方面:
一、把three.js中的物件定義到了data裡
首先非資料的東西不要掛在到data上,比如three.js中的renderer, camera,scene這些物件,可以在created或者mounted鉤子裡設定到this上或者儲存在其它變數裡,如果是定義在data上的話,Vue會遍歷整個物件樹設定對應的getter/setter,造成不必要的效能開銷。
二、元件銷燬時沒有做清理工作
如果是把renderer,mesh這些物件儲存在當前vm例項上的話,需要手動清理(這裡假設Vue不對自定義屬性做清理,未驗證過)。特別是你開啟了熱更新,每改動一次js程式碼例項就被銷燬和重新建立,如果不斷掉引用,它們就會一直儲存在記憶體中,可想而知佔用有多大。
最後,記得每一次動畫裡的requestAnimationFrame都要把id儲存下來,在元件銷燬時cancelAnimationFrame掉。