HTML5 Canvas核心技术—图形、动画与游戏开发.pdf7
性能
运行putImageData()比drawImage()慢,同等条件下优先考虑drawImage()
操作图像数据需要遍历大量数据,应该注意几点:
1)避免在循环体中直接访问对象属性,应当保存在局部变量中
2)应该用循环计数器遍历完整的像素,而非像素分量(每4个一组)
3)逆向遍历与移位技巧效果并不好
4)不要频繁使用getImagedata()
视频处理
var video=document.getElementById('video'); //A <video>element
...
context.drawImage(video,0,0); //取其中某一帧
视频格式

以上三种格式并不是所有浏览器都支持,需要指定多钟格式的文件,在video元素中嵌入source元素
<video>
<source src='video.ogg'>
<source src='video.mp4'>
</video>
在Canvas中播放视频
把一段<video>元素display设置为none,将视频的每一帧绘制到canvas上
第5章 动画
动画循环:持续更新并重绘就叫做“动画循环”,它是所有动画的核心逻辑
死循环:
function animate(){...}
while(true){animate();}
要实现动画效果,必须让浏览器没隔一段时间就有一个喘息的机会
不要使用window.setInterval()或window.setTimeout()方法来做动画,这两个方法并不能提供精确计时机制,浏览器有个术语“clamping the timeout interval(强制规定时间间隔的下限)”,并且不应该主动命令浏览器何时去绘制下一帧(浏览器有自己的动画机制),应该由浏览器来通知你,总结:
都是通用方法,并不是专为制作动画而用
达不到毫秒的精确度
没有对动画的优化
不考虑绘制动画的最佳时机
HTML5有一个requestAnimationFrame()方法,想要播放动画时就调用requestAnimationFrame()方法,并将指向动画播放函数的引用传递给它,浏览器决定绘制第一帧动画时,就调用这个函数,根据情况可再次调用,使动画持续下去
function(time){
requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
调用requestAnimationFrame()方法时,不必指定定帧速率,浏览器会自动选择合适的帧速率
W3C也提供了cancelRequestAnimationFrame()方法,用于取消回调函数,requestAnimationFrame()方法返回一个long型的对象,用作标识回调函数身份的句柄(相当于setInterval函数返回的句柄),若要取消,传递给cancelRequestAnimationFrame()即可
requestAnimationFrame()方法在回调动画函数时,会传递给它一个时间值,表示1970年1月1日到当前所经过的毫秒数

可移植与各浏览器平台的动画循环逻辑:如果发现当前浏览器支持W3C标准方法,就使用它,否则使用浏览器专有实现方式,如果两者都不支持,只能借助setTimeout()方法来实现
帧速率的计算,动画每秒播放的帧数(fps)计算每一帧动画当前的时间,获取时间差,1000毫秒除时间差
以不同的帧速率来执行各种任务(分数等更新速率不必与动画速率相同)
恢复动画背景,处理背景有三种办法
1)所有内容都擦除,并重新绘制
2)仅重绘内容发生变化的那部分区域
3)从离屏缓冲区中将内容发生变化的那部分背景图像复制到屏幕上
如果背景很简单,把每帧动画的所有内容都重绘一遍反而可以获得最佳性能
利用剪辑区域处理动画背景
所有的绘制操作都限定在某条路径所定义的范围内,利用剪辑区域技术来恢复上一帧动画占据的背景,有时可以提高绘制速度
1)调用context.save(),保存屏幕的canvas的状态
2)通过调用beginPath()来开始一段新的路径
3)在context对象上调用arc()、rect()来设置路径
4)调用context.clip()方法,将当前路径设置为屏幕canvas的剪辑区域
5)擦除屏幕canvas中的图像
6)将背景图像绘制到屏幕canvas中
7)恢复屏幕canvas的状态参数
利用图块复制技术来处理动画背景
将所有的背景绘制到离屏canvas上,再将背景图块复制到屏幕上
一般来说通过图块复制比剪辑区域速度更快,但离屏canvas更占用内存
利用双缓冲技术绘制动画(浏览器自动使用该技术,手工实现反而降低性能)
清除canvas然后绘制下一帧动画,如果动画是单缓冲,意味着其内容会被立即绘制到屏幕,擦除背景的一瞬间所造成闪烁
防止闪烁可以使用双缓冲,即将所有东西绘制到离屏canvas上,再将离屏canvas中的图片一次性复制到屏幕canvas中
基于时间的运动
底层的帧速率不应该影响动画的帧速率,动画帧速率应该保持稳定
背景的滚动
视差动画:让各个动画图层以不同的速度滚动,产生视差效果
用户手势
定时动画:很多动画需要在某个时间段内运行
动画制作得而最佳指导原则
使用类似requestNextAnimationFrame()这样的“polyfill式”方法来保持浏览器兼容性
将业务逻辑的更新与动画的绘制分开
使用“基于时间的运动”来协调动画的播放速度
用剪辑区域或图块复制技术将复杂的背景图像恢复到屏幕上
必要时可以使用一个或者多个离屏缓冲区提升背景的绘制速度
不要手工实现传统的双缓冲算法,浏览器会自动实现它
不要通过CSS指定阴影及圆角效果
不要在Canvas中进行带有阴影效果的绘制操作
不要在播放动画时分配内存
使用性能调试及时间轴工具来监控并改善动画的绘制效率
HTML5 Canvas核心技术—图形、动画与游戏开发.pdf7的更多相关文章
- HTML5 Canvas核心技术图形动画与游戏开发 ((美)David Geary) 中文PDF扫描版
<html5 canvas核心技术:图形.动画与游戏开发>是html5 canvas领域的标杆之作,也是迄今为止该领域内容最为全面和深入的著作之一,是公认的权威经典.amazon五星级超级 ...
- HTML5 Canvas核心技术图形动画与游戏开发(读书笔记)----第一章,基础知识
一,canvas元素 1 为了防止浏览器不支持canvas元素,我们设置“后备内容”(fallback content),下面紫色的字即为后备内容 <canvas id="canvas ...
- Html5 Canvas核心技术(图形,动画,游戏开发)--基础知识
基础知识 canvas 元素可以说是HTML5元素中最强大的一个,他真正的能力是通过canvas的context对象表现出来的.该环境对象可以从canvas元素身上获得. <body> & ...
- HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版
HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程 ...
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf2
事件处理: HTML5应用程序是以事件来驱动的,可以在canvas中增加一个事件监听器,当事件发生时,浏览器就会调用这个监听器 //方法一canvas.onmousedown=function(e){ ...
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf8
第6章 精灵 精灵(sprite),它是一种可以集成入动画之中的图像对象,赋予它们各种行为,精灵并非Canvas API的一部分,,但都是从它衍生而来 本章将会实现三种设计模式:策略模式(精灵与绘制器 ...
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf6
操作图像的像素:getImageData() putImageData() ImageData对象 调用getImageData()方法实际是获取了一个指向ImageData对象的引用,返回的对象包含 ...
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf1
canvas元素可以说是HTML5元素中功能最强大的一个,它真正的能力是通过Canvas的context对象(绘图上下文)表现出来的 fillText()方法使用fillStyle属性来填充文本中的字 ...
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf5
文本的定位 水平与垂直定位:当使用strokeText()和fillText()绘制文本时,指定了所绘文本的X与Y坐标,还有textAlign与textBaseline两个属性 textAlign:s ...
随机推荐
- 暑假集训(1)第八弹 -----简单迷宫(Poj3984)
Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, ...
- 强大的字符串格式化函数 - format
自python2.6开始,新增了一种格式化字符串的函数str.format(),它通过{}和:来代替% 位置方法格式化 >>>'{}-{}'.format('simon','ting ...
- Java中的TCP/UDP网络通信编程
127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户 ...
- 工作总结:文件对话框的分类(C++)
原文地址:http://www.jizhuomi.com/software/173.html 文件对话框分为打开文件对话框和保存文件对话框,相信大家在Windows系统中经常见到这两种文件对话框.例如 ...
- C语言中.h和.c文件解析(很精彩)
C语言中.h和.c文件解析(很精彩) 简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析 ...
- WinterCamp 2015 总结
这次WC2015确实有很多遗憾,特别是考试的时候犯的低级错误,由于我没有看到第三题每个点输出不全可以得小分,对于又没跑出来的点,我都根本没有上交.这确实是一个很悲伤的事情,但是也给我了足够时间去反思. ...
- hdu 4445
今天模拟了一场去年金华的现场赛: 我和小珺两人出了5个题,感觉还可以: 不过这次的题目确实比较简单: 这个题目感觉不错,不难,以前见过用这种方法的,但一直没写过: 这次写下练练手: 思路,将角度分成1 ...
- 使用 .NET 平台,如何玩转 Universal Windows 应用?
2015年7月30日 本文作者是 Managed Languages 团队项目经理 Lucian Wischik. 不久前,Visual Studio 2015上新增 Windows 10 应用的开发 ...
- IE连EXCHANGE的HTTPS时,出现错误
"There is a problem with this website's security certificate" 这种问题,一般是SSL或CA认证证书的问题. 一般从服务 ...
- mysql 连接url中useUnicode=true&characterEncoding=UTF-8 的作用
添加的作用是:指定字符的编码.解码格式. 例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码.这时候如果添加了useUnicode=true&cha ...