Unity教程 在Unity 5中如何減少Draw Cal

simaoshid1 2018-06-22

本文爲大(dà)家分(fēn)享Unity 5中标準著(zhe)色器的(de)簡單概念,并分(fēn)析如何減少Draw Call(Unity 5中顯示爲SetPass calls,下(xià)文的(de)Draw Call皆表示SetPass calls)。

标準著(zhe)色器是基于物(wù)理(lǐ)的(de)著(zhe)色器,可(kě)以正确渲染各種光(guāng)照(zhào)條件下(xià)的(de)效果,支持跨平台,擁有可(kě)以啓用(yòng)不同功能著(zhe)色器的(de)紋理(lǐ)字段。

标準著(zhe)色器會根據紋理(lǐ)字段所選用(yòng)的(de)紋理(lǐ)改變自身包含的(de)功能,從而影(yǐng)響這(zhè)個(gè)Shader的(de)執行速度。盡管他(tā)們都是使用(yòng)的(de)标準著(zhe)色器,但***終生成的(de)著(zhe)色器是不同的(de),如下(xià)圖:

Unity教程  在Unity 5中如何減少Draw Cal

這(zhè)兩個(gè)著(zhe)色器在渲染場(chǎng)景時(shí)是完全不同的(de)(盡管都是“标準著(zhe)色器”),因此如果想減少Draw Call,就要以完全不同的(de)方式來(lái)處理(lǐ)這(zhè)兩個(gè)著(zhe)色器。

先介紹通(tōng)用(yòng)的(de)減少Draw Call的(de)方法,然後再講解在Unity 5中使用(yòng)标準著(zhe)色器時(shí)如何減少Draw Call。

手動減少Draw Call

Unity教程  在Unity 5中如何減少Draw Cal

不論是Unity或其它引擎,減少Draw Call無非就是盡可(kě)能少用(yòng)材質。

所以減少材質基本上有以下(xià)幾步:

1. 按照(zhào)所用(yòng)的(de)著(zhe)色器類型對(duì)材質進行分(fēn)類及整合。

2. 将使用(yòng)同一著(zhe)色器的(de)材質的(de)紋理(lǐ)合并爲紋理(lǐ)集。

3. 創建一個(gè)材質,讓其包含著(zhe)色器及第二步創建的(de)紋理(lǐ)集。

4. 重新對(duì)用(yòng)到該著(zhe)色器的(de)網格進行紋理(lǐ)映射以匹配紋理(lǐ)集中的(de)紋理(lǐ)坐(zuò)标。

5. 将第三步創建的(de)材質賦給重新編輯後的(de)網格。

***步按照(zhào)所用(yòng)的(de)著(zhe)色器類型對(duì)材質進行分(fēn)類及整合

盡量使用(yòng)***簡單的(de)場(chǎng)景來(lái)說明(míng),這(zhè)裏隻有4個(gè)材質,每個(gè)材質都使用(yòng)Bumped Diffuse著(zhe)色器,如下(xià)圖:

Unity教程  在Unity 5中如何減少Draw Cal

注意上圖的(de)SetPass calls是4。

對(duì)于此場(chǎng)景要處理(lǐ)的(de)材質如下(xià)圖:

Unity教程  在Unity 5中如何減少Draw Cal

第二步将使用(yòng)同一著(zhe)色器的(de)材質的(de)紋理(lǐ)合并爲紋理(lǐ)集

這(zhè)裏每個(gè)著(zhe)色器有兩張紋理(lǐ),一張基本紋理(lǐ)和(hé)一張Bumped Diffuse要用(yòng)的(de)法線紋理(lǐ),所以需要的(de)紋理(lǐ)貼圖如下(xià):

Unity教程  在Unity 5中如何減少Draw Cal

第二步将使用(yòng)同一著(zhe)色器的(de)材質的(de)紋理(lǐ)合并爲紋理(lǐ)集

這(zhè)裏每個(gè)著(zhe)色器有兩張紋理(lǐ),一張基本紋理(lǐ)和(hé)一張Bumped Diffuse要用(yòng)的(de)法線紋理(lǐ),所以需要的(de)紋理(lǐ)貼圖如下(xià):

Unity教程  在Unity 5中如何減少Draw Cal

第三步創建材質,讓其包含著(zhe)色器及第二步創建的(de)紋理(lǐ)集

創建材質,并設置好兩個(gè)紋理(lǐ)和(hé)著(zhe)色器(本例是“Bumped Diffuse”)如下(xià)圖:

Unity教程  在Unity 5中如何減少Draw Cal

第四步重新對(duì)網格進行紋理(lǐ)映射以匹配紋理(lǐ)集中的(de)坐(zuò)标

這(zhè)一步可(kě)在任意3D編輯器中完成(Maya、3D studio 、Max 、Blender 等)。

該步驟比較耗時(shí),需要重新設置網格的(de)UV坐(zuò)标以對(duì)齊到第二步所創建的(de)紋理(lǐ)集中的(de)像素。如下(xià)圖:

Unity教程  在Unity 5中如何減少Draw Cal

對(duì)所有使用(yòng)同一著(zhe)色器的(de)網格重複以上步驟。

第五步将第三步創建的(de)材質賦給重新編輯後的(de)網格

還(hái)要進行以下(xià)兩個(gè)步驟:

1. 用(yòng)所有重新映射後的(de)網格替換之前的(de)網格,并禁用(yòng)舊(jiù)的(de)網格。

2. 将第三步創建的(de)材質賦給重新映射後的(de)網格。

如下(xià)圖:

Unity教程  在Unity 5中如何減少Draw Cal

運行效果如下(xià)圖:

Unity教程  在Unity 5中如何減少Draw Cal

回到***步,優化(huà)之前的(de)SetPass calls是4,而優化(huà)後減少***1,本例中Draw Call減少了(le)75%。

在Unity 5中使用(yòng)标準著(zhe)色器時(shí)減少Draw Call

如之前所說,标準著(zhe)色器會根據所用(yòng)到的(de)紋理(lǐ)變得(de)更快(kuài)或更慢(màn),與此同時(shí)渲染方式也(yě)會不同。所以如果材質的(de)紋理(lǐ)使用(yòng)同一标準著(zhe)色器,就可(kě)以将材質合并。例如,合并所有隻有顔色的(de)網格、合并所有隻有Albedo(反射率)紋理(lǐ)的(de)網格等等。按照(zhào)紋理(lǐ)整合好對(duì)象後對(duì)于任意著(zhe)色器都隻需進行上面五個(gè)步驟進行優化(huà),其中的(de)著(zhe)色器就是标準著(zhe)色器的(de)紋理(lǐ)字段。

使用(yòng)标準著(zhe)色器的(de)場(chǎng)景優化(huà)前後對(duì)比圖如下(xià):

Unity教程  在Unity 5中如何減少Draw Cal

可(kě)以看到Draw Call從91減少***22,約降低了(le)75%,如果盡可(kě)能的(de)合并網格效果還(hái)可(kě)以更好。

在Unity中自動減少Draw Call

本文作者Juan制作了(le)插件Pro Draw Call Optimizer,可(kě)以自動根據用(yòng)到的(de)著(zhe)色器類型來(lái)整合對(duì)象,并自動對(duì)所有未優化(huà)的(de)場(chǎng)景進行“加工”。另外如果場(chǎng)景隻用(yòng)到Diffuse和(hé)Bumped Diffuse著(zhe)色器,還(hái)可(kě)以使用(yòng)Juan制作的(de)免費版插件Pro Draw call Optimizer Light。

發表評論

發表評論:

17601037727 1280857492