日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

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

把 Canvas 放到 WebWorker 中去繪制?想都不敢想有多爽!

來源: 責編: 時間:2024-07-19 07:59:00 159觀看
導讀前言大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心!最近項目中需要繪制一塊畫布,大致上樣子如下,就是繪制一堆人名在 Canvas 上(實際業務比這個復雜)。圖片大致代碼如下:頁面肯定

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心!8mY28資訊網——每日最新資訊28at.com

最近項目中需要繪制一塊畫布,大致上樣子如下,就是繪制一堆人名在 Canvas 上(實際業務比這個復雜)。8mY28資訊網——每日最新資訊28at.com

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

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

大致代碼如下:8mY28資訊網——每日最新資訊28at.com

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

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

頁面肯定不止只有 Canvas 的邏輯,就比如我在繪制畫布后,想去計算 1-100 的數字總和。8mY28資訊網——每日最新資訊28at.com

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

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

但是最終發現,繪制畫布耗費了很多時間,差不多有 1s 的時間,并且堵塞了主進程的代碼,導致了我后續的邏輯被堵住了,下圖可以看到,我的 computedTotal 結果是在畫布繪制完菜執行完的。8mY28資訊網——每日最新資訊28at.com

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

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

所以繪制畫布的耗時過長,阻塞了后續的同步代碼邏輯,這是不合理的,我們需要做優化。8mY28資訊網——每日最新資訊28at.com

Web Worker?(離屏 Canvas)

我們平時在遇到這類情況的時候,十有八九第一時間都會想到 Web Worker。8mY28資訊網——每日最新資訊28at.com

但是問題來了:正常來說,Web Worker 中可獲取不了 DOM,做不了畫布繪制呀。8mY28資訊網——每日最新資訊28at.com

估計會有人想:那我們可以把 Canvas 的 DOM 節點傳入 Web Worker 中嗎?8mY28資訊網——每日最新資訊28at.com

可以試試!8mY28資訊網——每日最新資訊28at.com

我們先準備一個 worker.js 來存放 Web Worker 的代碼:8mY28資訊網——每日最新資訊28at.com

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

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

接著在 index.js 中把 Canvas 的 DOM 節點傳過去。8mY28資訊網——每日最新資訊28at.com

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

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

發現會報錯,因為 postMessage 傳數據的時候會進行深拷貝,而 DOM 節點無法被深拷貝。8mY28資訊網——每日最新資訊28at.com

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

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

那么傳上下文過去可以嗎?也可以試試!8mY28資訊網——每日最新資訊28at.com

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

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

可以發現,還是不行。8mY28資訊網——每日最新資訊28at.com

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

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

canvas.transferControlToOffscreen

不得不說 JavaScript 是真的強大,早就為我們準備好了一個 API ,那就是 transferControlToOffscreen。8mY28資訊網——每日最新資訊28at.com

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

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

有了這個 API ,我們就可以把 Canvas 的 DOM 節點以另一種方式傳入 Web Worker 了?。?!我們也能在 Web Worker 中去進行 Canvas 的繪制,進而優化主線程的代碼執行效率??!8mY28資訊網——每日最新資訊28at.com

首先改造一下 drawSunshine,現在只需要傳入 Canvas DOM,不需要在主線程去做繪制。8mY28資訊網——每日最新資訊28at.com

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

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

接著我們在 worker.js 中去接收 DOM 節點,并進行畫布繪制。8mY28資訊網——每日最新資訊28at.com

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

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

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

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

最終可以看到,Canvas 的繪制并不會阻塞后續邏輯的執行。8mY28資訊網——每日最新資訊28at.com

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

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

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

本文鏈接:http://www.www897cc.com/showinfo-26-101708-0.html把 Canvas 放到 WebWorker 中去繪制?想都不敢想有多爽!

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

上一篇: Python 中窗口操作的完整指南

下一篇: 輕盈高效:深入了解.NET中的ValueStopwatch計時器

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 甘肃省| 富顺县| 山东省| 井陉县| 简阳市| 榕江县| 博爱县| 玉溪市| 酉阳| 乌鲁木齐县| 中阳县| 阜新| 甘南县| 垫江县| 刚察县| 克山县| 伊金霍洛旗| 玛多县| 黄龙县| 孟连| 石泉县| 屏南县| 旬邑县| 桃园市| 景德镇市| 五原县| 麦盖提县| 崇左市| 喀喇沁旗| 中超| 肥乡县| 财经| 金门县| 阳西县| 田林县| 临汾市| 仙桃市| 贡山| 恭城| 岳普湖县| 乌鲁木齐县|