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,布布扣,bubuko.com

时间: 2024-10-13 16:21:38

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf7的相关文章

HTML5 Canvas核心技术图形动画与游戏开发(读书笔记)----第一章,基础知识

一,canvas元素 1 为了防止浏览器不支持canvas元素,我们设置“后备内容”(fallback content),下面紫色的字即为后备内容 <canvas id="canvas" width="600" height="300">您的浏览器不支持canvas,可以选择升级您的浏览器</canvas> 2 开发基于canvas的应用程序的最基本的几个操作 1),使用document.getElementById()方

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf8

第6章 精灵 精灵(sprite),它是一种可以集成入动画之中的图像对象,赋予它们各种行为,精灵并非Canvas API的一部分,,但都是从它衍生而来 本章将会实现三种设计模式:策略模式(精灵与绘制器解耦).命令模式(精灵的动作).享元模式(一个实例表示多个精灵) painter属性是一个指向Painter对象的引用,使用paint(sprite,context)方法来绘制精灵,behaviors属性指向一个对象数组,数组中每个对象都会以execute(sprite,context,time)方

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf5

文本的定位 水平与垂直定位:当使用strokeText()和fillText()绘制文本时,指定了所绘文本的X与Y坐标,还有textAlign与textBaseline两个属性 textAlign:start(默认) center end left right,当canvas元素的dir属性是ltr时,left效果与start相同,right与end相同,如果dir属性是rtl,则相反 textBaseline:top bottom middle alphabetic(默认,基于拉丁字母) id

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf4

CanvasRenderingContext2D对象中用于平移.旋转坐标系的方法 镜像 scale(1,-1)绘制垂直镜像:scale(-1,1)绘制水平镜像 自定义的坐标变换 transform(),多次调用会叠加效果 setTransform(),每次调用都会清除上次的效果 两个方法都用于旋转.缩放.及平移坐标系(可以根据公式传入0或其他数据) x'=ax+cy+e y'=bx+dy+f 坐标系旋转公式(angle弧度) x'=x×cos(angle)-(y×sin(angle)) y'=y

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf1

canvas元素可以说是HTML5元素中功能最强大的一个,它真正的能力是通过Canvas的context对象(绘图上下文)表现出来的 fillText()方法使用fillStyle属性来填充文本中的字符,strokeText()方法使用strokeStyle属性描绘字符的轮廓线,fillStyle属性和strokeStyle属性可以是CSS格式的颜色.渐变色或是图片 fillText()与strokeText()方法都需要3个参数:要绘制的文本内容,以及在canvas中显示文本的横.纵坐标 注意

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf3

路径与子路径 在某一时刻,canvas之中只能有一条路径存在,Canvas规范称之为“当前路径”(current path),这条路径却可以包含很多子路径(subpath),子路径是由两个或者更多点组成的 context.beginPath(); context.rect(10,10,100,100); context.stroke(); context.beginPath(); //清除上次调用rect()方法所创建的路径 context.rect(50,50,100,100); contex

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf6

操作图像的像素:getImageData() putImageData() ImageData对象 调用getImageData()方法实际是获取了一个指向ImageData对象的引用,返回的对象包含3个属性:1)width以设备像素为单位的图像数据宽度 2)height以设备像素为单位的图像数据高度 3)data包含各个设备像素数值的数组 width和height都是只读的无符号长整数,data属性包含的每个数组元素都表示图像数据中相应的像素值,每个值包含的颜色分量都是含有8个二进制位的整数(

HTML5 Canvas核心技术—图形、动画与游戏开发.pdf2

事件处理: HTML5应用程序是以事件来驱动的,可以在canvas中增加一个事件监听器,当事件发生时,浏览器就会调用这个监听器 //方法一canvas.onmousedown=function(e){ //一些代码}; //方法二canvas.addEventListener('mousedown',function(e){ //一些代码}) 基础的数学知识简介: 代数方程:(10x+5)x2=110 三角函数:180°等于π弧度 正弦.余弦.正切: sin(α)对边/斜边 cos(α)邻边/斜

HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版?

HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程序直接切入这套API,全面讲解其功能,以求让读者实现出内容丰富且界面一致的网络应用程序,并将开发好的程序部署在多种设备及操作系统之上. 教程地址:HTML5 Canvas核心技术:图形.动画与游戏开发 PDF扫描版? HTML5 Canvas核心技术:图形.动画与游戏开发 目录: 前言 第1章 基础知识 1.