HTML5_canvas_图片加载_双缓冲_跳帧闪烁问题
canvas 图片加载
pen.drawImage(ele, showX, showY, imgWidth, imgHeight);
ele 将 img 元素 加载到画布上
- 步骤
1. 创建一个 <img> 对象
var imgNode = new Image();
imgNode.src = "./img/bird.png";
2. 等待图片加载完成,再进行下一步操作
imgNode.onload = function(){
3. 图片显示到画布上
pen.drawImage(imgNode, 0, 0, 100, 100);
};
跳帧闪烁问题
- 闪烁的原因:
- 清空了画布,然后加载图片,再等图片加载完,最后画下一帧。
- 这个空白延迟,主要是因为等待图片加载完成时间太久
- 解法1:
- 在加载图片之前,不清空上一帧图像
- 加载完成后,再清空画布,最后画下一帧。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>帧闪烁解决</title> <style type="text/css">
* {
margin: 0;
padding: 0;
} body{
text-align: center;
} #myCanvas{
border: 1px solid ;
}
</style>
</head> <body>
<canvas id="myCanvas" width="800" height="400"></canvas> <!-- javascript 代码 -->
<script type="text/javascript">
window.onload = function () {
var myCanvas = document.getElementById('myCanvas'); var painting = myCanvas.getContext('2d'); var num = 0;
var speed = 0;
setInterval(function(){
speed += 20;
if(speed > myCanvas.width){
speed = -150
// speed = 0
}; num++;
if(num > 8){
num = 1;
}; painting.beginPath(); //1.img对象
var imgNode = new Image(); //2.img对象 设置 src
imgNode.src = 'img/q_r' + num + '.jpg'; //3.等图片加载完成后再去设置图片显示
imgNode.onload = function () {
//4.图片显示在画布上
painting.clearRect(0, 0, myCanvas.width, myCanvas.height)
painting.drawImage(imgNode, speed, 150, 150, 90);
};
}, 340);
};
</script>
</body>
</html>
飞鸟 案例(双缓冲,解决跳帧闪烁问题)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>canvas 双缓冲案例</title> <style type="text/css">
body {
width: 100%;
color: #000;
background: #96b377;
font: 14px Helvetica, Arial, sans-serif;
} .wrap {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
</style>
</head> <body> <div id="box" class="wrap">
</div> <!-- javascript 代码 -->
<script type="text/javascript">
// 创建 画布的width 画布的height 背景颜色 父元素
function createCanvasTo(canvasWidth, canvasHeight, bgColor, parentObj){
var myCanvas = document.createElement("canvas");
myCanvas.width = canvasWidth;
myCanvas.height = canvasHeight;
myCanvas.innerText = " 您的浏览器不支持 canvas,建议更新或者更换浏览器。";
if(bgColor){
myCanvas.style.backgroundColor = bgColor;
};
if(parentObj){
parentObj.appendChild(myCanvas);
}; return myCanvas;
}; var box = document.getElementById("box"); var topCanvas = createCanvasTo(600, 83, "#fff", box);
movingPic(topCanvas, "./img/q_r", "jpg", -150, 0, 150, 83); var bottomCanvas = createCanvasTo(600, 300, "#fff", box);
movingPic(bottomCanvas, "./img/walking", "png", -130, 27, 130, 246); // 画布对象 图片路径 图片类型 起始x 起始y 图片width 图片height
function movingPic(theCanvas, imgPath, imgType, posX, posY, imgWidth, imgHeight){
var cacheCanvas = document.createElement("canvas");
cacheCanvas.width = theCanvas.width;
cacheCanvas.height = theCanvas.height;
var cachePen = cacheCanvas.getContext("2d"); var num = 1;
var pos = 0;
window.setInterval(function(){
pen = theCanvas.getContext("2d"); // 坑1: 一定要放在循环里面
pen.clearRect(0, 0, theCanvas.width, theCanvas.height); // 图形位移变换
num++;
if(num > 8){
num = 1;
}; pos += 15;
if(posX+pos > theCanvas.width){
pos = -130;
}; // 双缓冲绘制 先画到临时 canvas
cachePen.save();
cachePen.beginPath();
var imgObj = new Image();
imgObj.src = imgPath+num+"."+imgType;
imgObj.onload = function(){
cachePen.drawImage(imgObj, posX+pos, posY, imgWidth,imgHeight);
};
cachePen.restore(); // 再转到正式 canvas
pen.save();
pen.drawImage(cacheCanvas, 0, 0, cacheCanvas.width, cacheCanvas.height);
pen.restore(); // 坑2: 一定要在 取走缓冲内容后 再清除缓冲
cachePen.clearRect(0, 0, cacheCanvas.width, cacheCanvas.height);
}, 100);
};
</script>
</body>
</html>
HTML5_canvas_图片加载_双缓冲_跳帧闪烁问题的更多相关文章
- android图片的异步加载和双缓存学习笔记——DisplayImageOptions (转)
转的地址:http://hunankeda110.iteye.com/blog/1897961 1 //设置图片在下载期间显示的图片 2 showStubImage(R.drawable.ic_lau ...
- 关于图片加载非常爽的一个三方控件 fresco,一个三fresco
Hi EveryBody 今天来玩一个非常爽的控件 fresco 到底有多爽呢 接着看就知道了 首先 来看看fresco 是个神马东西 https://github.com/facebook/fre ...
- iOS开发——图形编程Swift篇&CAShapeLayer实现圆形图片加载动画
CAShapeLayer实现圆形图片加载动画 几个星期之前,Michael Villar在Motion试验中创建一个非常有趣的加载动画. 下面的GIF图片展示这个加载动画,它将一个圆形进度指示器和圆形 ...
- Android 平滑图片加载和缓存库 Glide 使用详解
在图片加载库烂大街的今天,选择一个适合自己使用的图片加载库已经成为了每一个Android开发者的必经之路.现在市面上知名的图片加载库有UIL,Picasso,Volley ImageLoader,Fr ...
- 使用CAShapeLayer来实现圆形图片加载动画[译]
原文链接 : How To Implement A Circular Image Loader Animation with CAShapeLayer 原文作者 : Rounak Jain 译文出自 ...
- Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)
列表的单元格中包含有图片在开发中很常见.通常我们可以直接在tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIn ...
- Python 植物大战僵尸代码实现: 图片加载和显示切换
游戏介绍以前很火的植物大战僵尸游戏, 本想在网上找个python版本游戏学习下,无奈没有发现比较完整的,那就自己来写一个把.图片资源是从github上下载的,因为图片资源有限,只能实现几种植物和僵尸. ...
- Android中常见的图片加载框架
图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...
- imagepool前端图片加载管理器(JavaScript图片连接池)
前言 imagepool是一款管理图片加载的JS工具,通过imagepool可以控制图片并发加载个数. 对于图片加载,最原始的方式就是直接写个img标签,比如:<img src="图片 ...
随机推荐
- Entity Framework入门教程(6)--- 在线场景中保存数据
在线场景中保存数据 在线场景中保存实体数据是一项相当容易的任务,因为使用的是同一个context,这个context会自动跟踪所有实体发生的更改. 下图说明了在线场景中的CUD(创建,更新,删除)操作 ...
- CopyOnWriteArrayList真的完全线程安全吗
我之前书上看到的说法是:Vector是相对线程安全,CopyOnWriteArrayList是绝对线程安全 这种说法其实有些问题,CopyOnWriteArrayList在某些场景下还是会报错的 Co ...
- SpringBoot系列: Web应用鉴权思路
==============================web 项目鉴权============================== 主要的鉴权方式有:1. 用户名/密码鉴权, 然后通过 Sess ...
- 使用/dev/poll的str_cli函数
void str_cli(FILE *fp, int sockfd) { int stdineof; char buf[MAXLINE]; int n; int wfd; ]; struct dvpo ...
- 查看和设置MySQL数据库字符集(转)
查看和设置MySQL数据库字符集作者:scorpio 2008-01-21 10:05:17 标签: 杂谈 Liunx下修改MySQL字符集:1.查找MySQL的cnf文件的位置find / -ina ...
- 3.让linux 增加 wget 命令
Wget主要用于下载文件,在安装软件时会经常用到 直接执行命令 : sudo yum -y install wget 就可以使用wget了
- [转] fastText
mark- from : https://www.jiqizhixin.com/articles/2018-06-05-3 fastText的起源 fastText是FAIR(Facebook AIR ...
- XML与HTML的作用不同
1. html是用来显示数据的:xml是用来描述数据.存放数据的,所以可以作为持久化的介质!Html将数据和显示结合在一起,在页面中把这数据显示出来:xml 则将数据和显示分开. XML被设计用来描述 ...
- Java基础8-多线程;同步代码块
作业解析 利用白富美接口案例,土豪征婚使用匿名内部类对象实现. interface White{ public void white(); } interface Rich{ public void ...
- 前端基础之jQuery
JavaScript和jQuery的区别 JavaScript是一门编程语言,我们用它来编写客户端浏览器脚本 jQuery是javascript的一个库,包含多个可重用的函数,用来辅助我们简化java ...