《HTML5+JavaScript动画基础》——1.2 帧与运动

简介: 自然,这是有代价的。随着系统变得越来越大,规则变得越来越复杂,电脑必须能够迅速地计算出下一份图像描述,并将其显示出来。如果你想保持一定的帧率,那么给予电脑的处理时间(毫秒级)就极其有限。如果电脑无法及时完成计算,帧率就会下降

本节书摘来自异步社区《HTML5+JavaScript动画基础》一书中的第1章,第1.2节,作者:【美】Billy Lamberta , Keith Peters著,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.2 帧与运动

动画是一个创造运动假象的过程。几乎所有的投影运动媒体都采用帧实现运动。

帧是将一系列离散的图像以极快的速度连续播放从而模拟物体运动或变化。帧是你能在电脑、电视或电影屏幕上看到任何东西的基础。这个想法要回溯最早期的卡通,当时动画家把很多独立的图片绘制到一张张赛璐珞片(又称明片)上,而早期的运动影片同样是针对多张照片采用了类似的技术。

利用帧实现动画的概念很简单:当我们连续播放一系列有略微差别的图像时,大脑会将它们想象成一幅不断运动的图像。但是为什么我们坚持将其称为一种运动的假象?如果你在电影屏幕上看到一个人走过一间房间,这不算是运动吗?当然不算,因为这只不过一个人的图像而不是真人,但是这并不是我们不将其视为运动的原因。

注意,运动的物体通过穿越两点间的空间实现从一个点移动到另一个点。穿越空间的过程是流畅的,而不是跳跃的,这才是真实的运动。而基于帧的运动恰恰是跳跃式的。它的移动不是从一点到另一个点,而是在每一帧中从一个位置消失并出现在另一个位置。移动得越快,跳跃的感觉就越明显。

如果你看到一张图片里有一个人在房间的左边,而几秒钟后同一个人又出现在房间的右边,那么你会认为这是两张图片而绝不会把它们当做动画。即便你看到6张图片连在一起表现出一个人穿过房间的过程,你也只会把它们当做一系列独立的照片(见图1-1)。如果有足够多的照片以足够快的速度播放,虽然还是改变不了它们只是一系列静态照片的事实,但是你的看法却会发生变化。你的脑子会把它们当做一个人穿过了房间。与最开始的两张照片相比,它并没有什么本质不同,它始终不是真实的运动,不过,在到达某个频率之后,我们的大脑被欺骗了,认可了这一运动的假象。
screenshot

电影产业对这个频率做了大量的实验。研究表明将频率保持在每秒24帧,人们就会把这些帧视为一张运动的图像。如果低于此频率,人们就会察觉到跳帧,也就打破了这种运动的假象。并且人类的眼睛似乎无法区分比这更高的频率,每秒播放100帧并不会让你的动画显得更真实,尽管更高的帧率在电脑动画中会带来更好的互动感和流畅度。

1.2.1 记录帧
帧的完整概念使得以下3件事得以实现:储存、传播以及播放。你无法储存、传播以及播放一个真实的人走过一个房间,但是你可以保存那个人走过房间的很多照片,你可以传播这些图像并播放它们。这样,只要你能够解读这些保存的图像并有办法播放它们,你就可以在任何地方以及任意时间展现这一动画。

现在,我们需要给帧一个更加通用的定义。目前为止,我们一直将帧视为一张静止的照片或图画。让我们将之称为对一个系统在某一特定时间点的记录。这个系统可以是一个人穿越房间,时间可以是当他走到房间中间的时候,而此时的记录就是他走到房间中间的那张照片。另一方面,系统也可以是一个虚拟对象集合,此时的记录就是它们在某一特定时刻的形状、颜色以及位置。这样,你的动画就不再是一系列静止的图像,而是一系列关于图像的描述信息。电脑会根据这些描述信息创建并显示图像,而不是直接播放这些图像。将这一思想进一步演化就衍生出了程序帧。

1.2.2 程序帧
由于你有一台可以任由你使用并能够根据需要完成计算的电脑,因此你并不需要通过一个很长的帧描述列表实现动画。你可以将之简化为起始帧的一个描述,而后遵循某些特定的规则构建后续帧。此时,电脑所要做的就不仅仅是根据图像描述创建出一幅图像,而是要先创建图像描述,再根据描述创建图像并最终显示图像。

考虑一下采用这一方式你可以节省多少硬盘空间。图像需要占用硬盘的磁盘空间以及带宽,每秒24幅图像会迅速占用大量的空间。如果你将其简化为一份描述与一系列规则,那么文件大小则会急剧缩减。即便一系列用于表现物体运动与交互的复杂规则所占的空间也不会超过一幅中等大小的图像。事实上,人们对程序动画的第一印象就是文件是多么小。

自然,这是有代价的。随着系统变得越来越大,规则变得越来越复杂,电脑必须能够迅速地计算出下一份图像描述,并将其显示出来。如果你想保持一定的帧率,那么给予电脑的处理时间(毫秒级)就极其有限。如果电脑无法及时完成计算,帧率就会下降。而另一方面,基于图像播放的动画就无须关心场景中的内容以及它有多复杂,它只需要不断显示下一幅图像,而这通常是准时的。

相关文章
|
3天前
|
前端开发 JavaScript UED
使用JavaScript实现动画效果
【4月更文挑战第21天】使用JavaScript实现动画效果
28 10
|
3天前
|
缓存 编解码 JavaScript
在JavaScript小游戏开发中,如何优化游戏性能,比如减少重绘、提高动画流畅度?
提升JavaScript游戏性能的关键点包括:使用requestAnimationFrame优化动画流畅度;减少DOM操作,利用DocumentFragment或虚拟DOM;使用Canvas/WebGL高效渲染;优化图像资源,压缩图片和使用雪碧图;分层渲染与视口裁剪减少无效绘制;借助Web Workers进行后台计算;缓存计算结果;合理添加事件监听器并采用事件委托;定期进行性能分析以找到并解决瓶颈。不断测试与调整是优化的关键。
28 4
|
3天前
|
移动开发 前端开发 HTML5
Canvas实现超酷Loading动画HTML代码
之前我们分享过很多基于CSS3的Loading动画效果,相信大家都很喜欢。今天我们要来分享一款基于HTML5 Canvas的发光Loading加载动画特效。Loading旋转图标是在canvas画布上绘制的,整个loading动画是发光3D的视觉效果,HTML5非常强大。
12 1
Canvas实现超酷Loading动画HTML代码
|
3天前
|
JavaScript 前端开发 UED
【JavaScript技术专栏】使用JavaScript实现拖放和动画效果
【4月更文挑战第30天】本文介绍了如何使用JavaScript实现拖放功能和基本动画效果。拖放功能通过监听mousedown、mousemove和mouseup事件,记录元素初始位置并更新其坐标实现。动画效果则利用requestAnimationFrame函数持续改变元素位置,创建平滑移动效果。示例代码包括HTML结构和对应的JavaScript实现。
|
3天前
|
前端开发
html_css模拟端午赛龙舟运动
html_css模拟端午赛龙舟运动
7 1
|
3天前
|
前端开发 JavaScript 容器
JavaScript、CSS像素动画特效代码
此示例创建一个带有像素粒子的容器,每隔300毫秒就会动态添加一个新的像素粒子,然后通过CSS的关键帧动画(`@keyframes`)使它们产生上升和逐渐消失的动画效果。你可以根据需要修改像素粒子的颜色、大小、动画效果和创建速度。
14 0
|
3天前
|
移动开发 JavaScript HTML5
input | pattern | oninvalid | setCustomValidity | html5原生js表单校验
input | pattern | oninvalid | setCustomValidity | html5原生js表单校验
16 0
|
3天前
|
前端开发 JavaScript
前端基础知识(一){HTML.CSS.JavaScript}
前端基础知识(一){HTML.CSS.JavaScript}
|
3天前
|
移动开发 JavaScript 前端开发
HTML ,XHTML,HTML5简介,js,JSP与Servlet的关系理解
HTML ,XHTML,HTML5简介,js,JSP与Servlet的关系理解
53 5
|
3天前
|
JavaScript
JS+CSS3点击粒子烟花动画js特效
JS+CSS3点击粒子烟花动画js特效
20 0
JS+CSS3点击粒子烟花动画js特效