iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何使用双缓存解决Canvas clearRect引起的闪屏问题
  • 714
分享到

如何使用双缓存解决Canvas clearRect引起的闪屏问题

2023-06-09 13:06:50 714人浏览 安东尼
摘要

小编给大家分享一下如何使用双缓存解决canvas clearRect引起的闪屏问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!用 canvas 做 H5 的时候

小编给大家分享一下如何使用双缓存解决canvas clearRect引起的闪屏问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

用 canvas 做 H5 的时候遇到了闪屏问题。闪烁效果如下图:

如何使用双缓存解决Canvas clearRect引起的闪屏问题 

问题简介

功能简介

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}

效果验收

可以很明显的看到闪屏问题解决了!

如何使用双缓存解决Canvas clearRect引起的闪屏问题 

总结

重绘画布的时候,我们需要使用 clearRect 来清空画布,此时的画布是空的,开始重绘后,如果内容较多,时间也就相应的增加,因此视觉出现了空档期,我们就看到了闪屏的情况;

解决闪屏,其实就是怎么解决绘制时间较长的问题;

这里参考了图形图象处理编程中 双缓存 的概念,将绘制过程交给了 缓存 canvas ,这样页面中的 canvas 就省去了绘制过程,而 缓存 canvas 并没有添加到页面,所以我们就看不到绘制过程,也就解决了闪屏的问题。

以上是“如何使用双缓存解决Canvas clearRect引起的闪屏问题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: 如何使用双缓存解决Canvas clearRect引起的闪屏问题

本文链接: https://www.lsjlt.com/news/256063.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用双缓存解决Canvas clearRect引起的闪屏问题
    小编给大家分享一下如何使用双缓存解决Canvas clearRect引起的闪屏问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!用 canvas 做 H5 的时候...
    99+
    2023-06-09
  • 使用@Cacheable缓存解决双冒号::的问题
    目录@Cacheable缓存解决双冒号::Cacheable的使用总结常规使用方法@Cacheable缓存解决双冒号:: 使用spring-data-redis2.x版本时,@Cac...
    99+
    2024-04-02
  • 怎么使用@Cacheable缓存解决双冒号的问题
    本篇内容主要讲解“怎么使用@Cacheable缓存解决双冒号的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用@Cacheable缓存解决双冒号的问题”吧!@Cacheable缓存解决...
    99+
    2023-06-22
  • 如何解决React.memo引起的bug问题
    这篇文章主要介绍如何解决React.memo引起的bug问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!与PureComponent不同的是PureComponent只是进行浅对比props来决定是否跳过更新数据这...
    99+
    2023-06-29
  • 如何解决Redis缓存异常的问题
    这篇文章将为大家详细讲解有关如何解决Redis缓存异常的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。缓存雪崩缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都...
    99+
    2024-04-02
  • 如何解决redis缓存穿透、缓存击穿、缓存雪崩的问题
    这篇文章主要介绍了如何解决redis缓存穿透、缓存击穿、缓存雪崩的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。缓存穿透:key中对应的...
    99+
    2024-04-02
  • 如何解决EnyimMemcached异步化改造引起的内存泄漏问题
    如何解决EnyimMemcached异步化改造引起的内存泄漏问题,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。6月30日我们发布了异步化改造后的博客程序之后,出现了高内存、高C...
    99+
    2023-06-17
  • 如何解决vue单页缓存存在的问题
    这篇文章主要介绍了如何解决vue单页缓存存在的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.css同名覆盖,解决方法:父组件加上sc...
    99+
    2024-04-02
  • 使用NumPy和数组解决PHP缓存问题,让您的网站飞起来!
    PHP是一种流行的服务器端编程语言,它的灵活性和易用性吸引了许多网站的开发者。然而,PHP也因为它的解释性和动态编译方式而被诟病,这使得PHP的性能表现并不理想。其中一个性能瓶颈就是PHP的缓存问题。在本篇文章中,我们将介绍使用NumPy...
    99+
    2023-08-13
    缓存 数组 numpy
  • 如何解决Ajax中浏览器的缓存问题
    这篇文章主要讲解了“如何解决Ajax中浏览器的缓存问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决Ajax中浏览器的缓存问题”吧! ...
    99+
    2024-04-02
  • Java项目中的NPM缓存问题:如何解决?
    在现代Web开发中,NPM(Node Package Manager)已经成为了不可或缺的一部分。NPM是一个用于Node.js的包管理器,可以帮助开发者轻松地安装、更新和管理项目所需的各种依赖包。然而,在Java项目中使用NPM时,我们...
    99+
    2023-08-30
    leetcode npm 缓存
  • 如何解决MySQL中一个双引号的错位问题
    这篇文章主要讲解了“如何解决MySQL中一个双引号的错位问题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何解决MySQL中一个双引号的错位问题”吧!&n...
    99+
    2024-04-02
  • 如何解决vue spa应用中的路由缓存问题
    这篇文章将为大家详细讲解有关如何解决vue spa应用中的路由缓存问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。单页面应用中的路由缓存问题通常我们在进行页面前后退时,...
    99+
    2024-04-02
  • 如何解决MySQL中因一个双引号错位引发的问题
    小编给大家分享一下如何解决MySQL中因一个双引号错位引发的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言最近经常碰...
    99+
    2024-04-02
  • 分布式缓存中的 ASP 缓存和 JavaScript:如何解决性能问题?
    随着互联网的发展,网站的访问量越来越大,对服务器的性能要求也越来越高。为了提高网站的访问速度和用户体验,使用缓存技术是一个不错的选择。在缓存技术中,分布式缓存是一种常用的技术。本文将介绍在分布式缓存中,如何使用 ASP 缓存和 JavaS...
    99+
    2023-07-10
    缓存 javascript 分布式
  • PHP 缓存面试文件:如何解决缓存带来的一些问题?
    PHP 缓存是一种非常有用的技术,可以帮助我们提高网站性能,减少服务器负载,以及节省带宽等资源。但是,缓存也会带来一些问题,比如缓存数据过期、缓存不一致等等。本文将介绍如何解决这些问题,并提供一些演示代码。 一、缓存数据过期 缓存数据过期...
    99+
    2023-07-30
    缓存 面试 文件
  • 如何解决Lombok注解不起作用的问题
    本篇内容介绍了“如何解决Lombok注解不起作用的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Lombok注解不起作用场景:减少实体类...
    99+
    2023-06-20
  • 如何解决php header不起作用的问题
    本篇内容介绍了“如何解决php header不起作用的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php header不起作用的方法:...
    99+
    2023-06-20
  • 如何解决HashMap并发时会引起死循环的问题
    这篇文章给大家分享的是有关如何解决HashMap并发时会引起死循环的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。今天研读Java并发容器和框架时,看到为什么要使用ConcurrentHashMap时,其中有...
    99+
    2023-06-15
  • 如何解决bootstrap模态框数据缓存的问题
    这篇文章主要介绍如何解决bootstrap模态框数据缓存的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!问题背景第一步进行新增验证第二步进行修改模态框 验证信息没有消除 且表单数...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作