你必须知道的10个提高Canvas性能技巧
你还在抱怨自己写的canvas demo徘徊在10帧以下吗?你还在烦恼打开自己写的应用就听见CUP风扇转吗?你正在写一个javascript Canvas库吗?那么下面九点就是你必须知道的!
一.预渲染
错误代码:
- var canvas = document.getElementById("myCanvas");
- var context = this.canvas.getContext('2d');
- var drawAsync = eval(Jscex.compile("async", function () {
- while (true) {
- drawMario(context);
- $await(Jscex.Async.sleep(1000));
- }
- }))
- drawAsync().start();
正确代码:
- var canvas = document.getElementById("myCanvas");
- var context = this.canvas.getContext('2d');
- var m_canvas = document.createElement('canvas');
- m_canvas.width = 64;
- m_canvas.height = 64;
- var m_context = m_canvas.getContext('2d');
- drawMario(m_context);
- var drawAsync = eval(Jscex.compile("async", function () {
- while (true) {
- context.drawImage(m_canvas, 0, 0);
- $await(Jscex.Async.sleep(1000));
- }
- }))
- drawAsync().start();
这里m_canvas的宽度和高度控制得越小越好。
二.尽量少调用canvasAPI
错误代码:
- for (var i = 0; i < points.length - 1; i++) {
- var p1 = points[i];
- var p2 = points[i + 1];
- context.beginPath();
- context.moveTo(p1.x, p1.y);
- context.lineTo(p2.x, p2.y);
- context.stroke();
- }
正确代码:
- context.beginPath();
- for (var i = 0; i < points.length - 1; i++) {
- var p1 = points[i];
- var p2 = points[i + 1];
- context.moveTo(p1.x, p1.y);
- context.lineTo(p2.x, p2.y);
- }
- context.stroke();
三.尽量少改变CANVAS状态
错误代码:
- for (var i = 0; i < STRIPES; i++) {
- context.fillStyle = (i % 2 ? COLOR1 : COLOR2);
- context.fillRect(i * GAP, 0, GAP, 480);
- }
正确代码:
- context.fillStyle = COLOR1;
- for (var i = 0; i < STRIPES / 2; i++) {
- context.fillRect((i * 2) * GAP, 0, GAP, 480);
- }
- context.fillStyle = COLOR2;
- for (var i = 0; i < STRIPES / 2; i++) {
- context.fillRect((i * 2 + 1) * GAP, 0, GAP, 480);
- }
四.重新渲染的范围尽量小
错误代码:
- context.fillRect(0, 0, canvas.width, canvas.height);
正确代码:
- context.fillRect(20, 20, 100, 100);
五.复杂场景使用多层画布
- <canvas width="600" height="400" style="position: absolute; z-index: 0">
- </canvas>
- <canvas width="600" height="400" style="position: absolute; z-index: 1">
- </canvas>
六.不要使用阴影
- context.shadowOffsetX = 5;
- context.shadowOffsetY = 5;
- context.shadowBlur = 4;
- context.shadowColor = 'rgba(255, 0, 0, 0.5)';
- context.fillRect(20, 20, 150, 100);
七.清除画布
详细性能差别:
http://simonsarris.com/blog/346-how-you-clear-your-canvas-matters
一般情况下:clearRect的性能优于fillRect优于canvas.width = canvas.width;
八.像素级别操作尽量用整数
几种取整数的方法:
- rounded = (0.5 + somenum) | 0;
- rounded = ~ ~(0.5 + somenum);
- rounded = (0.5 + somenum) << 0;
九.使用requestAnimationFrame制作游戏或动画
- (function () {
- var lastTime = 0;
- var vendors = ['ms', 'moz', 'webkit', 'o'];
- for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
- window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
- window.cancelAnimationFrame =
- window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
- }
- if (!window.requestAnimationFrame)
- window.requestAnimationFrame = function (callback, element) {
- var currTime = new Date().getTime();
- var timeToCall = Math.max(0, 16 - (currTime - lastTime));
- var id = window.setTimeout(function () { callback(currTime + timeToCall); },
- timeToCall);
- lastTime = currTime + timeToCall;
- return id;
- };
- if (!window.cancelAnimationFrame)
- window.cancelAnimationFrame = function (id) {
- clearTimeout(id);
- };
- } ());
十.其他
与渲染无关的计算交给worker
复杂的计算交给引擎(自己写,或者用开源的),比如3D、物理
缓存load好的图片,canvas上画canvas,而不是画image
你必须知道的10个提高Canvas性能技巧的更多相关文章
- 前端设计师必须知道的10个重要的CSS技巧
对于一个初入门的前端设计师,在设计修改网站前端的时候,我们需要编写一些CSS.JS的内容达到界面效果.今天分享10个对于前端设计师来说重要的CSS技巧,这也是我在给许多客户做网站的过程当中总结出来的. ...
- 你必须知道的10个Python第三库
1. BeautifulSoup Beautiful Soup是一个可以从HTML,XML进行提取文件的Python库,日常我们使用爬虫进行数据抓取回来之后,往往需要进行数据解析. 使用它能让你开心愉 ...
- 比较TFS与SVN,你必须知道的10点区别
相比SVN,对于TFS的优点我有以下几点看法,供大家参考: 1. 总体比较: TFS是一个应用软件生命周期管理(ALM)软件,是一个软件研发平台产品,其功能覆盖了软件研发过程中的所有环节(包括源代 ...
- Web开发者必须知道的10个jQuery代码片段
在过去的几年中,jQuery一直是使用最为广泛的JavaScript脚本库.今天我们将为各位Web开发者提供10个最实用的jQuery代码片段,有需要的开发者可以保存起来. 1.检测Internet ...
- Java程序员必须知道的10个调试技巧
调试可以帮助识别和解决应用程序缺陷,在本文中,将使用大家常用的的开发工具Eclipse来调试Java应用程序. 但这里介绍的调试方法基本都是通用的,也适用于NetBeans IDE,我们会把重点放在运 ...
- 关于HTML5你必须知道的28个新特性,新技巧以及新技术
1. 新的Doctype 尽管使用<!DOCTYPE html>,即使浏览器不懂这句话也会按照标准模式去渲染 2. Figure元素 用<figure>和<figcapt ...
- 28个你必须知道的HTML5的新特性,技巧以及技术
原文地址:http://adamlu.com/?p=584#header 总结一下: 1. 新的Doctype 尽管使用<!DOCTYPE html>,即使浏览器不懂这句话也会按照标准模式 ...
- Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor
Webservice WCF WebApi 注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...
- C#刨根究底:《你必须知道的.NET》读书笔记系列
一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...
随机推荐
- tornado 添加请求头进行允许跨域
什么是跨域? 这个例子是csdn找的, 声明下哈 什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相同, ...
- 第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中
第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详 ...
- SpringMVC系列(十四)Spring MVC的运行流程
Spring MVC的运行流程图: 1.首先看能不能发送请求到Spring MVC的DispatcherServlet的url-pattern2.如果能发送请求,就看在Spring MVC中是否存在对 ...
- Java如何停止线程?
在Java编程中,如何停止线程? 以下示例演示了如何通过创建一个用户定义的方法run()方法和Timer类来停止线程. package com.yiibai; import java.util.Tim ...
- Java如何显示不同格式的日期?
在Java中,如何以不同的格式来显示日期? 此示例使用DateFormatSymbols().DateFormatSymbols类的getWeekdays()方法来显示时间的格式. package c ...
- Unity 基础-------------------------关于Anchor锚点的理解
Unity进阶技巧 - RectTransform详解 Zui 关注 2016.02.17 01:27 字数 1704 阅读 22157评论 13喜欢 57赞赏 2 RectTransform属性一览 ...
- NPOI 2.1.1 系列(2) 使用NPOI读取List或者datatable数据生成 Excel文档 ;Npoi生成 xlsx 2007以上文档
结合上一篇文章 NPOI 2.1.1 系列(1) 使用NPOI读取 Excel文档 ;NpoiExcelHelper 导入导出 2003格式 2007格式的 Excel; Npoi 导出 xlsx ...
- java mysql 链接高版本出现SSL验证
key1: String url="jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8 ...
- Mac OS X 下安装MySQL 5.7
下载安装包 官网下载安装包 选择相应的版本和格式,有 .dmg 和压缩包两种. 这里选择简单直接的 .dmg安装包,下载的时候可以将下载地址直接贴到迅雷,速度比较快. 安装 安装很简单,直接双击下好的 ...
- 将Unity导出的Eclipse工程转换为AndroidStudio工程
步骤:1)将unity项目导出到文件夹: 转换到安卓平台,这里只勾选google android project.然后导出到自己新建的文件夹. 2)打开导出的文件夹,看到如下内容.这是unity5.x ...