Chrome 图片解码与 Image Decoding Hint
suiw9 2024-11-05 12:36 29 浏览 0 评论
我在之前的一篇文章Chrome 图片解码与 Image.decode API,说明了为什么图片解码可能会导致非合成器动画的阻塞和如何使用 Image.decode API 来避免动画的阻塞。不过虽然 Image.decode API 给页端提供了更灵活的控制图片解码时机的能力,但是使用起来较为复杂,也容易误用,而 Image Decoding Hint 属性则更简单,容易使用,同时也满足了大部分场景下的性能需求。
Chrome 从 65 版本开始支持 Image Decoding Hint,其它浏览器 Firefox,Edge 也是支持的,Safari 年初时的状态是开发中,不清楚现在是否已经支持。
以下描述来自于 HTML 规范文档:
In order to aid the user agent in deciding whether to perform synchronous or asynchronous decode, the decoding attribute can be set on img elements. The possible values of of the decoding attribute are the following image decoding hint keywords:
sync: Indicates a preference to decode this image synchronously for atomic presentation with other content.
async: Indicates a preference to decode this image asynchronously to avoid delaying presentation of other content.
auto: Indicates no preference in decoding mode (the default).
直接翻译过来就是 —— 页端可以通过 Image.decoding 属性来控制图片解码的行为,sync 会强制同步解码,图片会和其它内容同时显示,async 则强制异步解码,可能会造成图片和其它内容不同时显示,默认值 auto 则让浏览器自己来决定。
上述描述的“和其它内容同时显示或者不同时显示”究竟是什么意思呢?这个跟浏览器合成器的光栅化策略有关,当图片元素和其它元素同时进入当前网页的可见区域,或者已经在可见区域内并且内容同时发生变化,合成器需要安排这些元素所在的图层光栅化,并且在所有发生变更的图层都光栅化完毕之后再显示完整的一帧(请参考浏览器渲染流水线解析与网页动画性能优化对非合成器动画渲染流水线的解释)。
在不支持 Image Decoding Hint 之前,Chrome 会强制图片先解码,然后再光栅化,这样保证了包括图片在内的所有同时变更的元素都是同时显示的,也就是所谓的 atomic presentation。而在支持 Image Decoding Hint 之后,Chrome 的光栅化策略就会变为:
- 如果 Decoding Hint 是 sync,则跟之前是一样的;
- 如果 Decoding Hint 是 async,则图片不会在光栅化之前解码,而是放到另外一个后台 Worker 线程解码,并在图片解码完成后重新光栅化图片所在区域并重绘窗口。这样造成的结果就是在图片所在区域光栅化的时候可能因为图片还未完成解码而无法绘制图片导致空白,跟其它非图片元素的显示不完全同步,也就是说如果有图片元素和非图片元素同时发生变更,非图片元素可能会提前显示;
- 如果 Decoding Hint 是 auto,目前 Chrome 的处理是等同于 sync;
即使设置成 async,Chrome 还是会根据一些条件来决定最后的结果是 sync 还是 async,如果运行设备,网页和图片满足下面条件,最后还是会被强制为 sync:
- 如果图片还未下载完毕;
- 或者是 gif 这样的动图;
- 或者在 Chrome for Android 或者 Android WebView 上设备不支持 GPU 光栅化,或者网页无法开启 GPU 光栅化;
- 或者在 Chrome for Android 或者 Android WebView 上解码后占用内存小于 512k(相当于分辨率小于 512 x 256),桌面版本为 1024k;
- 或者解码后占用内存大于合成器的解码缓存池的上限(也就是说小图片和超大图片,都强制为同步解码,无论是什么设置);
在 AMP 里面的 amp-img 自定义元素,AMP-runtime 在生成对应的 img 元素时,会指定 decoding 属性为 async,在现实中,大部分情况下指定为 async 应该都是合理的。
Chrome 图片解码与 Image.decode API之前演示过的一个例程,如果我们修改会导致动画阻塞的 sync.html 的代码如下:
function prepareImage() { var img = new Image(); img.src = "nebula.jpg"; img.decoding = "async"; img.onload = function() { document.body.appendChild(img); }; }
上述代码增加了一句 img.decoding = "async";,其运行的结果跟另外一个使用 Image.decode API 的 async.html 就基本一样了,时针的动画不会被阻塞,并且在实际的应用中要比使用 Image.decode API 简单的多。(上面的代码 async 不会在 Chrome for Android 或者 Android WebView 上生效,是因为网页无法开启 GPU 光栅化)
作者:rogeryi
相关推荐
- 5款Syslog集中系统日志常用工具对比推荐
-
一、为何要集中管理Syslog?Syslog由Linux/Unix系统及其他网络设备生成,广泛分布于整个网络。因其包含关键信息,可用于识别网络中的恶意活动,所以必须对其进行持续监控。将Sys...
- 跨平台、多数据库支持的开源数据库管理工具——DBeaver
-
简介今天给大家推荐一个开源的数据库管理工具——DBeaver。它支持多种数据库系统,包括Mysql、Oracle、PostgreSQL、SLQLite、SQLServer等。DBeaver的界面友好...
- 强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)
-
NavicatPremium,一款集数据迁移、数据库管理、SQL/查询编辑、智能设计、高效协作于一体的全能数据库开发工具。无论你是MySQL、MariaDB、MongoDB、SQLServer、O...
- 3 年 Java 程序员还玩不转 MongoDB,网友:失望
-
一、什么场景使用MongoDB?...
- 拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南
-
作为一名在NoSQL丛林中披荆斩棘的数据猎人,没有比GUI工具更称手的瑞士军刀了。本文将带你围观五款主流MongoDB管理神器的特性与暗坑,附赠精准到扎心的吐槽指南一、MongoDBCompass:...
- mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
-
前言最近在做neo4j相关的同步处理,因为产线的可视化工具短暂不可用,发现写起来各种脚本非常麻烦。...
- solidworks使用心得,纯干货!建议大家收藏
-
SolidWorks常见问题...
- 统一规约-关乎数字化的真正实现(规范统一性)
-
尽管数字化转型的浪潮如此深入人心,但是,对于OPCUA和TSN的了解却又甚少,这难免让人质疑其可实现性,因为,如果缺乏统一的语义互操作规范,以及更为具有广泛适用的网络与通信,则数字化实际上几乎难以具...
- Elasticsearch节点角色配置详解(Node)
-
本篇文章将介绍如下内容:节点角色简介...
- 产前母婴用品分享 篇一:我的母婴购物清单及单品推荐
-
作者:DaisyH8746在张大妈上已经混迹很久了,有事没事看看“什么值得买”已渐渐成了一种生活习惯,然而却从来没有想过自己要写篇文章发布上来,直到由于我产前功课做得“太过认真”(认真到都有点过了,...
- 比任何人都光彩照人的假期!水润、紧致的肌肤护理程序
-
图片来源:谜尚愉快的假期临近了。身心振奋的休假季节。但是不能因为这种心情而失去珍贵的东西,那就是皮肤健康。炙热的阳光和强烈的紫外线是使我们皮肤老化的主犯。因此,如果怀着快乐的心情对皮肤置之不理,就会使...
- Arm发布Armv9边缘AI计算平台,支持运行超10亿参数端侧AI模型
-
中关村在线2月27日消息,Arm正式发布Armv9边缘人工智能(AI)计算平台。据悉,该平台以全新的ArmCortex-A320CPU和领先的边缘AI加速器ArmEthos-U85NPU为核心...
- 柔性——面向大规模定制生产的数字化实现的基本特征
-
大规模定制生产模式的核心是柔性,尤其是体现在其对定制的要求方面。既然是定制,并且是大规模的定制,对于制造系统的柔性以及借助于数字化手段实现的柔性,就提出了更高的要求。面向大规模定制生产的数字化业务管控...
- 创建PLC内部标准——企业前进的道路
-
作者:FrankBurger...
- 标准化编程之 ----------- 西门子LPMLV30测试总结
-
PackML乃是由OMAC开发且被ISA所采用的自动化标准TR88.00.02,能够更为便捷地传输与检索一致的机器数据。PackML的主要宗旨在于于整个工厂车间倡导通用的“外观和感觉”,...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
tinymce 号称富文本编辑器世界第一,大家同意么?
-
- 最近发表
-
- 5款Syslog集中系统日志常用工具对比推荐
- 跨平台、多数据库支持的开源数据库管理工具——DBeaver
- 强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)
- 3 年 Java 程序员还玩不转 MongoDB,网友:失望
- 拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南
- mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
- solidworks使用心得,纯干货!建议大家收藏
- 统一规约-关乎数字化的真正实现(规范统一性)
- Elasticsearch节点角色配置详解(Node)
- 产前母婴用品分享 篇一:我的母婴购物清单及单品推荐
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)