文章編號(hào):11823時(shí)間:2024-10-01人氣:
光柵化是將矢量圖形或文本轉(zhuǎn)換為像素陣列的過程。像素陣列是一組有顏色值的點(diǎn),共同形成圖像。
光柵化流程分為以下步驟:
采樣是光柵化過程的關(guān)鍵步驟。它決定了輸出圖像的分辨率和質(zhì)量。
有兩種主要的采樣技術(shù):
非均勻采樣通常用于提高圖像質(zhì)量,特別是對(duì)于包含細(xì)微細(xì)節(jié)或高頻成分的圖像。
量化是將采樣得到的連續(xù)顏色值近似為一系列有限的離散顏色值的過程。
量化會(huì)導(dǎo)致精度損失,因?yàn)樵紙D像中一些細(xì)微的顏色差別可能會(huì)丟失。
有兩種主要的量化技術(shù):
簡(jiǎn)化渲染過程的軟件正在將模型轉(zhuǎn)換為計(jì)算機(jī)內(nèi)的 2D 或 3D 圖片。 渲染引擎通過處理不同的數(shù)據(jù)(例如紋理、顏色或其他一些專門特征)來創(chuàng)建這些圖像。 此外,您在模擬、動(dòng)畫或視頻游戲中看到的所有內(nèi)容都是這些圖像的混搭。 采用光柵化的實(shí)時(shí)渲染引擎和使用“光線追蹤”概念的生產(chǎn)質(zhì)量渲染引擎是兩種類型的3D 渲染引擎。 顧名思義,光線追蹤會(huì)跟蹤光線從模型反射并返回虛擬相機(jī)的情況。 另一方面,光柵化是將矢量圖形轉(zhuǎn)換為光柵圖像的快速過程。 光柵圖片只不過是作為圖像出現(xiàn)在屏幕上的離散像素的集合。 有哪些可以簡(jiǎn)化渲染過程的最佳軟件?Qlone、Shapr3D、Onshape、Prisma3D、Sculptura、Putty3D和渲云渲染插件。 Qlone是一款流行的 3D 掃描程序,不需要激光雷達(dá)即可運(yùn)行。 即使您沒有配備激光雷達(dá)傳感器的最新 iPad 或 iPhone,該程序也可讓您在3D 掃描過程中實(shí)時(shí)記錄深度信息。 掃描3D 模型后,您可以對(duì)其進(jìn)行編輯、渲染并以標(biāo)準(zhǔn) 3D 格式導(dǎo)出。 企業(yè)和個(gè)人使用該軟件生成現(xiàn)實(shí)世界事物的逼真 3D 表示。 Qlone 還提供獨(dú)一無二的快速入門指南,解釋如何將 3D 模型納入您的網(wǎng)站并提高整體參與度。 它還包括用于修改 3D 對(duì)象并在增強(qiáng)現(xiàn)實(shí)中查看它們的工具。 雖然免費(fèi)版缺少這種 AR 視角和 4K 掃描,但您可以一次性付費(fèi)升級(jí)到專業(yè)版。 值得注意的是,Qlone 還兼容 MacOS(Monterey 及更高版本)。 Shapr3D 允許您使用 iPad 和 Apple Pencil 隨時(shí)隨地創(chuàng)建3D 模型。 由于 Shapr3D 由運(yùn)行 SolidWorks 的同一引擎驅(qū)動(dòng),因此渲染圖形并將其導(dǎo)入桌面變得輕而易舉。 該應(yīng)用程序的用戶友好界面使其成為 CAD 軟件新手的絕佳選擇。 在 iPad 上使用 Apple Pencil 繪制 3D 模型就像用鉛筆在紙上繪圖一樣簡(jiǎn)單。 其高分辨率渲染將使您能夠以生產(chǎn)質(zhì)量查看您的設(shè)計(jì),并且它也可以離線工作。 Shapr3D 還提供有用的支持系統(tǒng)和活躍的論壇,以獲取問題的答案并了解新功能。 Onshape 是一款基于云的 CAD 軟件,帶有適用于 Android 和 iOS 智能手機(jī)的配套應(yīng)用程序。 您可以直接在移動(dòng)設(shè)備上使用完整版本,因?yàn)樗诰W(wǎng)絡(luò)瀏覽器上運(yùn)行。 該應(yīng)用程序允許您在任何地方處理項(xiàng)目,只要您有有效的互聯(lián)網(wǎng)連接。 iPad 版 Onshape 還可以與 Apple Pencil 配合使用,非常適合實(shí)時(shí)繪制草圖和渲染。 Prisma3D 允許您直接從 Android 設(shè)備創(chuàng)建 3D 模型并制作動(dòng)畫。 您所需要的只是一些基本的綁定和關(guān)鍵幀技術(shù),您的 3D 角色就可以制作一些精彩的動(dòng)畫。 通過使 3D 環(huán)境和操作 3D 模型的能力可以在任何地方訪問,可以簡(jiǎn)化各個(gè)級(jí)別的藝術(shù)家的渲染過程。 Prisma3D 可實(shí)現(xiàn)高達(dá) 4K 的渲染,但這需要高端移動(dòng)設(shè)備或平板電腦處理器。 然而,大多數(shù)智能手機(jī)應(yīng)該能夠快速渲染高清素材。 它還支持導(dǎo)入和導(dǎo)出主要的3D 文件格式,包括 OBJ。 Sculptura 是一款具有簡(jiǎn)單雕刻工具并能生成照片級(jí)真實(shí)渲染效果的應(yīng)用程序的有力競(jìng)爭(zhēng)者。 它與 iPad 兼容,您可以快速導(dǎo)入 3D 模型以開始雕刻。 如果您喜歡隨時(shí)隨地進(jìn)行 3D 工作,可以通過將 Sculptura 集成到您的工作流程中來簡(jiǎn)化渲染過程。 它還具有 OBJ 和 STL 導(dǎo)出選項(xiàng),您可以將工作快速傳輸?shù)侥?PC。 Putty3D 是一款強(qiáng)大的 3D 雕刻程序,可利用集成圖形處理器 (IGP) 創(chuàng)建無縫的用戶體驗(yàn)。 由于它同時(shí)使用 CPU 和 GPU,因此渲染速度更快、質(zhì)量更高。 較新的 iPad 擁有強(qiáng)大的 CPU,可以在更短的時(shí)間內(nèi)實(shí)現(xiàn)更好的渲染,這一事實(shí)也許是不言而喻的。 這種移動(dòng)工作的能力將大大簡(jiǎn)化藝術(shù)家的渲染過程。 渲云渲染插件 3D項(xiàng)目渲染慢、渲染卡頓、渲染崩潰,本地硬件配置不夠,想要加速渲染,在不增加額外的硬件成本投入的情況下,最好的解決方式是使用渲云云渲染,在云端批量渲染,批量出結(jié)果,maya可分塊渲染,享受高配置、高內(nèi)存、高性能服務(wù)器帶來極致的渲染速度,節(jié)省渲染時(shí)間,提高工作效率。 渲云支持的軟件囊括D5、Unreal Engine、3ds Max、Maya、C4D、Houdini、Clarisse、keyshot、katana、Blender、NUKE、VRAY Standalone、Vred、AE等,基本涵蓋業(yè)內(nèi)CG人會(huì)使用到的各類常規(guī)軟件,目前還在不斷增加,滿足不同用戶的軟件差異性需求。 簡(jiǎn)化渲染過程的軟件能幫助藝術(shù)家提高生產(chǎn)力、創(chuàng)造力和成本效益。 通過采用這些簡(jiǎn)化方法,藝術(shù)家可以專注于他們的藝術(shù)愿景,而不會(huì)受到技術(shù)障礙的困擾。 簡(jiǎn)化渲染的好處包括更快的項(xiàng)目完成、資源優(yōu)化、更愉快的創(chuàng)作體驗(yàn)、即時(shí)反饋、創(chuàng)意探索、更好的協(xié)作和客戶互動(dòng)。
最基礎(chǔ)的柵格化算法將多邊形表示的三維場(chǎng)景渲染到二維表面。 多邊形由三角形的集合表示,三角形由三維空間中的三個(gè)頂點(diǎn)表示。 在最簡(jiǎn)單的實(shí)現(xiàn)形式中,柵格化工具將頂點(diǎn)數(shù)據(jù)映射到觀察者顯示器上對(duì)應(yīng)的二維坐標(biāo)點(diǎn),然后對(duì)變換出的二維三角形進(jìn)行合適的填充。 一旦三角形頂點(diǎn)轉(zhuǎn)換到正確的二維位置之后,這些位置可能位于觀察窗口之外,也可能位于屏幕之內(nèi)。 裁剪就是對(duì)三角形進(jìn)行處理以適合顯示區(qū)域的過程。 最常用的技術(shù)是Sutherland-Hodgeman裁剪算法。 在這種方法中,每次測(cè)試每個(gè)圖像平面的四條邊,對(duì)于每個(gè)邊測(cè)試每個(gè)待渲染的點(diǎn)。 如果該點(diǎn)位于邊界之外,就剔除該點(diǎn)。 對(duì)于與圖像平的面邊相交的三角形邊,即邊的一個(gè)頂點(diǎn)位于圖像內(nèi)部一個(gè)位于外部,那么就在交叉點(diǎn)插入一個(gè)點(diǎn)并且移除外部的點(diǎn)。 傳統(tǒng)的柵格化過程的最后一步就是填充圖像平面中的二維三角形,這個(gè)過程就是掃描變換。 第一個(gè)需要考慮的問題就是是否需要繪制給定的像素。 一個(gè)需要渲染的像素必須位于三角形內(nèi)部、必須未被裁掉,并且必須未被其它像素遮擋。 有許多算法可以用于在三角形內(nèi)進(jìn)行填充,其中最流行的方法是掃描線算法。 由于很難確定柵格化引擎是否會(huì)從前到后繪制所有像素,因此必須要有一些方法來確保離觀察者較近的像素不會(huì)被較遠(yuǎn)的像素所覆蓋。 最為常用的一種方法是深度緩存,深度緩存是一個(gè)與圖像平面對(duì)應(yīng)的保存每個(gè)像素深度的二維數(shù)組。 每個(gè)像素進(jìn)行繪制的時(shí)候都要更新深度緩存中的深度值,每個(gè)新像素在繪制之前都要檢查深度緩存中的深度值,距離觀察者較近的像素就會(huì)繪制,而距離較遠(yuǎn)的都被舍棄。 為了確定像素顏色,需要進(jìn)行紋理或者濃淡效果計(jì)算。 紋理圖是用于定義三角形顯示外觀的位圖。 每個(gè)三角形頂點(diǎn)除了位置坐標(biāo)之外都與紋理以及二維紋理坐標(biāo) (u,v) 發(fā)生關(guān)聯(lián)。 每次渲染三角形中的像素的時(shí)候,都必須在紋理中找到對(duì)應(yīng)的紋素,這是根據(jù)在屏幕上像素與頂點(diǎn)的距離在與紋理坐標(biāo)相關(guān)聯(lián)的三角形頂點(diǎn)之間插值完成的。 在透視投影中,插值是在根據(jù)頂點(diǎn)深度分開的紋理坐標(biāo)上進(jìn)行的,這樣做就可以避免透視縮減(perspective foreshortening)問題。 在確定像素最終顏色之前,必須根據(jù)場(chǎng)景中的所有光源計(jì)算像素上的光照。 在場(chǎng)景中通常有三種類型的光源。 定向光是在場(chǎng)景中按照一個(gè)固定方向傳輸并且強(qiáng)度保持不變的光。 在現(xiàn)實(shí)生活中,由于太陽距離遙遠(yuǎn)所以在地球上的觀察者看來是平行光線并且其衰減微乎其微,所以太陽光可以看作是定向光。 點(diǎn)光源是從空間中明確位置向所有方向發(fā)射光線的光源。 在遠(yuǎn)距離的物體上的入射光線會(huì)有衰減。 最后一種是聚光燈,如同現(xiàn)實(shí)生活中的聚光燈一樣,它有一個(gè)明確的空間位置、方向以及光錐的角度。 另外,經(jīng)常在光照計(jì)算完成之后添加一個(gè)環(huán)境光值以補(bǔ)償光柵化無法正確計(jì)算的全局照明效果。 有許多可以用于光柵化的濃淡算法。 所有的濃淡處理算法都必須考慮與光源的距離以及遮蔽物體法向量與光照入射角。 最快的算法讓三角形中的所有像素使用同樣的亮度,但是這種方法無法生成平滑效果的表面。 另外也可以單獨(dú)計(jì)算頂點(diǎn)的亮度,然后繪制內(nèi)部像素的時(shí)候?qū)旤c(diǎn)亮度進(jìn)行插值。 速度最慢也最為真實(shí)的實(shí)現(xiàn)方法是單獨(dú)計(jì)算每點(diǎn)的亮度。 常用的濃淡模型有 Gouraud shading 和 Phong shading。
計(jì)算機(jī)圖形學(xué)是利用計(jì)算機(jī)合成和操作視覺信息的學(xué)科。 它的應(yīng)用領(lǐng)域廣泛,包括游戲、電影、虛擬現(xiàn)實(shí)(VR)、增強(qiáng)現(xiàn)實(shí)(AR)、用戶界面(GUI)、數(shù)字照片、地圖繪制、3D打印、建筑設(shè)計(jì)等。 在計(jì)算機(jī)圖形學(xué)中,涉及到的知識(shí)多而復(fù)雜。 首先,要解決的是如何建模,例如繪制一個(gè)立方體。 假設(shè)立方體長(zhǎng)寬高為2*2*2,中心在三維坐標(biāo)軸中心(0,0,0)。 立方體的八個(gè)頂點(diǎn)坐標(biāo)分別為:A(1,1,1),B(-1,1,1),C(1,-1,1),D(-1,-1,1),E(1,1,-1),F(xiàn)(-1,1,-1),G(1,-1,-1),H(-1,-1,-1)。 接下來,需要解決的是如何將三維空間中的立方體投影到二維平面上,即用數(shù)字描述在屏幕上顯示立方體的過程。 投影的基本策略包括將三維頂點(diǎn)投影成二維平面上的點(diǎn),然后將這些點(diǎn)連接起來。 透視投影是基于“近大遠(yuǎn)小”的原理,通過小孔成像原理,將三維物體顯示在二維平面上。 具體公式為:v = y/z, u = x/z,其中x, y, z指的是頂點(diǎn)到相機(jī)小孔C的水平、豎直和橫向距離,而不是頂點(diǎn)在三維空間中的坐標(biāo)。 接著,我們需要了解像素(Pixel)的概念。 一個(gè)像素由紅綠藍(lán)三原色和色彩空間(透明度)信息組成,以32位(相當(dāng)于一個(gè)浮點(diǎn)數(shù))存儲(chǔ),每個(gè)值范圍為0-255。 顯示屏由許多像素組成,1920*1080分辨率表示橫向1080個(gè)點(diǎn),縱向1920個(gè)點(diǎn),共約200萬個(gè)點(diǎn)。 顯示像素的方法有LCD和DMD等。 光柵化是指將連續(xù)的物體(如線、多邊形)用像素網(wǎng)格表示。 對(duì)于線段的光柵化,可以采用Diamond Rule,即只在直線穿過正方形中間的菱形區(qū)域時(shí)點(diǎn)亮整個(gè)正方形像素。 通過求解線段的斜率,可以簡(jiǎn)化光柵化過程。 通過建模和光柵化,我們可以在屏幕上顯示3D物體。 下一節(jié)將學(xué)習(xí)如何繪制更復(fù)雜的平面圖形,以及處理鋸齒問題。 理解3D物體的建模和光柵化過程是計(jì)算機(jī)圖形學(xué)的基礎(chǔ),為后續(xù)學(xué)習(xí)更復(fù)雜的表面描繪、光照模擬、材質(zhì)屬性和物體運(yùn)動(dòng)做好準(zhǔn)備。 學(xué)習(xí)計(jì)算機(jī)圖形學(xué)是一個(gè)循序漸進(jìn)的過程,從簡(jiǎn)單的二維繪圖到復(fù)雜的三維渲染,涵蓋了數(shù)學(xué)、幾何、計(jì)算機(jī)視覺等多個(gè)領(lǐng)域。 通過不斷實(shí)踐和學(xué)習(xí),可以逐步掌握這一領(lǐng)域的知識(shí)和技能。
輸出設(shè)備主要分兩種,一種是 顯示屏類的,一種是 打印機(jī)類的。 顯示屏也也分為兩種:
打印機(jī)不重要,當(dāng)科普看看~ 分為兩種:
打印機(jī)的分辨率不好確定,因?yàn)楦埖囊苿?dòng)速度有關(guān),對(duì)熱敏打印機(jī)這類能打印連續(xù)顏色的設(shè)備來說,一般的標(biāo)準(zhǔn)是打印頭上每英寸多少像素(pixels per inch / ppi)。 對(duì)于噴墨式這種不能連續(xù)的設(shè)備來說,一般的標(biāo)準(zhǔn)是每英寸多少個(gè)點(diǎn)(dots per inch / dpi)。
所有的不是通過電腦計(jì)算出來的圖像,都需要先用光柵化輸入設(shè)備獲取,一般是 數(shù)碼相機(jī)和 掃描儀 。 如果一個(gè)相機(jī)的分辨率是 3000*2000,那么一般稱他為 600 萬像素(6 MP)。 可以獨(dú)立測(cè)量紅綠藍(lán)的相機(jī)要比只有一個(gè)馬賽克傳感器的好(mosaic sensor)。 對(duì)于掃描儀而已,指標(biāo)一般跟連續(xù)性打印機(jī)一樣,每英寸多少像素(ppi)。
一個(gè)像素是一個(gè)采樣點(diǎn),對(duì)于數(shù)碼相機(jī)來說,一個(gè)像素就是這個(gè)格子周圍的光的平均,對(duì)于輸出設(shè)備來說也是,這個(gè)像素只是代表這一小塊方格的平均,比如說,一個(gè)屏幕只有一個(gè)像素,用它來顯示一張圖片,只能是純色,純色不能代表這張圖片,只能代表一個(gè)平均值。 確定像素矩陣的坐標(biāo)是很重要的,約定使用下面的方式:
我們把顯示器關(guān)閉當(dāng)成 0,把顯示器打開當(dāng)成 1,中間 0.5 是灰色。 需要明確一點(diǎn),顯示器對(duì)于輸入的數(shù)值和顯示出的強(qiáng)度并不是線性對(duì)應(yīng)的,比如說,分別輸入 0,0.5,1,那么顯示器輸出的強(qiáng)度有可能是 0,0.25,1。 對(duì)于這種非線性,顯示器通常會(huì)有一個(gè)伽馬值來表述。 公示為:
比如說,輸入值為 0.5,伽馬值為 2,那么輸出強(qiáng)度為最大強(qiáng)度的 1/4。 輸入強(qiáng)度為 0 的時(shí)候就是 0,1 的時(shí)候就是最大強(qiáng)度。 可以通過一些方法來確定某塊屏幕的伽馬值,我們假設(shè)已經(jīng)知道了。 這樣就可以對(duì)輸入進(jìn)行 伽馬校正 ,也就是使得輸入值為 0.5 時(shí),輸出強(qiáng)度也恰好是黑與白的一半。 也就是把輸入和輸出變成一個(gè)近似線性的對(duì)應(yīng)關(guān)系。 另一個(gè)需要注意的是,屏幕的顯示顏色范圍都是固定大小的,一般是 0-255,也就是 8-bit 的存儲(chǔ)器。
RGB 是加色模式,全部混合是白色,可以理解為是光;青品黃是減色模式,全部混合是黑色,可以理解為是顏料;我們不需要關(guān)心青品黃。 一般都是 24-bit 的顏色系統(tǒng),也就是 8bit * 3,每個(gè)分量有 255 個(gè)等級(jí)。
對(duì)于不透明的物體,前景會(huì)直接覆蓋后景;對(duì)于半透明的物體,一般會(huì)將前景和后景進(jìn)行混合,一般描述一個(gè)顏色都是 RGBA,這里的 A 是指 α,指的就是與后景的混合程度。公式為:
可以看出 0 的時(shí)候全部都是后景色,1 的時(shí)候全部都是前景色。
(注意并不只有這一種混合模式,你看 ps 里面圖層的疊加方式,正常/正片疊底/線性減淡之類的)
大部分圖像都是使用 8-bit 來存儲(chǔ)每個(gè)通道,這樣的話一個(gè) 100 萬像素的圖片大概就是 3M 左右。 為了降低存儲(chǔ)空間,有時(shí)會(huì)將圖片進(jìn)行壓縮,有的壓縮是有損壓縮,不可逆的,有的是無損壓縮。 常見的圖像存儲(chǔ)格式有:
Performance可以記錄站點(diǎn)在運(yùn)行過程中的性能數(shù)據(jù),有了這些性能數(shù)據(jù),就可以回放整個(gè)頁面的執(zhí)行過程,這樣就方便我們來定位和診斷每個(gè)時(shí)間段內(nèi)頁面的運(yùn)行情況,從而有效的找出頁面的性能瓶頸。
配置Performance各種配置及說明如圖所示:
Performance不僅可以錄制加載階段的性能數(shù)據(jù),還可以錄制交互階段,不過交互階段的錄制需要手動(dòng)停止錄制過程。
觀察下圖的報(bào)告頁,我們可以將它分為三個(gè)主要的部分,分別為概覽面板、性能指標(biāo)面板和詳情面板。
在概覽面板中,Performance就會(huì)將幾個(gè)關(guān)鍵指標(biāo),諸如頁面幀速(FPS)、CPU資源消耗、網(wǎng)絡(luò)請(qǐng)求流量、V8內(nèi)存使用量(堆內(nèi)存)等,按照時(shí)間順序做成圖表的形式展現(xiàn)出來,可以參看上圖。
如果FPS圖表上出現(xiàn)了紅色塊,那么就表示紅色塊附近渲染出一幀所需時(shí)間過久,幀的渲染時(shí)間過久,就有可能導(dǎo)致頁面卡頓。
如果CPU圖形占用面積太大,表示CPU使用率就越高,那么就有可能因?yàn)槟硞€(gè)JavaScript占用太多的主線程時(shí)間,從而影響其他任務(wù)的執(zhí)行。
除了以上指標(biāo)以外,概覽面板還展示加載過程中的幾個(gè)關(guān)鍵時(shí)間節(jié)點(diǎn),如FP、LCP、DOMContentLoaded、Onload等事件產(chǎn)生的時(shí)間點(diǎn)。
Main指標(biāo)在性能面板中,記錄了非常多的性能指標(biāo)項(xiàng),比如Main指標(biāo)記錄渲染主線程的任務(wù)執(zhí)行過程,Compositor指標(biāo)記錄了合成線程的任務(wù)執(zhí)行過程,GPU指標(biāo)記錄了GPU進(jìn)程主線程的任務(wù)執(zhí)行過程。 有了這些詳細(xì)的性能數(shù)據(jù),就可以幫助我們輕松地定位到頁面的性能問題。
簡(jiǎn)而言之,我們通過概覽面板來定位問題的時(shí)間節(jié)點(diǎn),然后再使用性能面板分析該時(shí)間節(jié)點(diǎn)內(nèi)的性能數(shù)據(jù)。 具體地講,比如概覽面板中的FPS圖表中出現(xiàn)了紅色塊,那么我們點(diǎn)擊該紅色塊,性能面板就定位到該紅色塊的時(shí)間節(jié)點(diǎn)內(nèi)了。
因?yàn)闉g覽器的渲染機(jī)制過于復(fù)雜,所以渲染模塊在執(zhí)行渲染的過程中會(huì)被劃分為很多子階段,輸入的HTML數(shù)據(jù)經(jīng)過這些子階段,最后輸出屏幕上的像素,我們把這樣的一個(gè)處理流程叫做渲染流水線。 一條完整的渲染流水線包括了解析HTML文件生成DOM、解析CSS生成CSSOM、執(zhí)行JavaScript、樣式計(jì)算、構(gòu)造布局樹、準(zhǔn)備繪制列表、光柵化、合成、顯示等一系列操作。
渲染流水線主要是在渲染進(jìn)程中執(zhí)行的,在執(zhí)行渲染流水線的過程中,渲染進(jìn)程又需要網(wǎng)絡(luò)進(jìn)程、瀏覽器進(jìn)程、GPU等進(jìn)程配合,才能完成如此復(fù)雜的任務(wù)。 另外在渲染進(jìn)程內(nèi)部,又有很多線程來相互配合。 具體的工作方式你可以參考下圖:
觀察上圖,一段段橫條代表執(zhí)行一個(gè)個(gè)任務(wù),長(zhǎng)度越長(zhǎng),花費(fèi)的時(shí)間越多;豎向代表該任務(wù)的執(zhí)行記錄。 我們知道主線程上跑了特別多的任務(wù),諸如渲染流水線的大部分流程,JavaScript執(zhí)行、V8的垃圾回收、定時(shí)器設(shè)置的回調(diào)任務(wù)等等,因此Main指標(biāo)的內(nèi)容非常多,而且非常重要,所以我們?cè)谑褂肞erofrmance的時(shí)候,大部分時(shí)間都是在分析Main指標(biāo)。
任務(wù)vs過程渲染進(jìn)程中維護(hù)了消息隊(duì)列,如果通過setTimeout設(shè)置的回調(diào)函數(shù),通過鼠標(biāo)點(diǎn)擊的消息事件,都會(huì)以任務(wù)的形式添加消息隊(duì)列中,然后任務(wù)調(diào)度器會(huì)按照一定規(guī)則從消息隊(duì)列中取出合適的任務(wù),并讓其在渲染主線程上執(zhí)行。
Main指標(biāo)就記錄渲染主線上所執(zhí)行的全部任務(wù),以及每個(gè)任務(wù)的詳細(xì)執(zhí)行過程。
觀察上圖,圖上方有很多一段一段灰色橫條,每個(gè)灰色橫條就對(duì)應(yīng)了一個(gè)任務(wù),灰色長(zhǎng)條的長(zhǎng)度對(duì)應(yīng)了任務(wù)的執(zhí)行時(shí)長(zhǎng)。 通常,渲染主線程上的任務(wù)都是比較復(fù)雜的,如果只單純記錄任務(wù)執(zhí)行的時(shí)長(zhǎng),那么依然很難定位問題,因此,還需要將任務(wù)執(zhí)行過程中的一些關(guān)鍵的細(xì)節(jié)記錄下來,這些細(xì)節(jié)就是任務(wù)的過程,灰線下面的橫條就是一個(gè)個(gè)過程,同樣這些橫條的長(zhǎng)度就代表這些過程執(zhí)行的時(shí)長(zhǎng)。
直觀地理解,你可以把任務(wù)看成是一個(gè)Task函數(shù),在執(zhí)行Task函數(shù)的過程中,它會(huì)調(diào)用一系列的子函數(shù),這些子函數(shù)就是我們所提到的過程。為了讓你更好地理解,我們來分析下面這個(gè)任務(wù)的圖形:
觀察上面這個(gè)任務(wù)記錄的圖形,你可以把該圖形看成是下面Task函數(shù)的執(zhí)行過程:
function?A(){????A1()????A2()}function?Task(){????A()????B()}Task()分析頁面加載過程結(jié)合Main指標(biāo)來分析頁面的加載過程。先來分析一個(gè)簡(jiǎn)單的頁面,代碼如下所示:
????可以看出,它只是包含了一段CSS樣式和一段JavaScript內(nèi)嵌代碼,其中在JavaScript中還執(zhí)行了DOM操作了,我們就結(jié)合這段代碼來分析頁面的加載流程。
首先生成報(bào)告頁,再觀察報(bào)告頁中的Main指標(biāo),由于閱讀實(shí)際指標(biāo)比較費(fèi)勁,所以先手動(dòng)繪制了一些關(guān)鍵的任務(wù)和其執(zhí)行過程,如下圖所示:
通過上面的圖形我們可以看出,加載過程主要分為三個(gè)階段,它們分別是:
導(dǎo)航階段,該階段主要是從網(wǎng)絡(luò)進(jìn)程接收HTML響應(yīng)頭和HTML響應(yīng)體。
解析HTML數(shù)據(jù)階段,該階段主要是將接收到的HTML數(shù)據(jù)轉(zhuǎn)換為DOM和CSSOM。
生成可顯示的位圖階段,該階段主要是利用DOM和CSSOM,經(jīng)過計(jì)算布局、生成層樹(LayerTree)、生成繪制列表(Paint)、完成合成等操作,生成最終的圖片。
那么接下來,我就按照這三個(gè)步驟來介紹如何解讀Main指標(biāo)上的數(shù)據(jù)。
導(dǎo)航階段當(dāng)你點(diǎn)擊了Performance上的重新錄制按鈕之后,瀏覽器進(jìn)程會(huì)通知網(wǎng)絡(luò)進(jìn)程去請(qǐng)求對(duì)應(yīng)的URL資源;一旦網(wǎng)絡(luò)進(jìn)程從服務(wù)器接收到URL的響應(yīng)頭,便立即判斷該響應(yīng)頭中的content-type字段是否屬于text/html類型;如果是,那么瀏覽器進(jìn)程會(huì)讓當(dāng)前的頁面執(zhí)行退出前的清理操作,比如執(zhí)行JavaScript中的beforunload事件,清理操作執(zhí)行結(jié)束之后就準(zhǔn)備顯示新頁面了,這包括了解析、布局、合成、顯示等一系列操作。
當(dāng)你點(diǎn)擊重新加載按鈕后,當(dāng)前的頁面會(huì)執(zhí)行上圖中的這個(gè)任務(wù):
該任務(wù)的第一個(gè)子過程就是Sendrequest,該過程表示網(wǎng)絡(luò)請(qǐng)求已被發(fā)送。 然后該任務(wù)進(jìn)入了等待狀態(tài)。
接著由網(wǎng)絡(luò)進(jìn)程負(fù)責(zé)下載資源,當(dāng)接收到響應(yīng)頭的時(shí)候,該任務(wù)便執(zhí)行ReceiveRespone過程,該過程表示接收到HTTP的響應(yīng)頭了。
接著執(zhí)行DOM事件:pagehide、visibilitychange和unload等事件,如果你注冊(cè)了這些事件的回調(diào)函數(shù),那么這些回調(diào)函數(shù)會(huì)依次在該任務(wù)中被調(diào)用。
這些事件被處理完成之后,那么接下來就接收HTML數(shù)據(jù)了,這體現(xiàn)在了ReciveData過程,ReciveData過程表示請(qǐng)求的數(shù)據(jù)已被接收,如果HTML數(shù)據(jù)過多,會(huì)存在多個(gè)ReceiveData過程。
等到所有的數(shù)據(jù)都接收完成之后,渲染進(jìn)程會(huì)觸發(fā)另外一個(gè)任務(wù),該任務(wù)主要執(zhí)行Finishload過程,該過程表示網(wǎng)絡(luò)請(qǐng)求已經(jīng)完成。
解析HTML數(shù)據(jù)階段這個(gè)階段的主要任務(wù)就是通過解析HTML數(shù)據(jù)、解析CSS數(shù)據(jù)、執(zhí)行JavaScript來生成DOM和CSSOM。那么繼續(xù)來分析這個(gè)階段的圖形,看看它到底是怎么執(zhí)行的?可以觀看下圖:
觀察上圖這個(gè)圖形,可以看出,其中一個(gè)主要的過程是HTMLParser,顧名思義,這個(gè)過程是用來解析HTML文件,解析的就是上個(gè)階段接收到的HTML數(shù)據(jù)。
在ParserHTML的過程中,如果解析到了script標(biāo)簽,那么便進(jìn)入了腳本執(zhí)行過程,也就是圖中的EvaluteScript。
要執(zhí)行一段腳本我們需要首先編譯該腳本,于是在EvaluteScript過程中,先進(jìn)入了腳本編譯過程,也就是圖中的ComplieScript。 腳本編譯好之后,就進(jìn)入程序執(zhí)行過程,執(zhí)行全局代碼時(shí),V8會(huì)先構(gòu)造一個(gè)anonymous過程,在執(zhí)行anonymous過程中,會(huì)調(diào)用setNewArea過程,setNewArea過程中又調(diào)用了createElement,由于之后調(diào)用了方法,該方法會(huì)觸發(fā)DOM內(nèi)容的修改,所以又強(qiáng)制執(zhí)行了ParserHTML過程生成的新的DOM。
DOM生成完成之后,會(huì)觸發(fā)相關(guān)的DOM事件,比如典型的DOMContentLoaded,還有readyStateChanged。
生成可顯示位圖階段生成了DOM和CSSOM之后,就進(jìn)入了第三個(gè)階段:生成頁面上的位圖。通常這需要經(jīng)歷布局(Layout)、分層、繪制、合成等一系列操作,同樣,將第三個(gè)階段的流程也放大了,如下圖所示:
結(jié)合上圖,我們可以發(fā)現(xiàn),在生成完了DOM和CSSOM之后,渲染主線程首先執(zhí)行了一些DOM事件,諸如readyStateChange、load、pageshow。 具體地講,如果你使用JavaScript監(jiān)聽了這些事件,那么這些監(jiān)聽的函數(shù)會(huì)被渲染主線程依次調(diào)用。
接下來就正式進(jìn)入顯示流程了,大致過程如下所示。
首先執(zhí)行布局,這個(gè)過程對(duì)應(yīng)圖中的Layout。
然后更新層樹(LayerTree),這個(gè)過程對(duì)應(yīng)圖中的UpdateLayerTree。
有了層樹之后,就需要為層樹中的每一層準(zhǔn)備繪制列表了,這個(gè)過程就稱為Paint。
準(zhǔn)備每層的繪制列表之后,就需要利用繪制列表來生成相應(yīng)圖層的位圖了,這個(gè)過程對(duì)應(yīng)圖中的CompositeLayers。
走到了CompositeLayers這步,主線程的任務(wù)就完成了,接下來主線程會(huì)將合成的任務(wù)完全教給合成線程來執(zhí)行,下面是具體的過程,你也可以對(duì)照著Composite、Raster和GPU這三個(gè)指標(biāo)來分析,參考下圖:
首先主線程執(zhí)行到CompositeLayers過程之后,便會(huì)將繪制列表等信息提交給合成線程,合成線程的執(zhí)行記錄你可以通過Compositor指標(biāo)來查看。
合成線程維護(hù)了一個(gè)Raster線程池,線程池中的每個(gè)線程稱為Rasterize,用來執(zhí)行光柵化操作,對(duì)應(yīng)的任務(wù)就是RasterizePaint。
當(dāng)然光柵化操作并不是在Rasterize線程中直接執(zhí)行的,而是在GPU進(jìn)程中執(zhí)行的,因此Rasterize線程需要和GPU線程保持通信。
然后GPU生成圖像,最終這些圖層會(huì)被提交給瀏覽器進(jìn)程,瀏覽器進(jìn)程將其合成并最終顯示在頁面上。
本文解答了個(gè)人一個(gè)長(zhǎng)期困擾的問題:在某些情況下,比如網(wǎng)速比較慢或者頁面內(nèi)容很多的時(shí)候,頁面是一點(diǎn)一點(diǎn)的顯示出來的,原本以為是網(wǎng)絡(luò)數(shù)據(jù)是加載一點(diǎn)就渲染一點(diǎn),其實(shí)不是的,數(shù)據(jù)在導(dǎo)航階段就已經(jīng)全部獲取回來了。 之所以會(huì)慢慢渲染出來,是因?yàn)闉g覽器的顯示頻率是60hz,也就是16.67ms就刷新下瀏覽器,但是在16.67ms內(nèi),渲染流水線可能只進(jìn)行到一半,但是這個(gè)時(shí)候也要把渲染一半的畫面顯示出來,所以就會(huì)看到頁面是一點(diǎn)一點(diǎn)的繪制出來的。
原文:
內(nèi)容聲明:
1、本站收錄的內(nèi)容來源于大數(shù)據(jù)收集,版權(quán)歸原網(wǎng)站所有!
2、本站收錄的內(nèi)容若侵害到您的利益,請(qǐng)聯(lián)系我們進(jìn)行刪除處理!
3、本站不接受違法信息,如您發(fā)現(xiàn)違法內(nèi)容,請(qǐng)聯(lián)系我們進(jìn)行舉報(bào)處理!
4、本文地址:http://www.hudongshop.com/article/b7ee2b5d39227f6a15a0.html,復(fù)制請(qǐng)保留版權(quán)鏈接!
在Windows10中使用CrackVS2008創(chuàng)建和管理解決方案的最佳實(shí)踐引言CrackVS2008是一款功能強(qiáng)大的工具,用于在Windows中創(chuàng)建和管理VisualStudio解決方案,遵循最佳實(shí)踐可以幫助您優(yōu)化工作流程,提高生產(chǎn)力和確保代碼庫的質(zhì)量,本文將探討在Windows10中使用CrackVS2008創(chuàng)建和管理解決方案的最...。
最新資訊 2024-10-01 12:12:55
Objective,C,面向?qū)ο蟮膹?qiáng)大語言引言O(shè)bjective,C是一種面向?qū)ο蟮木幊陶Z言,最初由蘋果公司開發(fā),用于macOS和iOS操作系統(tǒng),它基于Smalltalk語言,并融合了C語言的特性,使其成為一種強(qiáng)大且靈活的語言,在本文中,我們將深入了解Objective,C,探討其功能、優(yōu)點(diǎn)和缺點(diǎn),并了解其在移動(dòng)開發(fā)和桌面應(yīng)用程序中的...。
最新資訊 2024-09-28 04:59:05
提升你的博客,使用Lightbox創(chuàng)造引人入勝的視覺內(nèi)容前言在現(xiàn)代網(wǎng)絡(luò)環(huán)境中,引人入勝的視覺內(nèi)容至關(guān)重要,它可以瞬間抓住讀者的注意力,提高參與度并促進(jìn)轉(zhuǎn)化,Lightbox是一個(gè)強(qiáng)大的工具,可以讓你輕松地將高質(zhì)量的圖像、視頻和全景視圖整合到你的博客中,從而提升用戶體驗(yàn),什么是Lightbox,Lightbox是一種JavaScript...。
互聯(lián)網(wǎng)資訊 2024-09-28 03:56:44
簡(jiǎn)介Activiti是一個(gè)開源的業(yè)務(wù)流程管理,BPM,和工作流引擎,它允許您建模、部署和管理復(fù)雜的業(yè)務(wù)流程,本教程將指導(dǎo)您完成使用Activiti從BPMN流程圖創(chuàng)建可執(zhí)行工作流的過程,先決條件安裝Activiti安裝BPMN建模工具,例如,CamundaModeler,了解BPMN基本符號(hào)步驟1,建模BPMN流程使用BPMN建模工具...。
本站公告 2024-09-26 21:44:20
前言單元測(cè)試是軟件開發(fā)過程中至關(guān)重要的技術(shù),它有助于確保代碼的健壯性和可靠性,本文將深入探討CakePHP中的單元測(cè)試,指導(dǎo)你編寫穩(wěn)健可靠的代碼,了解CakePHP單元測(cè)試CakePHP中的單元測(cè)試是基于PHPUnit框架構(gòu)建的,并通過CakePHP的測(cè)試用例類擴(kuò)展了其功能,測(cè)試用例類提供了特定的方法和助手,簡(jiǎn)化了CakePHP應(yīng)用程...。
技術(shù)教程 2024-09-25 08:18:09
什么是Coursera,Coursera是一個(gè)在線學(xué)習(xí)平臺(tái),提供各種主題的課程,包括商科、計(jì)算機(jī)科學(xué)、數(shù)據(jù)科學(xué)、健康、藝術(shù)等,這些課程由世界領(lǐng)先的大學(xué)和組織提供,如斯坦福大學(xué)、密歇根大學(xué)、谷歌和IBM,Coursera上的課程有兩種主要類型,專業(yè)證書課程和學(xué)位課程,專業(yè)證書課程通常需要幾個(gè)月的學(xué)習(xí)時(shí)間,旨在培養(yǎng)特定的技能,而學(xué)位課程則...。
互聯(lián)網(wǎng)資訊 2024-09-23 08:24:08
簡(jiǎn)介fprintf,函數(shù)是C語言標(biāo)準(zhǔn)I,O庫中一個(gè)強(qiáng)大的函數(shù),它允許開發(fā)者以格式化方式輸出數(shù)據(jù),通過使用格式說明符,開發(fā)者可以控制輸出的寬度、對(duì)齊、小數(shù)點(diǎn)精度以及其他屬性,本篇文章將深入探討fprintf,函數(shù)的用法和功能,并通過示例展示如何使用它來以各種格式輸出數(shù)據(jù),語法fprintf,函數(shù)的語法如下,```cintfprin...。
互聯(lián)網(wǎng)資訊 2024-09-15 11:19:37
指定范圍內(nèi)的數(shù)字的平均值計(jì)算平均值或中心趨勢(shì)MIN返回指定范圍內(nèi)的最小值查找最小值或極值MAX返回指定范圍內(nèi)的最大值查找最大值或極值SQRT計(jì)算指定數(shù)字的平方根進(jìn)行幾何或統(tǒng)計(jì)計(jì)算SIN計(jì)算指定角度的正弦值進(jìn)行三角測(cè)量或建模文本函數(shù)函數(shù)說明應(yīng)用場(chǎng)景LEFT從文本字符串中返回指定數(shù)量的左部字符提取文本字符串的一部分RIGHT從文本字符串中...。
最新資訊 2024-09-13 12:43:32
引言隨機(jī)數(shù)在計(jì)算機(jī)科學(xué)中扮演著至關(guān)重要的角色,廣泛應(yīng)用于密碼學(xué)、仿真、游戲和機(jī)器學(xué)習(xí)等領(lǐng)域,并非所有隨機(jī)數(shù)函數(shù)都是平等的,它們具有各自的優(yōu)勢(shì)和局限性,本文將深入探討偽隨機(jī)數(shù)和真隨機(jī)數(shù)之間的差異,以及如何選擇適合特定應(yīng)用的隨機(jī)數(shù)函數(shù),偽隨機(jī)數(shù)定義偽隨機(jī)數(shù)由確定性算法生成,即算法基于一個(gè)種子值,該種子值決定了產(chǎn)生的隨機(jī)數(shù)序列,盡管這些數(shù)看...。
最新資訊 2024-09-11 09:26:44
VB.NET源碼概述VB.NET是面向?qū)ο缶幊陶Z言,擴(kuò)展了VisualBasic6.0的功能,它采用面向?qū)ο蠹夹g(shù),將代碼組織成稱為類的模塊,在VB.NET中,聲明變量、方法和屬性時(shí)使用關(guān)鍵字Dim,并使用.運(yùn)算符訪問對(duì)象成員,VB.NET代碼以.vb擴(kuò)展名保存,以下是一個(gè)簡(jiǎn)單的HelloWorld程序示例,ModuleModule1S...。
最新資訊 2024-09-10 01:35:30
可擴(kuò)展性的含義可擴(kuò)展性是指系統(tǒng)能夠隨著需求的增長(zhǎng)而輕松擴(kuò)展以處理增加的負(fù)載和功能的能力,對(duì)于考試系統(tǒng)而言,可擴(kuò)展性至關(guān)重要,因?yàn)闄C(jī)構(gòu)的需求會(huì)隨著考生數(shù)量、考試次數(shù)和考試復(fù)雜性的增加而不斷變化,開源考試系統(tǒng)的可擴(kuò)展性優(yōu)勢(shì)開源考試系統(tǒng)通常具有以下可擴(kuò)展性優(yōu)勢(shì),無許可證限制開源系統(tǒng)沒有供應(yīng)商限制,這意味著機(jī)構(gòu)可以根據(jù)需要擴(kuò)展它們,而無需支付...。
互聯(lián)網(wǎng)資訊 2024-09-08 10:58:20
什么是正則表達(dá)式,正則表達(dá)式,也稱為正規(guī)表達(dá)式,是一種用于匹配文本模式的特殊語法,它是一種強(qiáng)大的工具,可用于各種文本處理任務(wù),例如,查找特定單詞或短語提取特定格式的數(shù)據(jù),例如日期或電子郵件地址驗(yàn)證用戶輸入替換文本正則表達(dá)式語法正則表達(dá)式使用各種符號(hào)、元字符和修飾符來定義匹配模式,以下是一些最常用的元素,字符類,匹配任何屬于指定字符類的...。
最新資訊 2024-09-05 22:56:11