`

简析 HTML5 canvas在retina屏(视网膜屏幕,如iphone4)设备上的优化(更新原理)

阅读更多
随着iphone4 的推出, retina(视网膜)屏在移动设备中被越来越广泛的应用.

不过,虽然retina屏给画面的展现带来了前所未有的清晰平滑的效果,却给开发人员带来了一些小小的麻烦.

网上针对如何在 retina屏下设计软件的UI 有很多文章,在这里我不想重复这些内容, 而是想针对HTML5 canvas在retina屏上的应用说一说我的一点心得.


最近业余时间一直在利用HTML5技术开发游戏引擎.

一切进行的还算顺利, 但是当我在 iphone4上测试该引擎时, 发现其性能比在 itouch3上还要低,而且低很多. 
造成这一现象的主要原因就是 retina屏.

下面先简单说说 retina屏设备如何处理 canvas的.
(本文以iphone4 为例).

ip4的safari浏览器在展现canvas上的图像时, 为了得到和传统屏幕一样的视觉大小, 会将原始像素放大1倍.(retina屏幕的像素更小,可以理解为4个retina像素表示1个传统像素).

ip4在进行这种放大时,并不是简单的 将1*1像素 变成2*2像素, 而是会进行"复杂的放大算法", 目的是得到更加平滑自然(类似抗锯齿)的图像.
虽然这种放大操作是native的,但还是会导致渲染canvas时性能变得极其低下(可能还有其他原因).


==========================================


据我所知,目前在ip4的safari里,我们无法人为的控制这种放大操作(禁止放大,或者简化放大算法).

不过我们还是有一些技巧来对canvas进行一些优化, 从而提高它在retina屏幕上的性能.

假设我们要在ip 3GS上做如下操作:

1 加载一个 50*50 的图片.
2 创建一个 300*300 的 canvas.
3 将这个图片 绘制在 canvas的 ( 100 , 100 )坐标处.
(以上单位均为:像素)


那么在iphone4上,我们不做任何修改执行同样的代码, 会得到视觉效果几乎一样的结果.
但是实现的性能会很低.如果是做游戏或是动画,这个性能差距往往是我们难以接受的.

下面看一看在ip4下如何优化这一个操作:
1 加载一个 50*50 的图片.
2 将此图片放大1倍,变为 100*100 , 放大操作通过代码来实现,可采用"简单的1变4算法".
(以上两步也可以变为直接加载一个 已经制作好的 100*100的 大图片)

3 创建一个 600*600 的 canvas ( 即,原始的宽高都乘以 2 )
4 设置该canvas的 style.width=300  和style.height=300  (也就是说,style的大小仍为原始大小)
(注意: canvas的style.width/height 有别于div的,意义完全不同,具体的请自行google)

5 将放大的图片 绘制在 canvas的 ( 200 , 200 )坐标处.(即,原始的横纵坐标都乘以 2 )


通过这个方案实现的效果和 优化之前以及在ip3GS上的效果 几乎完全一样(肉眼难以察觉),
但是性能却比 优化前 提高近50%.

优化方案中的第4步最为关键, 也是性能之所以优化的关键所在.
其他几步的核心就是 "在2倍大的canvas上绘制2倍大的图片", 按理说应该性能更低才对.
但是由于 canvas的style大小只是 canvas的实际大小的一半, 一切就变得不同了.

当执行以下代码:
canvas.width=600;
canvas.height=600;
canvas.style.width="300px";
canvas.style.height="300px";

canvas的实际大小变为了300*300, 同时, canvas的坐标系发生了缩放,缩放比为 300/600;

也就是说 canvas上所有的点的大小和坐标都缩小了一半, 所以之前 "在2倍大的canvas上绘制2倍大的图片",缩小一半后(这个缩小的算法也是一个复杂的缩小算法).
先放大再缩小,于是最后相当于什么都没有变.

到这里也许有人会迷糊:  先放大,再缩小, 然后绘制在ip4的retina屏上.为什么比"直接绘制"性能高?按道理多了一步操作,应该更慢才对.

其实我也迷糊.

不过当我们了解了以上每一步的操作后, 不妨可以这样理解(纯属我个人不负责的猜想): 

优化前:
50*50像素 通过"复杂的放大算法"转变为 100*100 像素

优化后:
50*50像素 通过"简单的放大算法"变为100*100 像素,
100*100 像素 通过 "复杂的缩小算法"变为50*50 像素,
50*50像素 通过"复杂的放大算法"转变为 100*100 像素

"复杂的缩小算法" 和 "复杂的放大算法" 两者在ip4内部很可能是互为逆操作,于是相互抵消了.所以优化后就是:  50*50像素 通过"简单的放大算法"转变为 100*100 像素.

另一种解释,感觉比前一个靠谱(也是我自己分析的)
简单说来一句话: 浏览器发现要放大的对象本身已经是缩小的对象之后,不会做放大和缩小处理,而是直接输出原始大小. (在本例中,原始大小已经是大图了)




实际上也许不是根本这么回事,但是姑且这么理解吧,
我实在找不出更合理的解释了,我更没能力去研究ip4和IOS4底层的实现机制.
(如果你知道真实的原因一定要告诉我啊 谢谢了  )




下面是一个我写的一个更复杂的示例:

http://data.wiyun.com/finscn/retina/test-retina.html

有iphone4 或者是 itouch4 的朋友可以访问一下试一试,
看看选择优化前和优化后的FPS变化.
注1: 在非retina屏幕上测试没有效果;
注2: 该网页内容极其简单,绝对不会耗费多少您的网络流量,不过该服务器带宽和磁盘IO有限,所以打开速度可能很慢


目前根据网友的反馈:
优化前FPS为 32FPS左右, 优化后为 45左右.


最后再强调一下 : 本文提到的优化方案是正确的(至少在iphone4 和itouch4, iOS4.1 上是正确的),但是原理纯粹是我胡乱分析的(根据结果猜原因).
望知道真实原因的朋友指正. 谢谢了








3
8
分享到:
评论

相关推荐

    HTML5canvas自适应手机屏幕大小的一种解决方案.docx

    - **实现方法**: 使用双缓冲机制,即在另一个缓冲Canvas上绘图和绘制文字,最后根据`scaleH`进行缩放,并将缓冲Canvas的内容绘制到屏幕Canvas上。 ```javascript let canvasBuffer = document.createElement(...

    HTML5 Canvas全屏背景动画特效

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的视觉效果。在这个“HTML5 Canvas全屏背景动画特效”的主题中,我们将深入探讨如何利用Canvas来创建引人注目的全屏动画...

    html5 canvas制作LED屏幕故障显示动画特效

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式用户体验。LED屏幕故障显示动画特效是利用Canvas API实现的一种视觉效果,模拟了传统LED显示屏出现故障时的闪烁...

    Canvas雨滴落在玻璃屏幕模糊背景动画效果.zip

    在这个“Canvas雨滴落在玻璃屏幕模糊背景动画效果”项目中,Canvas结合了JavaScript和一个名为rainyday.js的插件,来创建出逼真的雨滴落在玻璃上的动态视觉效果。 首先,Canvas元素在HTML文档中被定义,然后通过...

    html5 canvas首屏自适应背景动画循环效果代码

    HTML5 Canvas 是一种在网页上绘制图形的API,它提供了丰富的功能,使开发者可以创建动态、交互式的视觉体验。在本示例中,"html5 canvas首屏自适应背景动画循环效果代码" 提到了几个关键点,我们将逐一深入探讨。 1...

    html5 canvas全屏酷炫星光闪烁3D视差背景动画特效

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上直接绘制图形,从而创建出丰富的动态视觉效果。在本项目"html5 canvas全屏酷炫星光闪烁3D视差背景动画特效"中,我们将深入探讨Canvas如何实现这样一个...

    html5 canvas模拟满天星空背景动画特效

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式用户体验。"html5 canvas模拟满天星空背景动画特效"是一个利用Canvas API实现的网页背景效果,旨在为用户提供一...

    基于html5 canvas实现的飘动的爱心心形动画特效

    在实际项目中,我们可能还需要考虑性能优化,比如避免不必要的重绘,使用离屏Canvas,或者在不被视口覆盖时暂停动画等策略。此外,对于不支持Canvas的浏览器,可以提供备选方案,比如使用SVG或者纯CSS动画。 这个...

    7款酷炫HTML5+Canvas全屏网页背景动画特效

    HTML5和Canvas技术是现代网页开发中的重要工具,它们为创建动态、交互式的网页内容提供了强大的支持。...同时,理解并掌握Canvas动画的基本原理和优化技巧,对于任何希望在网页设计领域有所建树的人来说都至关重要。

    HTML5 Canvas 游戏开发实战PDF+源码

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,为创建交互式游戏、动画和应用程序提供了可能。本书《HTML5 Canvas游戏开发实战》由张路斌(lufy_legend)编写,深入浅出地讲解了...

    html2canvas将HTML内容写入Canvas生成图片 uniapp

    HTML2canvas是一个JavaScript库,它的主要功能是在浏览器环境中将HTML内容转换为Canvas图像,从而能够进一步将这些图像保存为图片格式,如JPEG、PNG等。这个工具在Web开发中非常实用,尤其对于需要在客户端生成屏幕...

    HTML5 Canvas核心技术代码

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式用户体验。Canvas API提供了大量的方法和属性,使得JavaScript可以直接控制像素级别的图像操作。这个压缩包...

    HTML5 canvas仿屏保动态管道

    HTML5 canvas 是一种在网页上绘制图形的API,它允许开发者通过JavaScript动态创建和修改二维图形,从而实现丰富的视觉效果。在这个"HTML5 canvas仿屏保动态管道"项目中,我们利用canvas元素来模仿经典的Windows屏保...

    HTML5 canvas支持触摸屏的签名涂鸦插件

    在触摸屏设备普及的今天,HTML5 canvas也提供了对触摸事件的支持,使得在触屏上进行签名和涂鸦成为可能。本文将深入探讨如何使用HTML5 canvas创建一个支持触摸屏的签名涂鸦插件。 首先,我们需要了解canvas的基本...

    html2canvas 1.0.0-rc.5

    屏幕截图基于 DOM,因此可能不是 100% 准确到真实表示,因为它不会制作实际的屏幕截图,而是根据页面上可用的信息构建屏幕截图。 2.它只能正确渲染它理解的属性,这意味着有许多 CSS 属性不起作用; html2canvas官网...

    4.4 屏幕坐标和canvas坐标的转换|使用鼠标和canvas交互|canvas项目综合实战|Canvas图形、动画、游戏开发从入门到精通全系列课程

    4.4_屏幕坐标和canvas坐标的转换|使用鼠标和canvas交互|canvas项目综合实战|Canvas图形、动画、游戏开发

    7款HTML5 Canvas全屏背景动画特效.zip

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的视觉效果。这款“7款HTML5 Canvas全屏背景动画特效”集合了七种不同的Canvas动画,为网站提供引人入胜的全屏背景体验。...

    html5 canvas 小游戏

    HTML5 Canvas是一个强大的Web图形接口,它允许开发者在网页上绘制矢量图形和位图图像。这个"html5 canvas 小游戏"是一个基于Canvas的互动游戏,通过JavaScript编程语言实现。JavaScript是Web开发中用于创建动态和...

    HTML5 canvas实现的仿windows屏幕保护汽包背景动画特效源码.zip

    HTML5是现代网页开发的关键技术之一,其canvas元素被誉为“画布”,允许开发者在网页上进行动态图形绘制。本资源“HTML5 canvas实现的仿windows屏幕保护汽包背景动画特效源码.zip”提供了使用HTML5 canvas创建的一个...

    酷炫的html5 canvas全屏背景动画特效

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的视觉效果。在这个“酷炫的html5 canvas全屏背景动画特效”中,我们将探讨如何利用HTML5 Canvas API来创建引人注目的...

Global site tag (gtag.js) - Google Analytics