記一次 vue 的非同步更新佇列導致記憶體洩漏

sunrise丶發表於2019-09-06

由於專案是需要連續傳輸圖片形成一個偽視訊(沒辦法,客戶錢給的不夠)來觀看。後端採用傳輸base64的圖片到前端展示。

php: 7.2

workerman: 3.X

vue: 2.X

workerman與樹莓派進行socket連線,樹莓派通過攝像頭將視訊擷取為一張張的圖片傳送到workermanworkerman再將圖片轉為base64的格式通過websocket傳輸到前端vuevue接收到訊息後將base64賦值到變數中。

<img  src="'data:image/png;base64,'+videobox.image" >
var vm = new Vue({
    data: {
        videobox: {
           image: "",
        }
    },
    method: {
        getImage: function(data) {
                this.videobox.image = data.image
        }
    }
})

由於後端會一直傳輸base64格式的圖片到vue上,所以video.image會不斷的重新整理,但是記憶體卻忽然間爆漲了起來

記一次vue的非同步更新佇列導致記憶體洩漏

一張圖片才幾十k,記憶體卻幾秒鐘漲到了G的級別,所以懷疑是記憶體洩漏了。

查閱了文件後發現 非同步佇列更新

記一次vue的非同步更新佇列導致記憶體洩漏

也就是說每一次的資料更新都會進入到佇列中,並且快取了起來.....所以我的記憶體才爆漲了起來。。

解決方案也有,就是採用$nextTick()方法來重新整理佇列。。

<img  src="'data:image/png;base64,'+videobox.image" >
var vm = new Vue({
    data: {
        videobox: {
           image: "",
        }
    },
    method: {
        getImage: function(data) {
                this.$nextTick(function() {
                    this.videobox.image = data.image
                });
        }
    }
})

修改程式碼後記憶體再也沒有上過G級別了。。

記一次vue的非同步更新佇列導致記憶體洩漏

相關文章