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