日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

次世代手游美术资源优化干货分享

發布時間:2024/8/26 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 次世代手游美术资源优化干货分享 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

次世代,是日本流傳過來的叫法,意思是下一個時代,未來的時代,常說的次世代科技,即指還未廣泛應用的現金技術。后來這個名次變成了一個人們的習慣,將次世代變成一個名詞,用來代表某類具備特定屬性的游戲類型。
?


隨著科技的發展,手機硬件不斷升級優化,使我們可以在移動端上實現次世代游戲的畫面效果。雖然如此,我們還是受到一些硬件限制的瓶頸,我們不可能像之前制作主機游戲那樣“肆意浪費、隨心所欲”,必須要優化處理各種美術資源,以便在不同的平臺,不同的硬件終端上有一個好的游戲體驗。

性能瓶頸有哪些?

對于一個游戲來說,有兩種主要的計算資源:CPU和GPU。它們會互相合作,來讓我們的游戲可以在預期的幀率和分辨率下工作。CPU負責其中的幀率,GPU主要負責分辨率相關的一些東西。

總結起來,主要的性能瓶頸在于:

CPU:

過多的Draw Calls

復雜的腳本或者物理模擬

GPU:

填充率:圖形處理單元美妙渲染的像素數量

像素的復雜度:比如動態陰影,光照,復雜的shader等等

幾何體的復雜度:頂點數量

GPU的顯存寬帶

涉及的優化技術

對于CPU來說,限制它的主要是游戲中的Draw Calls,那么什么是Draw Calls呢?Draw Calls是CPU調用底層圖形接口,比如有上千個物體,每一個的渲染都需要去調用一次底層接口,而每一次的調用CPU都需要做很多工作,那么CPU必然不堪重負。但是對于GPU來說,圖形處理的工作量是一樣的,所以對Draw Calls的優化,主要就是為了盡量解放CPU在調用圖形接口上的開銷。

上面說到過,我們需要繪制圖像時,就一定需要調用Draw Calls。例如,一個場景有水有樹,我們渲染水的時候,使用的是一個matenall以及一個shader,但渲染樹的時候需要一個完全不同的matenall和shader,那么就需要CPU重新準備頂點數據、重新設置shader,而這種工作實際上是非常耗時的。如果場景中,每一個物體都使用不同的matenall、不同的紋理。那么就會產生太多的Draw Call,影響幀率,游戲性能就會下降。其它COY的性能瓶頸還有物理、布料模擬、粒子模擬等,都是計算量很大的操作。

而對于GPU來說,它負責整個渲染流水線,它會從處理CPU傳遞過來的模型數據開始,進行Vetex Shader、Fragment Shader等一系列工作,最后輸出屏幕上的每個像素。因此它的性能瓶頸可能和需要處理的頂點數目的、屏幕分辨率、顯存等了解了上面基本內容后,下面涉及到的優化技術有:

CPU優化

減少Draw Call數量


GPU優化

頂點數優化

像素優化

帶寬優化

如何減少Draw Call數量?

1批處理(Batching)

最常見的就是通過批處理了。從名字上來解釋,就是一塊處理多個物體的意思,那么什么樣的物體可以一起處理呢?答案是使用同一個材質的物體。因此,對于同一材質的物體,它們之間的不同僅僅在于頂點數據的差別,即使用的網絡不同而已。我們可以把這些頂點數據合并在一起,再一起發送給GPU,就可以完成一次批處理。
?


Unity中含有兩種批處理方式:一種是動態批處理,一種是靜態批處理。

對于動態批處理來說,好消息是一切處理都是自動的,不需要我們自己做任何操作,而且物體是可以移動的。但壞消息是,限制很多,可能一不小心我們就會破壞這種機制,導致unity無法批處理一些使用了相同材質的物體。對于靜態批處理來說,好消息是自由度很高,限制很少,壞消息是可能會占用更多的內存,而且經過靜態批處理后的所有物體都不可以再移動了。

首先來說動態批處理。

Unity進行動態批處理的條件是,物體使用同一材質并且滿足一些特定條件。Unity總是在不知不覺中就為我們做了動態批處理。動態批處理雖然自動的令人感動,但是它對模型的要求很多。

1、頂點熟悉的最大限制為900。

2、物體都必須需要使用同一個縮放尺度(可以是(1,1,1)、(1,2,3)、(1.5、1.4、1.3)等等,但必須都一樣)。但如果是非統一縮放(即每個維度的縮放尺度不一樣)。例如(1,2,1)),那么如果所有的物體都是使用不同的非統一縮放也是可以批處理的。

3、使用lightmap的物體不會動態批處理,多passes的shader會中斷批處理,接受實時陰影的物體也不會批處理。

動態批處理的條件這么多,因此unity提供了另一個方法,靜態批處理。方法很堅定,只需要把物體的“Static Flag”勾選上。

有一些小提示可以使用:

1、盡可能選擇靜態批處理,但得時刻小心對內存的消耗

2、如果無法進行靜態批處理,而要使用動態批處理的話,那么小心上面提到的各種注意事項。例如:

盡可能讓這樣的物體少并且盡可能讓這些物體包涵少量的頂點屬性。

不要使用統一縮放,或者都使用不同的非統一縮放。

3、對于游戲中的小道具,可以使用動態批處理。

4、對于包含動畫的這類物體,我們無法全部使用靜態批處理,但其中如果有不動的部分,可以把這部分標識成“Static”。

雖然批處理是個很好的方式,但很容易就打破它的規定。例如,買域名場景中的物體都使用Diffuse材質,但它們可能會使用不同的紋理。因此,盡可能把多張小紋理合并到一張大紋理中是一個好主意。

GPU的優化

1頂點優化

(1)優化Mesh,減少頂點數量。

3D游戲制作都是由模型制作開始,而在建模的時候,有一條我們需要記住,盡可能減少模型中三角形的數目,一些對于模型沒有影響,或是肉眼非常難察覺到區別的頂點都要盡可能去掉。

(2)LOD技術

LOD技術有點類似于Mipmap技術,不同的是,LOD是對模型建立了一個模型金字塔。根據攝像機距離對象的遠近,選擇使用不同精度的模型,它的好處是可以在適當的時候大量減少需要繪制的頂點數目。它的缺點同樣是需要占用更多的內存,而且如果沒有調整后距離的話,可能會造成模擬的突變。

在unity中,可以通過LOD Group來實現LOD技術。

(3)遮擋剔除(Occlusion culling)技術

遮擋剔除是用來清除躲在其他物件后面看不到的物件,這代表資源不會浪費在計算那么像看不到的頂點上,進而提升性能。

2像素優化

(1)控制繪制順序

像素優化的重點在于減少overdraw。之前提過,overdraw指的就是一個像素被繪制了多次,關鍵在于控制繪制的順序。

Unity還提供了查看overdraw的視圖,當然這里的視圖只是提供了查看物體遮擋的層數關系,并不是真正的最終屏幕繪制的overdraw。也就是說,可以理解為它顯示的是如果沒有使用任何深度檢驗時的overdraw,這種視圖是通過把所有對象都渲染成一個透明的輪廓,通過查看透明顏色的累計程度,來判斷物體的遮擋。

需要控制繪制順序,主要原因是為了最大限度的避免overdraws,也就是同一個位置的像素可以需要被繪制多變。在PC上,資源無限,為了得到最準確的渲染結果,繪制順序可能是從后往前繪制不透明物體,然后再繪制透明物體進行混合。但在移動平臺上,這種會造成大量overdraw的方式顯然是不合適的,我們應該盡量從前往后繪制。從前往后繪制之所以可以減少overdraw,都是因為深度檢驗的功勞。

在unity中,哪些shader中被設置為“Geometry”隊列的對象總是從前往后繪制的,而其它固定隊列的物體,則都是從后往前繪制的。這意味著,我們可以盡量把物體的隊列設置為“Geometry”。而且,我們還可以充分利用unity的隊列來控制繪制順序。

(2)警惕透明物體的使用

對于透明對象,由于它本身的特性決定如果要得到正確的渲染效果,就必須從后往前渲染,而且拋棄了深度檢驗。這意味著,透明物體幾乎一定會造成overdraws。如果我們不注意這一點,在一些機器上可能會造成嚴重的性能損失。例如,對于GUI對象來說,它們大多被設置成了半透明,如果屏幕中GUI占據的比例太多,而主攝像機又沒有進行調整而是投影整個屏幕,那么GUI就會造成屏幕大量的overdraws。

因此,如果場景中有大量的透明對象,或者有很多層覆蓋的多層透明對象(即使它們每個的面積都不大)。或者是透明的粒子效果,在移動設備上也會造成大量的overdraws,這是應該盡量避免的。

對于上述的GUI這種情況,我們可以盡量減少窗口中的GUI所占的面積,如果實在無能為力,我們可以把GUI繪制和三位場景的繪制交給不同的攝像機。而其中負責三位場景的攝像機的視角范圍盡量不要和GUI重疊。對于其他情況,只能說,盡可能少用。當然這樣會對游戲的美觀度產生一定影響,因此我們可以在代碼中對激起的性能進行判斷,例如首先關閉所有的耗費性能的功能,如果發現這個激起表現非常良好,再嘗試開啟一些特效功能。

(3)盡量避免實時光照

實時光照對于移動平臺是個非常昂貴的操作。如果只有一個平行光還好,但如果場景中包含了太多光源并且使用了很多Passes的shader,那么很有可能會造成性能下降。而且在有些機器上,還要面臨shader失效的風險。例如,一個場景里如果包含了三個逐像素的點光源,而且使用了逐像素的shader,那么很可能將Draw Calls提高了三倍,同時也會增加overdraws,這是因為,對于逐像素的光源來說,被這些光源照亮的物體要被再渲染一次。更糟糕的是,無論是動態批處理還是靜態批處理,對于這種逐像素的pass都無法進行批處理,也就是說,它們會中斷批處理。

3帶寬優化

(1)使用Texture Atlas

使用Texture Atlas可以幫助減少Draw Calls,而這些紋理的大小同樣是一個需要考慮的問題。在這之前要提到一個問題就是,所有紋理的長寬比最好是正方形,而且長度值最好是2的整數冪,這是因為很多優化策略只有在這種時候才可以發揮最大的效用。

(2)關于Generate Mip Maps

Generate Mip Maps會為同一張紋理創建出很多不同大小的小紋理,構成一個紋理金字塔,而在游戲中,可以根據距離物體的遠近,來動態選擇使用哪一個紋理。

這是因為,在距離物體很遠的時候,就算我們使用了非常精細的紋理,但肉眼也是分辨不出來的,這種時候完全可以使用更小、更模糊的紋理來代替,而這可以節省大量訪問的像素的數目。但它的缺點是,由于需要為每個紋理簡歷一個圖像金字塔,因此它會需要占用更多的內存。

(3)優化紋理尺寸大小、壓縮格式

紋理尺寸大小:

紋理尺寸大小通過MaxSize設置,它決定了紋理的長寬值,如果我們使用的紋理本身超過了這個最大值,unity會對其進行縮小來滿足這個條件。

這里特別說明一點,所有紋理的長寬比最好是正方形,而且長度值最好是2的整數冪,例如64、128等。這是因為有很多優化策略只有在這種時候才可以發揮最大的效用。

壓縮格式:

壓縮格式通過Format設置,Format負責紋理使用的壓縮格式。通常選擇這種自動模式就可以了。Unity會負責根據不同的平臺來選擇合適的壓縮模式。對于GUI類型的紋理,我們可以根據對畫質的要求來選擇是否進行壓縮。我們還可以根據不同的激起來選擇使用不同的分辨率的紋理,以便讓游戲在某些老機器上也可以運行。例如在安卓平臺上,我們的壓縮模式會采用RGB Compresses ETC 4 Bits。在ios平臺上,我們采用的壓縮模式是RGB Compresses PVRTC4 Bits。

注:手游圈內人整理自創夢天地開發者邵雷的“關于次世代手游美術資源的優化”的主題演講。

總結

以上是生活随笔為你收集整理的次世代手游美术资源优化干货分享的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。