说说 iOS safari在retina屏下显示图像的原理

我在简析HTML5canvas在retina屏(视网膜屏幕,如iphone4)设备上的优化一文中提到了一点关于safari和retina屏的问题.

不过那篇文章说的比较乱,而且举的例子有点复杂.

今天梳理了一下思路,重新来聊聊这个话题.

还是先引用前文的一段话:

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

ip4在进行这种放大时,并不是简单的将1*1像素变成2*2像素,而是会进行"复杂的放大算法",目的是得到更加平滑自然(类似抗锯齿)的图像.

虽然这种放大操作是native的,但还是会导致渲染图像时性能变得低下.

(这里所说的性能低下不是想当然的,是经过多人多次多种测试用例测试后得出的结果)

下面举个简单的例子.

我现在有一张图片,大小是120px*120px,在网页中这样显示:

<imgwidth="120"height="120"src="normal.jpg"/>

现在我们拿出iphone3和iphone4(这两个我都没有:'(),访问这个页面

会看到视觉上一样大小的两张图.

而不会因为ip4高分辨率,就看到很小的图.

之所以这样,就是因为ip4显示图像时,对图像做了放大处理.

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

ip4比ip3有更强大的硬件性能,但是就是因为这一放大,导致性能变低了,而且ip4的放大算法会让图片看起来有一点点模糊(要仔细看,做了抗锯齿/平滑处理).

那么我要怎样在ip4下看到和ip3下一样大小的图片,保证性能和效果呢?

答案就是:

1先准备一张大小*2的清晰大图(big.jpg,240*240),

2img标签这样写:

<imgwidth="120"height="120"src="big.jpg"/>

是的你没有看错,img的宽高依然不变.

此时这个img标签实际上显示的是一个"缩小的big.jpg".

但对于ip4而言,此时效果更好,性能更高.

因为ip4发现自己要显示的图像是一个被强制缩小50%的图像时,它不会去缩小,也不会去放大,而会以1:1像素比例直接绘制原图(big.jpg)

我这么说可能效果不明显,有ip3和ip4的朋友,可以访问下面的链接来看看效果

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

当然这么做也有缺点,就是需要更大的图片,耗用更多的带宽和内存.

不过带来的好处是效果更好速度更佳.

本文为了更便于理解,使用img做了例子,其实对于img而言,这种优化处理意义未必大,但是对于canvahtml5动画一类的应用则很有意义.

我的html5游戏引擎优化后在ip4下性能提升明显.

最终如何取舍看需求而定了.

相关推荐