CocosCreator客戶端優化系列(一):加載優化(上)


原文鏈接:https://blog.csdn.net/zzx023/article/details/85053758

最近打算花點時間,把客戶端這邊常用的一些優化方法總結一下,分享出來。計划大概分為四個部分:加載優化、渲染優化、內存優化、CPU占用以及性能優化。這些措施每一個都會帶來多方面的優化效果,但也有部分措施擁有一定的局限性,因此需要各位理解后根據項目實際情況選擇使用。

 

首先是關於加載方面的優化。

 

 

-圖片資源的處理


避免大尺寸的圖片出現。像下面這樣的圖片

 

 


其實常常我們的項目當中會出現這樣的資源,其實這樣的圖源完全可以通過九宮格的方式進行拉伸得到,因此我們的資源其實只需要像下面這張圖一樣就行

 

 

 

         這樣一個方面圖片的大小變小了,我們在進行加載時自然速度將會加快。另一方面也會帶來內存的減少以及包體的減少。

 

         另外有一點也要格外注意,cocos creator所支持的最大圖片尺寸為2048*2048,超過這個尺寸的圖片在顯示時會有問題,常見於一些Spine動畫打包出來后沒注意資源圖片尺寸,導致動畫顯示異常。

         如果是地圖資源超過2048*2048,常見於一些mmo項目,這種情況下,需要對地圖資源進行切分,切分成小於2048*2048的若干圖片,在游戲中再拼接在一起。當然這樣拼接的話在攝像機或者地圖移動時可能會有白邊出現,需要特殊處理,這里就不詳細說了。

 

 

 

 

另外,類似這樣的圖片資源也是需要避免的,雖然 每個數字的顏色都不一致,但其實都可以通過程序改變color的方法去達到,只需要使用時美術告知字號即可,沒必要每一個顏色就出一張圖,導致每次顯示不同顏色字體時,還需要進行額外的加載。同時也帶來內存和包體的提升。

 

圖片資源的模塊化

 

 

 

 


類似這樣,將各個界面的美術資源、幀動畫分類並且打包成圖集也是比較好的處理方法,將資源進行模塊化。這樣在加載時,以及游戲運行時,會有以下幾點好處:

提升加載速度
       省去了多次打開/關閉文件所帶來的時間損耗

     2.減少文件的體積

      多張圖片合並到一起,在包體上面會有一定的優化

     3.減少DrawCall

       使用時,由於這些美術資源都是一起配合使用的,因此放在一張圖集中,可以減少渲染的DrawCall數量,對渲染的性能也有優化的作用。

 

同時在不需要使用這些資源時,比如說某個界面 不需要再顯示時,可以將這個界面的資源統一釋放,避免占用內存。

另外通用資源可以統一打包在一張圖集中,讓這些通用的常用資源常駐與內存,方便使用。避免頻繁的重復釋放和加載。

 

另外關於圖集的使用,在creator 2.x以上版本,支持TexturePacker的多邊形圖集。

 

 

 

也就是支持圖集輸出時,TrimMode為Polygon,這個模式的像素填充率將會更高,打包出來的圖集尺寸將會更小一些。

 

不過這個模式需要付費版的texturePacker才能使用。

 

圖片、紋理壓縮
圖片壓縮
首先時圖片資源的壓縮處理,這一塊和程序代碼無關,對加載速度影響也不大,但是可以帶來包體上具體的提升,因此也放在這里說一說。例如下面的圖片,原圖的大小時1M左右,我們通過選擇合適的pixelformat以及合適的抖動算法(有仿色),可以將圖片壓縮到198kb,整體圖片體積壓縮了80%,同時畫質上面的損耗並不明顯,可以接受。

 

 

 

 

在這里要說明一下PNG圖片的rgba顏色對於圖片效果的影響:

 

 

 

比如RGBA8888這種pixelformat,它意味着rgba每一位占用8個bit,這樣每個像素占用4個字節,因此這個壓縮模式對於圖片可以最大限度的保真,但壓縮比方面不大。

這里要注意的是,這個大小指的是圖片占用的包體大小,也就是文件的大小,並不是圖片在內存中的大小。

關於內存的大小,需要注意的是,和文件的大小沒有直接的關系。只和圖片的長寬尺寸,也就是像素數量有關系。

比如一張500k大小的1024*1024的圖片,在內存中的占用大小為1024*1024*4 = 4M。

同樣一張進行圖片壓縮的500k大小的2048*2048的圖片,在內存中的占用大小為2048*2048*4 = 16M。

這一塊要注意避免概念上的混淆。

 

當然也有一些我們可以很簡單快速使用的一些壓縮工具,在這里推薦給大家:

一個是https://pngquant.org/  pngquant的命令行壓縮圖片,可以很好的集成到打包工具中。

 

 

 

官方宣稱是由73%的壓縮,實際達不到,但壓縮效果也是很好的了。

另外一個是TinyPNG,https://tinypng.com/一個在線壓縮圖片的網站,壓縮比同樣可觀,同時對於圖片的損耗很細微,基本看不出來。當然在線壓縮對於圖片的大小有一些限制,TinyPNG還提供了一個PS的插件,使用插件就可以在導出圖片的時候隨意進行壓縮了

 

 

 

PVR壓縮紋理
PVR紋理格式是針對iOS設備進行了特殊優化的一種紋理格式,這種紋理格式可以直接被PowerVR顯卡所加載,因此在加載速度上可以帶來巨大的提升。同時在內存方面也可以帶來很大的優化。如果你的項目內存占用特別多,並且圖片資源沒有做過優化的,可以嘗試使用壓縮紋理。

但要注意的是壓縮紋理是一定會帶來圖片上面的畫質損失的,因此要根據實際的需求選擇影響不大的素材進行使用。

常用的PVR壓縮紋理的格式分為四種:PVRCT2 RGBA、PVRCT2 RGB、PVRCT4 RGBA、PVRCT4 RGB。區別在於帶不帶透明通道以及每個像素占用的大小。

PVRCT2,每個像素占用2bit。而PVRCT4,每個像素占用4bit。

例如一張2048*2048的圖片,在內存中是16M

 

 

 

而如果我們使用了PVRCT2 RGBA模式進行壓縮的話,他的內存大小為 2048*2048*2 / 8 = 1M

 

 

 

 

 

 

如果你的圖片想要最大限度的保真,同時使用PVR壓縮紋理,那你可以使用PVRCT4 RGBA這種模式進行壓縮。

如果你的圖片是純色的UI按鈕圖片,沒有透明元素。可以嘗試使用PVRCT2 RGB模式。

 

如果大家使用TexturePacker的話,可以在右下角很清楚快速的了解到這張圖片在內存中的實際大小

 

 

 

 

 

ETC壓縮紋理
iOS使用的是PVR,而android使用的壓縮紋理就是另一種了,那就是ETC

需要注意的是PVR只能在iOS上使用,而ETC的話,ETC1只能在android上使用。ETC2可以在目前的iOS上和android上同時使用,不過太低端的機子就不行了。

 

目前creator只支持ETC1 的模式。由於ETC1不支持透明通道,對於有透明度的圖片,一般會使用ETC RGB + ETC Alpha的辦法,輸出成兩張圖,然后在程序中通過混合進行實現。

 

 

 

例如上面這張圖片,如果使用ETC的話,需要輸出成下面的這樣:

 

 

 

 

如果實在懶得區分版本,分別使用PVR和ETC1,只想使用ETC2的話。那么要不就是等一等,官方的支持版本應該就快了。另外實在等不及的話就是自己對引擎進行定制。具體的定制方法可以參考這個鏈接:

https://forum.cocos.com/t/cocos-etc2/49061

 

2.1壓縮紋理
Cocos creator從最近發布的2.1版本開始,也支持了構建時自動進行紋理的壓縮。

如果在構建時需要對某一張圖片進行壓縮,可以在資源管理器中選中這張圖片,然后在屬性管理器中對圖片的紋理格式進行編輯。

 

 

 

Cocos Creator 在構建圖片的時候,會查找當前圖片是否進行了壓縮紋理的配置,如果沒有,則繼續查找是否做了默認(Default)的配置,如果沒有,則最后按原圖輸出。

如果查找到了壓縮紋理的配置,那么會按照找到的配置對圖片進行紋理壓縮。在一個平台中可以指定多種紋理格式,每種紋理格式在構建時都會根據原圖壓縮生成一張指定格式的圖片。

這些生成的圖片不會都被加載到引擎中,引擎會根據 cc.macro.SUPPORT_TEXTURE_FORMATS 中的配置來選擇加載合適格式的圖片。cc.macro.SUPPORT_TEXTURE_FORMATS 列舉了當前平台支持的所有圖片格式,引擎加載圖片時會從生成的圖片中找到在這個列表中 優先級靠前(即排列靠前)的格式來加載。

用戶可以通過修改 cc.macro.SUPPORT_TEXTURE_FORMATS 來自定義平台的圖片資源支持情況以及加載順序的優先級

具體可以參考官方文檔:

https://docs.cocos.com/creator/2.1/manual/zh/asset-workflow/compress-texture.html

 

目前creator 2.1對於自動構建壓縮紋理的支持如下:

 

 

 

 

ETC1需要手動壓縮。ETC2需要自行定制。

 

下半部分的內容預告:

Prefab加載優化
場景加載優化
資源批量加載優化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM