最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

讓 Chrome 崩潰的一行 CSS 代碼

  發(fā)布時間:2018-10-11 09:16:33   作者:佚名   我要評論
一般的 CSS 代碼只會出現 UI 版式或者兼容性方面的小問題。但這里我們要分享一行有趣的 CSS,它可以直接讓你的 Chrome 頁面掛掉,具體內容詳情大家跟隨小編一起看看吧

一般的 CSS 代碼只會出現 UI 版式或者兼容性方面的小問題。但這里我們要分享一行有趣的 CSS,它可以直接讓你的 Chrome 頁面掛掉 :)

復現

  1. 在 Chrome 里打開一個稍復雜的頁面,比如知乎或者 掘金
  2. 打開開發(fā)者工具,為頁面 <body> 增加樣式 style: "width:1px; height:1px; transform:scale(10000)"
  3. 欣賞任務管理器里 Chrome 崩潰前的內存占用

其實這臺機器只有 8GB 內存,不過這不重要了。和讓 JS 崩潰的紅線容量 4GB 比起來,果然還是 CSS 更強大呢 :)

故事

這行代碼的發(fā)現,源自于我們的編輯器項目在實現畫布尺寸調節(jié)時的一個詭異現象:用戶調節(jié)畫布尺寸時, 只要新舊尺寸之比超過一定幅度,Chrome 就會卡死 。

雖然這個問題很難由普通用戶的操作路徑觸發(fā),不過它所導致的后果確實比較嚴重。排查時我們首先考慮了 JS 阻塞和 DOM 重繪過頻等方面的可能性,但它們都不是問題所在。一個突破點在于調試器 Rendering 工具中 FPS Meter 的輸出:


 

這里 GPU Memory 被占滿了。雖然這個提示信息現在看來很明顯是與硬件加速有關的,但在沒有相關經歷的情況下我們還是沒有確定它與具體代碼之間的關聯。直到我們偶然查看 Chrome 設計文檔中關于 Compositing 的介紹時,發(fā)現了一個行為:Blink 會將 DOM 節(jié)點映射到 LayoutObject 的渲染樹,這棵樹中的節(jié)點理論上每個都能具備到渲染后端的上下文,但為了節(jié)約資源 Chrome 會將它們做一些合并后再渲染。而這時存在 CSS 定位(如絕對定位與 transform)的元素是不能合并的,這會造成對顯存的額外開銷。

基于這個信息的提示,我們使用 Layout 工具來調試當時的頁面,果然找到了一個特殊的地方:


 

圖中最大的矩形 Layer 通過一般的 DOM 調試是無法看見的,因此我們推測它的過大尺寸所導致的 RAM 開銷是罪魁禍首?;谶@個信息,我們最后找到了一個寬高都很合理但 transform 的 scale 值可能在邏輯中被修改得很大的 DOM 節(jié)點,限制它的 scale 上限即可解決問題:我們不難發(fā)現 scale 的值和最終對應像素數量之間有著 O(N^2) 的關系,1 個像素只放大 100 倍也有 10000 個像素了。因此 scale 很大時對內存 / 顯存的過度使用也就是有可能的了(當然瀏覽器會做 Tiling 等工作,因此這不符合一般情況下的實際情形,Safari / Firefox 這時候也沒有出現問題)。最后給 Chrome 提了個 bug 見 #894115

總結

需要注意的是,因為缺乏對瀏覽器內核的深度了解,上面的調試思路很可能是不準確的。簡單的總結:

  • 硬件加速是有代價的,最好能知道代價在哪
  • 瀏覽器的文檔里藏著很多有意思的東西
  • 調試工具的一些冷門功能其實很強大,平時可以多試試

以上所述是小編給大家介紹的讓 Chrome 崩潰的一行 CSS 代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

相關文章

最新評論

湖口县| 江都市| 中西区| 梅河口市| 松阳县| 治多县| 丹江口市| 灯塔市| 全州县| 石首市| 堆龙德庆县| 阿巴嘎旗| 嘉鱼县| 财经| 宿迁市| 淄博市| 富顺县| 金塔县| 南木林县| 拜泉县| 鲜城| 阜新市| 精河县| 崇信县| 三亚市| 息烽县| 胶南市| 齐齐哈尔市| 龙南县| 侯马市| 札达县| 祁连县| 玉林市| 赤峰市| 榕江县| 北川| 三门峡市| 通化市| 墨江| 绍兴县| 同心县|