Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
天我們將為大家介紹一個令網(wǎng)頁性能大幅提升的神奇技術(shù)——CSS硬件加速。隨著移動互聯(lián)網(wǎng)的蓬勃發(fā)展和網(wǎng)頁設(shè)計越發(fā)復(fù)雜,如何優(yōu)化網(wǎng)頁性能成為了前端開發(fā)者們亟待解決的問題。在這篇文章中,我們將深入了解CSS硬件加速的原理,并通過一個生動的案例來展示它如何幫助我們改善網(wǎng)頁的渲染性能。
一、什么是CSS硬件加速
在傳統(tǒng)的網(wǎng)頁渲染中,瀏覽器使用中央處理器(CPU)來處理CSS樣式和頁面渲染。然而,隨著網(wǎng)頁變得越來越復(fù)雜,例如包含大量動畫、過渡效果或復(fù)雜的變換,CPU可能會承擔(dān)較重的負擔(dān),導(dǎo)致頁面加載緩慢或卡頓。CSS硬件加速是一種解決方案,它充分利用了計算機的圖形處理單元(GPU)來加快CSS樣式的處理和渲染,從而提高頁面性能和流暢度。
1.1 CPU
CPU 即中央處理器。
CPU是計算機的大腦,它提供了一套指令集,我們寫的程序最終會通過 CPU 指令來控制的計算機的運行。它會對指令進行譯碼,然后通過邏輯電路執(zhí)行該指令。整個執(zhí)行的流程分為了多個階段,叫做流水線。指令流水線包括取指令、譯碼、執(zhí)行、取數(shù)、寫回五步,這是一個指令周期。CPU會不斷的執(zhí)行指令周期來完成各種任務(wù)。
1.2 GPU
GPU 即圖形處理器。
GPU,是Graphics ProcessingUnit的簡寫,是現(xiàn)代顯卡中非常重要的一個部分,其地位與CPU在主板上的地位一致,主要負責(zé)的任務(wù)是加速圖形處理速度。GPU是顯卡的“大腦”,它決定了該顯卡的檔次和大部分性能,同時也是2D顯示卡和3D顯示卡的區(qū)別依據(jù)。2D顯示芯片在處理3D圖像和特效時主要依賴CPU的處理能力,稱為“軟加速”。3D顯示芯片是將三維圖像和特效處理功能集中在顯示芯片內(nèi),也即所謂的“硬件加速”功能。
二、CSS硬件加速原理
CSS硬件加速的原理涉及到瀏覽器的渲染引擎、GPU以及優(yōu)化渲染的過程。
2.1 瀏覽器的渲染流程
一個完整的渲染步驟大致可總結(jié)為如下:
2.2 CSS硬件加速觸發(fā)
在傳統(tǒng)的渲染過程中,布局和繪制是由CPU來完成的,而在CSS硬件加速下,GPU參與了渲染的處理,從而提高了性能。
CSS 中的以下幾個屬性能觸發(fā)硬件加速:
1.transform屬性:該屬性用于應(yīng)用2D或3D變換效果,如旋轉(zhuǎn)、縮放、平移等。當(dāng)使用transform屬性時,瀏覽器會將變換任務(wù)交給GPU處理,從而實現(xiàn)硬件加速。
2.opacity屬性:該屬性用于設(shè)置元素的不透明度。雖然它主要用于控制透明度,但是一個不為1的值(例如0.99)也可以觸發(fā)硬件加速。
3.will-change屬性:will-change屬性用于提示瀏覽器一個元素將要發(fā)生的變化,以便瀏覽器在渲染過程中做出優(yōu)化。
一旦CSS硬件加速被觸發(fā),相關(guān)的渲染任務(wù)將被GPU處理。GPU在處理圖形和動畫方面通常比CPU更快和更高效。對于復(fù)雜的CSS動畫和變換,GPU可以并行處理多個任務(wù),從而提高性能和流暢度。
請注意,CSS硬件加速并不是適用于所有情況。雖然它在許多情況下可以帶來顯著的性能提升,但有時也可能導(dǎo)致額外的GPU資源占用,從而影響其他應(yīng)用程序的性能。因此,在使用CSS硬件加速時,我們應(yīng)該進行性能測試和優(yōu)化,確保在特定情況下確實能獲得性能的提升。
三、CSS硬件加速案例
現(xiàn)在,我們來看一個實際的案例,通過啟用CSS硬件加速來改善網(wǎng)頁性能。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
.app {
position: relative;
width: 400px;
height: 400px;
}
.box {
position: absolute;
left: 0;
top: 0;
width: 100px;
height: 100px;
background-color: yellowgreen;
}
.box-run1 {
-webkit-animation: run1 4s infinite;
animation: run1 4s infinite;
}
.box-run2 {
-webkit-animation: run2 4s infinite;
animation: run2 4s infinite;
}
@keyframes run1 {
0% {
top: 0;
left: 0;
}
25% {
top: 0;
left: 200px;
}
50% {
top: 200px;
left: 200px;
}
75% {
top: 200px;
left: 0;
}
}
@keyframes run2 {
0% {
transform: translate(0, 0);
}
25% {
transform: translate(200px, 0);
}
50% {
transform: translate(200px, 200px);
}
75% {
transform: translate(0, 200px);
}
}
</style>
</head>
<body>
<div class="app">
<div class="box"></div>
</div>
<button class="btn1">循環(huán)轉(zhuǎn)換</button>
<button class="btn2">硬件加速</button>
<script>
let box = document.querySelector(".box");
let btn1 = document.querySelector(".btn1");
let btn2 = document.querySelector(".btn2");
btn1.addEventListener("click", function (e) {
box.classList.remove("box-run2");
box.classList.add("box-run1");
});
btn2.addEventListener("click", function (e) {
box.classList.remove("box-run1");
box.classList.add("box-run2");
});
</script>
</body>
</html>
此時我們可以運行代碼,在頁面上可以看到,2個按鈕均能使box在app當(dāng)中循環(huán)移動。但對于這兩種方式的移動,他們的效率卻有著很大的差異。我們可以使用開發(fā)者工具里的Performance去查看。
當(dāng)我們點擊btn1時,此時box盒子通過定位的left和top進行循環(huán)移動時。
此時我們可以看到細節(jié)模塊的記錄詳情。
藍色(Loading):網(wǎng)絡(luò)通信和HTML解析
黃色(Scripting):Javascript執(zhí)行
紫色(Rendering):樣式計算和布局,即重排
綠色(Painting):重繪
灰色(Other):其他事件花費的時間
白色(Idle):空閑時間
細節(jié)模塊有4個面板,Summary面板每個事件都會有,其他三個只針對特定事件會有。
當(dāng)我們點擊btn2時,此時box盒子通過transform屬性進行css硬件加速后進行循環(huán)移動時。
通過對比我們不難發(fā)現(xiàn),當(dāng)啟用硬件加速時,方塊的變換會更加流暢,其樣式計算和布局、重繪的時間都會減少。因為GPU參與了渲染過程。
總結(jié)
CSS硬件加速是一個強大的前端技術(shù),可以顯著提高網(wǎng)頁的性能和流暢度。通過啟用硬件加速,我們可以將一些渲染任務(wù)交給GPU來處理,減輕CPU的負擔(dān),從而優(yōu)化網(wǎng)頁的渲染性能。然而,我們需要注意不要濫用硬件加速,避免觸發(fā)不必要的GPU渲染,以確保真正獲得性能提升。在日常的網(wǎng)頁開發(fā)中,我們可以靈活運用CSS硬件加速,為用戶帶來更好的瀏覽體驗。
o語言中文網(wǎng),致力于每日分享編碼、開源等知識,歡迎關(guān)注我,會有意想不到的收獲!
給定一個單鏈表L: L0 → L1 → … → Ln-1 → Ln,將其重排為L0 → Ln → L1 → Ln-1 → L2 → Ln-2→…。請勿更改節(jié)點中的值。
例子1:
給定1 -> 2 -> 3 -> 4,重排為1 -> 4 -> 2 -> 3;
例子2:
給定1 -> 2 -> 3 -> 4 -> 5,將其重排為1 -> 5 -> 2 -> 4 -> 3。
題目出處:
https://leetcode.com/problems/reorder-list/
2.1)從頭至尾遍歷原鏈表節(jié)點構(gòu)建一個雙向鏈表;
2.2)兩個指針分別從頭至尾、從尾至頭同時遍歷該雙向鏈表來建立所要求的順序關(guān)系,直至匯合即完成重排。重排過程如下圖所示。
https://github.com/olzhy/leetcode/blob/master/143_Reorder_List/test.go
原文:https://leileiluoluo.com/posts/leetcode-reorder-linked-list.html
本文作者:磊磊落落的博客,原創(chuàng)授權(quán)發(fā)布
.行內(nèi)元素/塊級元素 非替換元素/替換元素
2.img的title和alt屬性 (title是全局屬性)
3.meta標(biāo)簽
4.DOCTYPE標(biāo)簽 (標(biāo)準(zhǔn)模式、兼容模式)
5.script標(biāo)簽的defer和async
6.WC3盒模型和怪異和模型 (box-sizing)
7.水平垂直居中的方法
8.BFC (BFC是什么、觸發(fā)條件、特性及作用)
9.清除浮動的方法
10.position屬性
11.CSS隱藏元素的方式 (display:none和visibility:hidden的區(qū)別)
12.Flex布局
13.雙欄布局 三欄布局
14.重排和重繪
15.CSS選擇器 (類型、優(yōu)先級有那些)
16.CSS動畫 (關(guān)鍵幀動畫animation屬性、過渡動畫transition屬性)
17.CSS實現(xiàn)三角形
18.CSS Sprites
19.px rem em
20.偽類/偽元素
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。