前言
大家好,我是林三心,用最通俗易懂的話講最難的知識點(diǎn)是我的座右銘,基礎(chǔ)是進(jìn)階的前提是我的初心!YLO28資訊網(wǎng)——每日最新資訊28at.com
最近項(xiàng)目中需要繪制一塊畫布,大致上樣子如下,就是繪制一堆人名在 Canvas 上(實(shí)際業(yè)務(wù)比這個復(fù)雜)。YLO28資訊網(wǎng)——每日最新資訊28at.com
圖片YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
大致代碼如下:YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
頁面肯定不止只有 Canvas 的邏輯,就比如我在繪制畫布后,想去計(jì)算 1-100 的數(shù)字總和。YLO28資訊網(wǎng)——每日最新資訊28at.com
圖片YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
但是最終發(fā)現(xiàn),繪制畫布耗費(fèi)了很多時間,差不多有 1s 的時間,并且堵塞了主進(jìn)程的代碼,導(dǎo)致了我后續(xù)的邏輯被堵住了,下圖可以看到,我的 computedTotal 結(jié)果是在畫布繪制完菜執(zhí)行完的。YLO28資訊網(wǎng)——每日最新資訊28at.com
圖片YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
所以繪制畫布的耗時過長,阻塞了后續(xù)的同步代碼邏輯,這是不合理的,我們需要做優(yōu)化。YLO28資訊網(wǎng)——每日最新資訊28at.com
Web Worker?(離屏 Canvas)
我們平時在遇到這類情況的時候,十有八九第一時間都會想到 Web Worker。YLO28資訊網(wǎng)——每日最新資訊28at.com
但是問題來了:正常來說,Web Worker 中可獲取不了 DOM,做不了畫布繪制呀。YLO28資訊網(wǎng)——每日最新資訊28at.com
估計(jì)會有人想:那我們可以把 Canvas 的 DOM 節(jié)點(diǎn)傳入 Web Worker 中嗎?YLO28資訊網(wǎng)——每日最新資訊28at.com
可以試試!YLO28資訊網(wǎng)——每日最新資訊28at.com
我們先準(zhǔn)備一個 worker.js 來存放 Web Worker 的代碼:YLO28資訊網(wǎng)——每日最新資訊28at.com
圖片YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
接著在 index.js 中把 Canvas 的 DOM 節(jié)點(diǎn)傳過去。YLO28資訊網(wǎng)——每日最新資訊28at.com
圖片YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
發(fā)現(xiàn)會報錯,因?yàn)?postMessage 傳數(shù)據(jù)的時候會進(jìn)行深拷貝,而 DOM 節(jié)點(diǎn)無法被深拷貝。YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
那么傳上下文過去可以嗎?也可以試試!YLO28資訊網(wǎng)——每日最新資訊28at.com
圖片YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
可以發(fā)現(xiàn),還是不行。YLO28資訊網(wǎng)——每日最新資訊28at.com
圖片YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
canvas.transferControlToOffscreen
不得不說 JavaScript 是真的強(qiáng)大,早就為我們準(zhǔn)備好了一個 API ,那就是 transferControlToOffscreen。YLO28資訊網(wǎng)——每日最新資訊28at.com
圖片YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
有了這個 API ,我們就可以把 Canvas 的 DOM 節(jié)點(diǎn)以另一種方式傳入 Web Worker 了!!!我們也能在 Web Worker 中去進(jìn)行 Canvas 的繪制,進(jìn)而優(yōu)化主線程的代碼執(zhí)行效率!!YLO28資訊網(wǎng)——每日最新資訊28at.com
首先改造一下 drawSunshine,現(xiàn)在只需要傳入 Canvas DOM,不需要在主線程去做繪制。YLO28資訊網(wǎng)——每日最新資訊28at.com
圖片YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
接著我們在 worker.js 中去接收 DOM 節(jié)點(diǎn),并進(jìn)行畫布繪制。YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
圖片YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
最終可以看到,Canvas 的繪制并不會阻塞后續(xù)邏輯的執(zhí)行。YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
YLO28資訊網(wǎng)——每日最新資訊28at.com
圖片 YLO28資訊網(wǎng)——每日最新資訊28at.com
本文鏈接:http://www.tebozhan.com/showinfo-26-101708-0.html把 Canvas 放到 WebWorker 中去繪制?想都不敢想有多爽!
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: Python 中窗口操作的完整指南
下一篇: 輕盈高效:深入了解.NET中的ValueStopwatch計(jì)時器