【HTML5】基于HTML5的高性能动画与游戏
其实这篇文章类似版本早在12年就在网上各处出现了,也随着HTML5的兴起,HTML的新特性也是倍受开发者们追捧,自然相关HTML5的高性能动画与游戏的相关文章也是层出不穷的,笔者也是在12年接触的相关技术,不过俗话说“隔行如隔山”,随着大前端时代的到来,前端的工作范围和知识疆界也在不断的扩展,需要的知识结构和知识体系也在不断的丰富,最近也基于所在团队不断需要有新人有这方面的知识储备,于是就有了此文。当然本文并不会提供任何一段完整可用的代码,伸手党也请耐下心来看吧,理解了原理实现其实是一件很简单的事情。
什么是动画?什么是游戏?
如上所述,既然是面对新人的,所以有必要从根源开始讲起。首先需要回到“是什么”的问题?
这里援引某度的定义:
“动画的概念不同于一般意义上的动画片,动画是一种综合艺术,它是集合了绘画、漫画、电影、数字媒体、摄影、音乐、文学等众多艺术门类于一身的艺术表现形式。最早发源于19世纪上半叶的英国,兴盛于美国,中国动画起源于20世纪20年代。动画是一门年青的艺术,它是唯一有确定诞生日期的一门艺术,1892年10月28日埃米尔·雷诺首次在巴黎著名的葛莱凡蜡像馆向观众放映光学影戏,标志着动画的正式诞生,同时埃米尔·雷诺也被誉为“动画之父”。动画艺术经过了100多年的发展,已经有了较为完善的理论体系和产业体系,并以其独特的艺术魅力深受人们的喜爱。
简单的讲完了原理之后,很多童鞋可能会笔者当初刚知道原理的时候一样,有同样的问题,时代发展得那么快,我们哪有功夫慢慢去堆一套这么个东西出来呢?这个问题同样困扰着笔者,在笔者刚过去的2016年就碰到了这样一个场景:
业务方需要在春节上线5个HTML5的游戏,时间基本只有两周,整个项目处于剧本暂无、人员未定、资源没有,但是档期已定的严苛条件下
拿2016年的年度词汇来说,这是一个典型的“黑天鹅”事件,但是既然它已经发生了,那么我们能做的,就只有“面对不确定性”。这个时候笔者也想起来早在2012年学习HTML5的时候就尝试着写过一个html5的游戏引擎,也经过团队的平衡考量,最终选择一个蛮有渊源的H5引擎Hilo,用于快速开发。虽然至今对内部事件机制仍抱有一些质疑,但是整体api的可用性,易用性,还有针对web端这样的一个特性,笔者最终选择了这个引擎,顺利完成了那个“甲方虐我千百遍,我待甲方如初恋”的需求。
回到这个问题上,这次也许我们面对的是一个游戏的开发需求,下次也许是一个其他的什么的开发需求,在这个迅速变化、发展的时代,作为一个前端工程师(请记住,我们是工程师),我们应该如何自处呢?我想起了《黑天鹅》一书作者纳西姆·塔勒布的另外一部书《反脆弱》他在扉页里这样写道
“从不确定性中获益”
希望你我能都从中获益吧。
总结一下
在html5时代,如何高效的的实现动画和游戏呢?
首先,我们可以依赖CSS3提供的强大支持来实现部分静态、固定的动画效果(当然别忘了那些硬件加速的小姿势,能够迅速的帮你提高性能),而对于那些复杂的动画,我们则需要依赖canvas的强大能力,当然,再进一步,我们还能使用webgl(但是不得不说,虽然canvas在部分android的表现已经不算太好,但是webgl。。还有是否支持的前置问题)。
然后,对于基于canvas的动画或者游戏,高效的抽离和管理interval和事件监听,如使用requestAnimationFrame替换setInterval和setTimeout,所有tick在一个统一的ticker中管理,以及将避免过多的事件监听,都能有效的提高整个webapp的性能。
最后,前文可能并没有提及的,内存的管理,资源的回收,这也是大部分性能问题的症结所在,基于过往的习惯,我们大多数时候都只关心如何构建和使用资源,而在游戏的场景中,却多了一个回收资源(比如说restart)的场景存在,我们不能总寄希望于依赖页面刷新去处理,能够对自己创建申请的内存资源进行管理和回收,这也是工程化思想很重要的一部分。如何更好的使用单例模式构造一经创建而不需要频繁回收的对象,使用工厂模式批量的构造我们需要的对象,使用装饰者模式在不破坏游戏结构的前提下完成打点,这都是我们需要关心的工作。
一些也许有用的小知识
讲道理文章到上面就应该结束了,但是说了一堆大家都懂的话未免也太无聊了,以下罗列搜集一点自己的实践中的干活,希望再各位童鞋踩坑的时候能够帮到大家:
1、首先是关于canvas的,同样也是我们老僧常谈的一倍屏VS多倍屏的问题,我们都知道手机现在至少都是个2倍屏,那么聪明的你肯定会想到,既然图片都需要针对2倍屏做适配,那么canvas应该也会有类似的问题才对吧?没错,canvas也会因为手机的2倍屏而导致成像模糊,最简单的处理方式是:
你的dom中给一个2倍宽高的canvas:
<canvas width="YourScreenWidth * 2" height="YourScreenHeight * 2"></canvas>
另外,再绘制之前,缩放你的ctx为原始的1/2:
ctx.scale(.5, .5)
想知道具体原因的童鞋,不妨思考一下为什么。
2、想必很多同学都有过使用rem开发响应式页面的经历,那样的页面确实能够很好的填充整个屏幕,但是如果换做是canvas呢?rem的那套实现还能够好用么?其实这个问题大家只要想想,比如你玩的如LOL、DOTA、或者某某手游,它会因为你屏幕变化而随着等比例变化么?就很好回答了。
3、和CSS3的的渲染一样,开启硬件加速往往是解决性能瓶颈的少数不多的方法,当然canvas平台上还有一个webgl的解决方案,能够优化你的html5 app的性能。
4、也许细心的童鞋在上文中也发现了,为什么要使用事件委托来添加监听呢?因为整个canvas容器就一个eventHandler,基于性能考量,这是性能最好的一个方案(至于实现嘛,事件队列也是蛮成熟的思想了,这里就不赘述了)。而同样的,所有需要延时调用的,我们也会都是用那唯一的已经启动ticker来处理。
5、关于装饰者模式的数据采集。其实大多数公司都会有数据监控的需求,因为他们需要知道他们做的这些webapp的实际效果如何,那么数据监控则是势在必行之举,但它本身是和游戏是没有关系的,所以基于aop的思想,也依赖babel强大的能力,我们能够使用装饰者模式,以最少的成本换取项目尽可能少的破坏。
目前能想到的就这些了,也许未来碰到了新的坑也会更新上来。
然后最后按惯例需要升华下主题。生而有幸,在前端最迅猛发展的几年选对了行,入了行,并且一步步走到了今天,随着前端的大潮席卷着全球:
动画 游戏 node 数据库 hybridapp
这又让我想起了著名的罗马大帝盖乌斯·尤利乌斯·恺撒说过的一句话:
I came, I saw, I conquered
也许现在的大前端的浪潮也正是这样,但是最后这位伟大的皇帝(无冕之皇)死在了自己元老会的面前。
【HTML5】基于HTML5的高性能动画与游戏的更多相关文章
- HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版
HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程 ...
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf7
性能 运行putImageData()比drawImage()慢,同等条件下优先考虑drawImage() 操作图像数据需要遍历大量数据,应该注意几点: 1)避免在循环体中直接访问对象属性,应当保存在 ...
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf2
事件处理: HTML5应用程序是以事件来驱动的,可以在canvas中增加一个事件监听器,当事件发生时,浏览器就会调用这个监听器 //方法一canvas.onmousedown=function(e){ ...
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf6
操作图像的像素:getImageData() putImageData() ImageData对象 调用getImageData()方法实际是获取了一个指向ImageData对象的引用,返回的对象包含 ...
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf1
canvas元素可以说是HTML5元素中功能最强大的一个,它真正的能力是通过Canvas的context对象(绘图上下文)表现出来的 fillText()方法使用fillStyle属性来填充文本中的字 ...
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf8
第6章 精灵 精灵(sprite),它是一种可以集成入动画之中的图像对象,赋予它们各种行为,精灵并非Canvas API的一部分,,但都是从它衍生而来 本章将会实现三种设计模式:策略模式(精灵与绘制器 ...
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf5
文本的定位 水平与垂直定位:当使用strokeText()和fillText()绘制文本时,指定了所绘文本的X与Y坐标,还有textAlign与textBaseline两个属性 textAlign:s ...
- HTML5 Canvas核心技术 图形、动画与游戏开发学习总结
save 和 restore 函数的应用 保存canvas和恢复canvas clip函数的应用 文字的绘制 背景图片的绘制 离屏canvas 基于时间的运动
- HTML5 Canvas核心技术—图形、动画与游戏开发.pdf4
CanvasRenderingContext2D对象中用于平移.旋转坐标系的方法 镜像 scale(1,-1)绘制垂直镜像:scale(-1,1)绘制水平镜像 自定义的坐标变换 transform() ...
随机推荐
- 多校 1010 Taotao Picks Apples(补题)
>>点击进入原题<< 思路:题解很有意思,适合线段树进阶 考虑每次修改不叠加,因此我们可以从如何对原序列进行预处理着手.通过观察可以发现,将原序列从任意位置断开,我们可以通过分 ...
- 一、ECharts简介
ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼容当前绝大部分浏览器(IE6/7/8/9/10/11 ...
- 前端面试题总结一(js变量和函数声明提前相关)
好久没有更新博客了,^_^写写博客吧!下面是我总结的一些面试题,希望对大家有所帮助 (1)题目如下: alert(a) var a=1 function a(){ alert(a) } 好多 ...
- HUST 1214 Cubic-free numbers II
Cubic-free numbers II Time Limit: 10000ms Memory Limit: 131072KB This problem will be judged on HUST ...
- noip模拟赛 whzzt-Conscience
分析:数据中并不存在无解的情况...... 每个摄像头都要覆盖尽可能多的点,按照y从小到大排序.对于每一列,只用判断第一个没有被观测到的就可以了,这个点必须要放摄像头,因为除了它自己没有其它的摄像头能 ...
- 轰炸II
题目背景 本题为轰炸数据加强版 题目描述 一个城市遭到了M次轰炸,每次都炸了一个每条边都与边界平行的矩形 在轰炸后,有N个关键点,指挥官想知道,它们有没有受到过轰炸,如果有,被炸了几次,最后一次是第几 ...
- nyoj_518_取球游戏_201404161738
取球游戏 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个 ...
- UVA_1575
https://vjudge.net/problem/UVA-1575 枚举答案(k)..对k质因数分解,质数的指数为cnt[i],若n==A(tot_cnt,tot_cnt) / A(cnt[i]& ...
- FreeMarker与Spring MVC 4集合的HelloWorld示例
0.整体的项目结构 1.引入POM <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...
- Hadoop2.0之YARN
YARN(Yet Another Resource Negotiator)是Hadoop2.0集群中负责资源管理和调度以及监控运行在它上面的各种应用,是hadoop2.0中的核心,它类似于一个分布式操 ...