`

聊聊 iOS 5 和 iOS 6 在HTML5 canvas渲染上的差异

 
阅读更多
我录制了一段iphone4s 下 ios 5 和 ios 6 的 canvas性能对比视频http://t.cn/zlvnKZk 通过这个视频 我们可以发现很多有趣的事情. 简单来说iOS 6 的特点就是 : 以退为进, 为了更好的体验,而减速 !!!! 未来 A6芯片+ iOS6 下的HTML5体验一定会很赞!

视频地址:  http://v.youku.com/v_show/id_XNDQ5OTY1ODk2.html

javaeye怎么不能潜入flash视频了?



下面说说我的看法.


视频中白色的是iOS 5 , 黑色的是 iOS 6 gm版(相当于正式版).
首先对这个视频里的测试页面做一下说明.
测试页面地址 :  http://tryhtml5.sinaapp.com/op/logo.html
测试用例的特性:
基于canvas, 画面背景是一张彩虹色的大图,
前景是 180个(6种)logo图片,图片大小在500*500左右,渲染时, 缩小+移动+旋转

logo在移动时采用的是 固定步长. 也就是每次loop时,logo移动的像素数量是固定的,与每次loop的间隔时间无关.(这点很重要)

在视频中,我们可以发现如下特点:

iOS 5 里 logo移动的快, 但是不顺畅, 一跳一跳 一卡一卡的.
iOS 6 里的则相反, logo移动的速度相对慢一些, 但是更顺滑.

logo移动快慢大家可以通过计时(某一行logo移动一个来回需要的时间),或者是对比着看,同一行logo, 在iOS 5上会逐渐拉开iOS 6上的logo.

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

在谈论iOS 6带来的这种"改变"的之前, 先来说一说在canvas渲染时, 整个浏览器的一个内部流程.

实现一个canvas动画在完美情况下( 60FPS ), 一秒钟内, 浏览器是做了如下事情

1 运行js代码,更新canvas的imageData数据
2 根据canvas里最新的imageData去渲染画面
3 1到2重复60次

完美情况下 上面的工作可以顺利的进行. 浏览器的js线程和ui渲染线程是互斥的,同一时刻只能做一件事情.
那么当渲染画面成为瓶颈的时候,一切就不是如此了.


一种处理方案是:等待每一次渲染的完成 再进行下一次工作.
这样在一秒内, js执行的次数 == 渲染的次数 < 60

另一种方案是:系统有选择的放弃掉【若干渲染】, 从而【保证js】的执行次数受到尽可能小的影响.
那么在一秒内, 渲染的次数 < js执行的次数 < 60

通常情况下 渲染性能无论多高,都会低于js执行的性能的, 所以当渲染跟不上计算时,通常会选择第二种方案.

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

下面 我们来根据视频猜测一下---- 真的只是猜, 真实原因只有safari工程师自己出来说才行,否则我只能猜, 我知道这样是不严谨的, 根据现象猜原因是错误的, 但是, 对不起, 就让我错一次吧。


第二种方案中, 最终效果的好坏,则取决于放弃【若干渲染】, 里的若干到底是多少, 以及【保证js】运行 要保证到什么程度, 系统需要在这两方面做出权衡。

但是一个简单的原则就是 : 渲染能力越低,需要放弃的渲染越多, 渲染能力越高,需要放弃的越少。


通过视频我们可以看出,
iOS5 里为了保证js的运行, 放弃掉了很多渲染, 但是js执行的次数几乎没有受到影响。
而iOS 6则大大减少了放弃掉的渲染(顺滑了很多), 而同时,js的运行只受到了微小的影响(但还是受到了一些影响).

同时, 提高渲染速度,适当降低js权重,这也使得用js记录FPS的方式比以前准确了很多.


但综合来看, iOS6的调整对整体的体验带来了巨大的提升, 同时iOS 6能够做出这种调整,很可能是因为渲染能力的提升使得它可以勇敢的选择放弃更少的渲染.
(如果iOS5 里采用iOS6的策略,结果可能是双输:js次数得不到保证,渲染也得不到什么提升)




另, 有朋友说 iOS 5里丢帧是bug (因为android里面有这个bug) ,但是我不同意这种观点, 因为了解iOS 5的朋友应该清楚, iOS 5的canvas里已经引入了硬件加速, 它的canvas性能和表现力 在当时已经是逆天的了. 这么优秀的平台不太可能有这么低级的bug. 而且,如果是bug,它出现的频率和严重性也不应该有如此严重的人工干预的痕迹啊.
换句话说: "渲染压力不大时,完美渲染,  渲染压力加大时,放弃掉一些渲染以保证程序的运行" 这个怎么看都像是策略而不是bug啊.



===========
本文很多观点基于猜测, 欢迎大家来拍砖!




0
0
分享到:
评论

相关推荐

    用HTML5开发ios应用

    1. **跨平台兼容性**:HTML5应用基于Web技术,可以在不同的设备和操作系统上运行,包括iOS、Android和Windows Phone等。 2. **较低的学习成本**:相比于学习Objective-C或Swift,HTML、CSS和JavaScript是许多开发者...

    html5IOS开发

    2. canvas绘图:HTML5的canvas元素提供了在网页上动态绘制图形的能力,开发者可以创建各种2D游戏、图表和动画,为iOS应用增添互动性。 3. 视频和音频:HTML5支持原生的video和audio元素,使得在iOS设备上播放多媒体...

    详解Html5 Canvas画线有毛边解决方法

    Html5 Canvas画线有毛边是一个在Web前端开发中常见的问题,特别是在使用Canvas 2D渲染图形时。这个问题主要是由于Canvas中坐标点与像素点之间的对齐问题造成的。下面我们将详细探讨这个问题及解决方案。 **Canvas...

    HTML 5 Canvas基础教程 源码+PDF

    《HTML 5 Canvas基础教程》从HTML5和JavaScript(以及jQuery)的基础知识讲起,全面介绍了HTML5Canvas的各种特性,包括渲染上下文、坐标系统、绘制图形、保存和恢复画布状态,以及变形、合成、处理图像和视频等,让...

    html5 canvas 图片压缩

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图像处理,包括绘制、修改和操作图像。在HTML5 Canvas中,我们可以通过JavaScript API实现图片的压缩功能,这对于优化网页性能,尤其是处理...

    html2canvas-rc4.js和html2canvas.min.js

    在iOS 13.4和13.6中可能存在与HTML2canvas交互的某些Webkit渲染引擎或JavaScript引擎的bug,导致无法正常工作。为了解决这个问题,开发者可能需要升级到HTML2canvas的特定修复版本,如rc4,或者寻找替代方案。 在...

    HTML5Canvas基础教程

    资源名称:HTML5 Canvas基础教程内容简介:《HTML5 Canvas基础教程》从HTML5和Javascript(以及jQuery)的基础知识讲起,全面介绍了HTML5 Canvas的各种特性,包括渲染上下文、坐标系统、绘制图形、保存和恢复...

    html5canvas播放视频

    这涉及到HTML5的Media API和Canvas API的结合使用,使得视频内容能够在Canvas元素上呈现。 首先,HTML5的`&lt;video&gt;`标签引入了在网页上嵌入视频的能力,它提供了控制视频播放、暂停、音量调整等功能。例如,创建一个...

    HTML5 CanvasAPI

    使用Canvas API 编程时,需要获取Canvas的上下文(Context),在此上下文中执行绘图命令,并将结果渲染到Canvas元素中。这个过程类似于数据库事务,开发者首先开始一个事务,然后执行一系列操作,最后提交事务。 ...

    html2Canvas:解决html2Canvas在IOS13.4中失效问题

    解决html2Canvas在ios13.4中失效问题 // 引入 import html2canvas from "../../lib/html2canvas"; // 使用, 全局window对象加入html2canvas,如果没有window就调用原来的,所以需要做判断 (window.html2canvas || ...

    html2canvas(兼容截图svg元素)

    `canvg`是一个专门用来在Canvas上渲染SVG的库,它能够解析SVG文档并将其绘制到Canvas元素上。当`html2canvas`遇到SVG元素时,通过先用`canvg`将SVG渲染到Canvas,然后再让`html2canvas`处理,可以有效地解决SVG截图...

    HTML5 Canvas核心技术代码

    - 避免频繁的DOM操作,尽可能在Canvas上进行计算和渲染。 这个代码压缩包可能包含上述各种功能的实例代码,你可以通过学习和运行这些代码来加深对HTML5 Canvas的理解,并应用于实际项目中。通过实践,你可以掌握...

    html2canvas 1.0.0-rc.5

    1.该脚本允许您直接在用户浏览器上对网页或其部分进行“截图”。屏幕截图基于 DOM,因此可能不是 100% 准确到真实表示,因为它不会制作实际的屏幕截图,而是根据页面上可用的信息构建屏幕截图。 2.它只能正确渲染它...

    基于html2canvas将当前页面保存为图片Demo

    基于这个库,我们可以实现用户在网页上操作后,将整个页面保存为一张图片,为用户提供一种便捷的保存和分享方式。 在"基于html2canvas将当前页面保存为图片Demo"的项目中,你将找到html2canvas的插件脚本和一个简单...

    html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片

    9. taintTest(布尔类型,默认为false):在渲染前测试图片是否会对Canvas产生污染。 10. useCORS(布尔类型,默认为false):是否尝试以CORS方式加载图片,如果失败则回退至代理。 使用html2canvas时,可以按照...

    HTML5 Canvas核心技术源码技术代码

    HTML5 Canvas核心技术源码技术代码、图形、动画与游戏开发。 Canvas开发、入门学习Canvas技术代码。 HTML5 Canvas核心技术源码技术代码、图形、动画与游戏开发。 Canvas开发、入门学习Canvas技术代码。 HTML5 Canvas...

    html5 canvas.rar

    总结起来,"html5 canvas.rar"提供了一个简单的HTML5 Canvas示例,展示了如何在网页上使用Canvas进行图形绘制和图像处理。通过学习和分析这个例子,开发者可以深入理解Canvas API,提升在Web开发中的图形处理能力。...

    vnode2canvas基于Vue插件将虚拟DOM渲染到canvas中

    在一些情况下,我们可能希望将这些虚拟DOM节点直接渲染到canvas上,例如在制作交互式图表或者游戏时,canvas提供了更直接的像素操作能力。 "vnode2canvas"插件实现了这个功能,它提供了一个方法来将Vue组件或VNode...

Global site tag (gtag.js) - Google Analytics