博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tips——canvas闪屏问题的处理
阅读量:5902 次
发布时间:2019-06-19

本文共 1348 字,大约阅读时间需要 4 分钟。

一、问题描述

在画canvas时,遇到屏幕瞬间空白的情况(大约1~2帧),造成用户体验不好。

二、原因

canvas的绘图过程是:先擦出整个画布;然后浏览器到达重绘时间点后,在空白的canvas上作画;xx毫秒后,这一帧动画上的所有元件完成绘画。

那么,当采用setTimeout或setInterval等与浏览器重绘频率不同步的计时器对画布进行绘图时,很可能上一帧的元件内容还没被完全画出来时,不精准的计时器已经驱动着擦除画布开始下一帧绘画;以及这一帧绘画已经结束,但不精准的计时器还没到指定刷新时间,所以此时会出现明显空白,也即“闪屏”。

三、解决

双缓冲理论:闪烁是图形编程的一个常见问题。需要多重复杂绘制操作的图形操作会导致呈现的图像闪烁或具有其他不可接受的外观。双缓冲的使用解决这些问题。双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。

即,先创建一个cacheCanvas执行计算绘制的操作,当下一帧刷新时,直接将cacheCanvas的内容drawImage到真正的canvas上,这么做既能有效规避闪屏,又能减缓卡顿情况。

示例代码:

var testBox = function(){    var canvas = document.getElementById("cas"),        ctx = canvas.getContext('2d'),        borderWidth = 2,        Balls = [];    var ball = function(x , y , vx , vy , useCache){        this.x = x;        this.y = y;        this.vx = vx;        this.vy = vy;        this.r = getZ(getRandom(20,40));        this.color = [];        this.cacheCanvas = document.createElement("canvas");        this.cacheCtx = this.cacheCanvas.getContext("2d");        this.cacheCanvas.width = 2*this.r;        this.cacheCanvas.height = 2*this.r;        var num = getZ(this.r/borderWidth);        for(var j=0;j
(canvas.width-this.r)||this.x
(canvas.height-this.r)||this.y

 

转载于:https://www.cnblogs.com/bbcfive/p/10706027.html

你可能感兴趣的文章
12行代码的相关节点
查看>>
activemq的几种基本通信方式总结
查看>>
PLSQL 中异常处理
查看>>
Android事件总线(一)EventBus3.0用法全解析
查看>>
log4j使用细节
查看>>
linux的文件权限
查看>>
6大设计原则
查看>>
JavaScript与DOM的关系
查看>>
前后背景色及屏幕大小获取
查看>>
谈谈-TabPagerIndicator
查看>>
DrawerLayout和ActionBarDrawerToggle
查看>>
Unity3D--学习太空射击游戏制作(四)
查看>>
"无法从静态上下文中引用非静态变量,非静态方法"
查看>>
Mybatis中的模糊查询
查看>>
sscanf()分割字符数组
查看>>
Hibernate中使用Criteria查询及注解——( EmpCondition)
查看>>
SQL Server 关系表的创建、索引创建和数据插入
查看>>
美图技术博客之地理空间距离计算优化
查看>>
[转载]jquery的extend和fn.extend 区别
查看>>
git的patch 管理
查看>>