溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

在Canvas clearRect中引起的閃屏如何解決

發(fā)布時(shí)間:2022-02-23 15:40:32 來源:億速云 閱讀:317 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“在Canvas clearRect中引起的閃屏如何解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“在Canvas clearRect中引起的閃屏如何解決”吧!

問題簡介

功能簡介

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

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

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

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

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

問題分析

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

什么是雙緩存

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

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

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

使用雙緩存解決問題

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

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

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

updateCanvas(){
    const canvas = document.getElementById('canvas'); // 獲取頁面中的 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è)置寬高

    // 開始繪制
    tempCtx.drawImage(bg,0,0); // 背景
    ... // 省略其他繪制過程
    
    // 緩存 canvas 繪制完成
    
    ctx.clearRect(0,0,1448,750); // 清空舊 canvas
    ctx.drawImage(tempCanvas,0,0); // 將緩存 canvas 復(fù)制到舊的 canvas
}

到此,相信大家對(duì)“在Canvas clearRect中引起的閃屏如何解決”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI