麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > HTML5 > 正文

詳解使用雙緩存解決Canvas clearRect引起的閃屏問題

2024-09-05 07:22:51
字體:
來源:轉載
供稿:網友

前言

今天用 canvas 做 H5 的時候遇到了閃屏問題。閃爍效果如下圖:

 

問題簡介

功能簡介

H5 該部分的功能為:通過點擊二級菜單,切換圖片的遮罩或者更換背景。

因為功能簡單,所以用了原生 canvas 實現這個功能。但在使用 clearRect 清除畫布的時候會出現閃爍的情況。

代碼實現(問題代碼)

以下代碼即為出現閃屏的關鍵代碼,省略了圖片的定義與 onload:

// 點擊二級菜單后,觸發該函數更新畫布updateCanvas(){    const canvas = document.getElementById('canvas'); // 獲取畫布    const ctx = canvas.getContext('2d');    ctx.clearRect(0,0,1448,750); // 清空畫布    // 開始重繪    ctx.drawImage(bg,0,0); // 背景    ... // 省略其他繪制過程}

問題分析

經過簡單分析,得出閃屏的原因是 clearRect 清除畫布后,繪制的時間較長導致出現閃屏的現象。

什么是雙緩存

來看一下microsoft 網站中雙緩沖圖形 這篇文章對雙緩存的解釋:

對圖形進行編程時出現閃爍是一個常見問題。 需要多個復雜畫圖操作的圖形操作可導致呈現的圖像出現閃爍或具有不可接受的外觀。 為解決這些問題,.NET Framework 提供了雙緩沖功能。

雙緩沖使用內容緩沖來解決與多個畫圖操作相關的閃爍問題。 啟用雙緩沖后,所有畫圖操作會首先呈現到內存緩沖而不是屏幕上的繪圖圖面。 所有畫圖操作完成后,內存緩沖會直接復制到與之關聯的繪圖圖面。 由于屏幕上僅執行一個圖形操作,因此與復雜畫圖操作相關的圖像閃爍可得以消除。

使用雙緩存解決問題

以上引用,簡單來說,主要問題就是繪制時間較長導致了閃屏,解決方法就是新建一個 canvas 作為 緩存 canvas ,通過 緩存 canvas 完成繪制過程,繪制完成后,直接將 緩存 canvas 復制到原來的 canvas,這樣就可以解決繪制時間過長導致的閃屏問題。

代碼實現

以下代碼即為關鍵代碼,省略了圖片的定義與 onload:

updateCanvas(){    const canvas = document.getElementById('canvas'); // 獲取頁面中的 canvas    const ctx = canvas.getContext('2d');        const tempCanvas = document.createElement('canvas'); // 新建一個 canvas 作為緩存 canvas    const tempCtx = tempCanvas.getContext('2d');    tempCanvas.width = 1448; tempCanvas.height = 750; // 設置寬高    // 開始繪制    tempCtx.drawImage(bg,0,0); // 背景    ... // 省略其他繪制過程        // 緩存 canvas 繪制完成        ctx.clearRect(0,0,1448,750); // 清空舊 canvas    ctx.drawImage(tempCanvas,0,0); // 將緩存 canvas 復制到舊的 canvas}

效果驗收

可以很明顯的看到閃屏問題解決了!

 

總結

重繪畫布的時候,我們需要使用 clearRect 來清空畫布,此時的畫布是空的,開始重繪后,如果內容較多,時間也就相應的增加,因此視覺出現了空檔期,我們就看到了閃屏的情況;

解決閃屏,其實就是怎么解決繪制時間較長的問題;

這里參考了圖形圖象處理編程中 雙緩存 的概念,將繪制過程交給了 緩存 canvas ,這樣頁面中的 canvas 就省去了繪制過程,而 緩存 canvas 并沒有添加到頁面,所以我們就看不到繪制過程,也就解決了閃屏的問題。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 深夜视频在线观看 | 香蕉秀 | 欧美在线观看黄色 | 欧美一级aa免费毛片 | 精品一区在线视频 | av日韩一区二区三区 | 羞羞的视频免费在线观看 | 福利免费在线观看 | 久久精品亚洲一区 | 久久免费视频一区二区三区 | 亚洲国产精品99 | 99国产精成人午夜视频一区二区 | 成年性羞羞视频免费观看无限 | 欧美性生交xxxxx免费观看 | 国产精品成人一区二区三区电影毛片 | 中文字幕在线播放一区 | 亚洲午夜激情网 | 精品亚洲综合 | 91美女啪啪 | 草莓福利视频在线观看 | 亚洲第一视频 | 蜜桃网站免费 | 一级免费毛片 | 亚洲精品久久久久久久久久久 | 国产精品视频免费在线观看 | 亚洲婷婷日日综合婷婷噜噜噜 | 一区二区三区小视频 | 午夜人体| 中文字幕在线观看1 | 国产免费一区视频 | v11av在线视频成人 | 国产黄色网页 | 一级毛片免费高清 | 久久精品国产99国产精品亚洲 | 午夜啪视频 | 一级视频在线播放 | 久久毛片免费观看 | 成人h视频在线 | 国产精品色综合 | 色毛片| 久久经典视频 |