国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > HTML5 > 正文

詳解使用雙緩存解決Canvas clearRect引起的閃屏問(wèn)題

2024-09-05 07:22:51
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

今天用 canvas 做 H5 的時(shí)候遇到了閃屏問(wèn)題。閃爍效果如下圖:

 

問(wèn)題簡(jiǎn)介

功能簡(jiǎn)介

H5 該部分的功能為:通過(guò)點(diǎn)擊二級(jí)菜單,切換圖片的遮罩或者更換背景。

因?yàn)楣δ芎?jiǎn)單,所以用了原生 canvas 實(shí)現(xiàn)這個(gè)功能。但在使用 clearRect 清除畫(huà)布的時(shí)候會(huì)出現(xiàn)閃爍的情況。

代碼實(shí)現(xiàn)(問(wèn)題代碼)

以下代碼即為出現(xiàn)閃屏的關(guān)鍵代碼,省略了圖片的定義與 onload:

// 點(diǎn)擊二級(jí)菜單后,觸發(fā)該函數(shù)更新畫(huà)布updateCanvas(){    const canvas = document.getElementById('canvas'); // 獲取畫(huà)布    const ctx = canvas.getContext('2d');    ctx.clearRect(0,0,1448,750); // 清空畫(huà)布    // 開(kāi)始重繪    ctx.drawImage(bg,0,0); // 背景    ... // 省略其他繪制過(guò)程}

問(wèn)題分析

經(jīng)過(guò)簡(jiǎn)單分析,得出閃屏的原因是 clearRect 清除畫(huà)布后,繪制的時(shí)間較長(zhǎng)導(dǎo)致出現(xiàn)閃屏的現(xiàn)象。

什么是雙緩存

來(lái)看一下microsoft 網(wǎng)站中雙緩沖圖形 這篇文章對(duì)雙緩存的解釋:

對(duì)圖形進(jìn)行編程時(shí)出現(xiàn)閃爍是一個(gè)常見(jiàn)問(wèn)題。 需要多個(gè)復(fù)雜畫(huà)圖操作的圖形操作可導(dǎo)致呈現(xiàn)的圖像出現(xiàn)閃爍或具有不可接受的外觀。 為解決這些問(wèn)題,.NET Framework 提供了雙緩沖功能。

雙緩沖使用內(nèi)容緩沖來(lái)解決與多個(gè)畫(huà)圖操作相關(guān)的閃爍問(wèn)題。 啟用雙緩沖后,所有畫(huà)圖操作會(huì)首先呈現(xiàn)到內(nèi)存緩沖而不是屏幕上的繪圖圖面。 所有畫(huà)圖操作完成后,內(nèi)存緩沖會(huì)直接復(fù)制到與之關(guān)聯(lián)的繪圖圖面。 由于屏幕上僅執(zhí)行一個(gè)圖形操作,因此與復(fù)雜畫(huà)圖操作相關(guān)的圖像閃爍可得以消除。

使用雙緩存解決問(wèn)題

以上引用,簡(jiǎn)單來(lái)說(shuō),主要問(wèn)題就是繪制時(shí)間較長(zhǎng)導(dǎo)致了閃屏,解決方法就是新建一個(gè) canvas 作為 緩存 canvas ,通過(guò) 緩存 canvas 完成繪制過(guò)程,繪制完成后,直接將 緩存 canvas 復(fù)制到原來(lái)的 canvas,這樣就可以解決繪制時(shí)間過(guò)長(zhǎng)導(dǎo)致的閃屏問(wèn)題。

代碼實(shí)現(xiàn)

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

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

效果驗(yàn)收

可以很明顯的看到閃屏問(wèn)題解決了!

 

總結(jié)

重繪畫(huà)布的時(shí)候,我們需要使用 clearRect 來(lái)清空畫(huà)布,此時(shí)的畫(huà)布是空的,開(kāi)始重繪后,如果內(nèi)容較多,時(shí)間也就相應(yīng)的增加,因此視覺(jué)出現(xiàn)了空檔期,我們就看到了閃屏的情況;

解決閃屏,其實(shí)就是怎么解決繪制時(shí)間較長(zhǎng)的問(wèn)題;

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 海盐县| 大足县| 长春市| 扎赉特旗| 玉溪市| 辽宁省| 桂东县| 滁州市| 白朗县| 克山县| 巴东县| 逊克县| 鄂伦春自治旗| 龙门县| 九寨沟县| 兰坪| 通州市| 长岭县| 定远县| 黄大仙区| 扎赉特旗| 康乐县| 巫溪县| 修水县| 彰化市| 三门县| 渭源县| 新绛县| 松溪县| 瑞金市| 尉氏县| 绥阳县| 九龙县| 若羌县| 莎车县| 临武县| 瑞金市| 亚东县| 凤翔县| 亚东县| 遵义市|