【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() ...
随机推荐
- python面试题之如何在Python中创建自己的包
Python中创建包是比较方便的,只需要在当前目录建立一个文件夹, 文件夹中包含一个__init__.py文件和若干个模块文件, 其中__init__.py可以是一个空文件,但还是建议将包中所有需要导 ...
- Spring核心技术(四)——Spring的依赖及其注入(续二)
前面两篇文章描述了IoC容器中依赖的概念,包括依赖注入以及注入细节配置.本文将继续描述玩全部的依赖信息. 使用 depends-on 如果一个Bean是另一个Bean的依赖的话,通常来说这个Bean也 ...
- Spring使用DriverManagerDataSource和C3P0分别配置MySql6.0.6数据源
首先,看一下项目路径 先说spring配置文件吧,这个比较重要 <?xml version="1.0" encoding="UTF-8"?> < ...
- 【Lqb T336】Cowboys
[链接] 我是链接,点我呀:) [题意] 出现AB就要交换一下 给你结果序列 问你原序列有多少种可能 首尾可以交换. [题解] 设 dp[i][0]表示i和i-1不交换,达到前i个字符序列的状态的方案 ...
- Leetcode 89.格雷编码
格雷编码 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 示例 1: 输入: 2 ...
- 分块试水--CODEVS4927 线段树练习5
模板 #include<stdio.h> #include<algorithm> #include<string.h> #include<stdlib.h&g ...
- Bellman_ford 算法 Currency Exchange POJ1860
Bellman_ford算法用于寻找正环或者负环! 算法导论: 24.1 The Bellman-Ford algorithm The Bellman-Ford algorithm solves th ...
- [bzoj3809]Gty的二逼妹子序列_莫队_分块
Gty的二逼妹子序列 bzoj-3809 题目大意:给定一个n个正整数的序列,m次询问.每次询问一个区间$l_i$到$r_i$中,权值在$a_i$到$b_i$之间的数有多少个. 注释:$1\le n\ ...
- JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
转载请注明出处:http://blog.csdn.net/xyang81/article/details/42047899 当我们在调用一个Java native方法的时候.方法中的參数是怎样传递给C ...
- priority_queue实现
#include <algorithm> using namespace std; /* priority_queue只允许在底端加入元素,并从顶端取出元素, 其内部元素不是依照被推入的次 ...