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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【厚积薄发】Crunch压缩图片的AssetBundle打包

發(fā)布時間:2024/3/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【厚积薄发】Crunch压缩图片的AssetBundle打包 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這是第133篇UWA技術(shù)知識分享的推送。今天我們繼續(xù)為大家精選了若干和開發(fā)、優(yōu)化相關(guān)的問題,建議閱讀時間10分鐘,認真讀完必有收獲。

UWA 問答社區(qū):answer.uwa4d.com

UWA QQ群:465082844(僅限技術(shù)交流)

?

資源管理

Q:我有一個關(guān)于Crunch壓縮圖片的AssetBundle打包的問題,Unity官網(wǎng)的AssetBundle用法介紹里有一條,就是說因為使用Crunch壓縮之后的圖片,打成AssetBundle包再壓縮,大小也基本不會有變化,還會導致打包慢+使用時候需要解壓,所以建議不要壓縮。

4.6.1. Crunch Compression

Bundles which consist primarily of DXT-compressed textures which use the Crunch compression algorithm should be built uncompressed.

但是我們打AssetBundle的時候,并沒有針對每個AssetBundle選擇壓縮不壓縮的選項,要么所有都壓縮,要么所有都不壓縮。所以按照“使用Crunch壓縮的圖片打包時建議不要壓縮的思路”的話,我想到2種做法:

?

1)所有AssetBundle包都不壓縮,不知道這會不會導致Texture以外的資源的AssetBundle包變大很多,如果有用過的人希望介紹下經(jīng)驗。

2)先用LZ4打所有包,然后備份AssetBundleManifest文件,再用不壓縮方式打Crunch壓縮的圖片包,打完把之前備份的AssetBundleManifest覆蓋回來,感覺這種做法有點怪,還會導致圖片的AssetBundle包要打2次,延長打包時間。

想問一下有沒有更好的做法?還是說只要不壓縮就可以了?

A1:有時候有些選擇的確比較糾結(jié)。讓我選擇的話可能直接都用LZ4的方式,畢竟LZ4自身犧牲了壓縮率換取了“does not require the entire bundle to be decompressed before use”這種優(yōu)勢。Crunch壓縮之后的貼圖沒有什么壓縮空間,但是在LZ4中解壓的時間也不是很長(具體需要題主自己測試下)。

AssetBundle不壓縮我感覺是不太能接受的,之間簡單看過整個包體會大挺多的,這個題主用你們工程試一下就知道了。兩遍打包的過程,個人是覺得性價比比較低,而且可能隱含一些坑需要花點時間踩。對于打包來說,越簡單的流程肯定越好。

因為用的項目還在Unity 5.6的版本,所以沒有做過Crunch的相關(guān)測試,建議題主除了問大家的建議之外,也可以自己做測試真正驗證下,比如確定下完全不壓縮對于包體的影響,使用LZ4壓縮和不壓縮貼圖對于加載的時長影響。相信有最真實的測試數(shù)據(jù)會讓題主做決策時更加放心。

感謝賈偉昊@UWA問答社區(qū)提供了回答

A2:兩種策略:

1)LZ4壓縮,打包時間在可接受范圍之內(nèi);
2)AssetBundle不壓縮,將打包好的AssetBundle進行zip壓縮,游戲第一次初始化時,解壓縮到可讀寫目錄,這樣Unity直接讀取未壓縮的AssetBundle文件,也方便以后做統(tǒng)一的熱更新管理。

感謝鄭驍@UWA問答社區(qū)提供了回答

A3:樓上說的兩種方式是主流方式,LZ4在包體和加載速度上有個好的平衡。自己壓縮然后解壓到可讀寫目錄,用CreateFromFile方式加載,在內(nèi)存和效率上都有優(yōu)勢,代價就是前面會有很長時間的解壓過程,這個時候要給出界面響應(yīng),聽聞如果時間過長沒有游戲內(nèi)容畫面蘋果爸爸可能會通不過。

感謝趙林@UWA問答社區(qū)提供了回答

該問答來自UWA問答社區(qū),歡迎大家轉(zhuǎn)至社區(qū)交流:

https://answer.uwa4d.com/question/5bc94e4b8af62a50acb8e0fd

?

?

渲染

Q:我使用MeshBaker,把全場景的同Shader物件,在合并Mesh總面數(shù)64K范圍內(nèi),盡量合在一起。合并完Mesh后發(fā)現(xiàn)場景的DrawCall降低了, 但是發(fā)現(xiàn)Stats面板中面數(shù)翻了倍。貌似相機的視錐體剔除功能對MeshBaker合批完之后的無效。求教這個問題怎么破解?

A1:CPU送給GPU渲染之前的最小的單元是一個Mesh(或者一個Submesh?),所以如果你手動合并了Mesh,就意味著面數(shù)很大可能上會變多,這個是面數(shù)和DrawCall之間的取舍,所以建議根據(jù)項目瓶頸來選擇一個合適的均衡點。

我們用的是Unity的Static Batch,可以降低Batches,面數(shù)不會增長,原理是合并成Submesh,并且進行排序,然后根據(jù)鏡頭依據(jù)Submesh進行裁剪。當然也有代價,包體和內(nèi)存大小可能會多一些,然后因為只是做排序,會因為動態(tài)陰影等宏的設(shè)定導致被Batch被打斷。

簡答做個測試驗證:2個Cube,合并之后:

?

旋轉(zhuǎn)相機,視角內(nèi)只有一個的情況下:

Demo比較簡單,只做之前觀點的驗證,題主可以自己再做一個復雜的Demo來驗證下。

天下沒有免費的午餐。大部分優(yōu)化都是有代價的,都是用另外的東西來換取,只是代價的性價比不同罷了。

感謝賈偉昊@UWA問答社區(qū)提供了回答

A2:如樓主所言,這時一個客觀存在的事實。所以我會選擇如下方案:

放棄靜態(tài)批處理,進行手動合并,合并的方案根據(jù)視野距離分塊,將小塊中的Mesh在場景Load的時候進行合并,這樣DrawCall數(shù)會增加,但不是很多,三角形會大量減少。

感謝鄭驍@UWA問答社區(qū)提供了回答

A3:補充樓上,手工合并是會存在這個問題,但手工合并的時候可以自己控制粒度,但還是會帶來不靈活的問題。Static Batch存在內(nèi)存問題和包體增大的問題。

Unity提供了一種可以運行時合并的API StaticBatchingUtility.Combine,有兩個重載
public static void Combine(GameObject staticBatchRoot);
public static void Combine(GameObject[] gos, GameObject staticBatchRoot);
可以使用這個API控制合并粒度,相當于靜態(tài)合批,這個可以不增大包體,代價是內(nèi)存和CPU開銷。正如樓上說的,天下沒有免費的午餐,優(yōu)化大多時候是要付出另外的代價。

感謝趙林@UWA問答社區(qū)提供了回答

該回答來自UWA問答社區(qū),歡迎大家轉(zhuǎn)至社區(qū)交流:

https://answer.uwa4d.com/question/5bc951798af62a50acb8e0fe

?

內(nèi)存

Q:我有個2018.2.13f1版本上用WWW加載AssetBundle的內(nèi)存疑問。WWW加載內(nèi)存記錄如下:

初始:


www下載中:


www.assetbundle調(diào)用之后:

?

www.dispose之后

?

ab.unload之后

?

www.assetbundle調(diào)用之后,Mono增長36MB,Unity增加26.1MB, 這個26.1MB怎么理解?下載的AssetBundle文件是UnCompressed,大小36MB;

?

UWA:通過在群里跟題主要了LZ4和LZMA的內(nèi)存測試數(shù)據(jù),我們發(fā)現(xiàn)如下表格的內(nèi)存統(tǒng)計在2018(也許2017.4)上已經(jīng)不太準確了。

?以題主的New WWW加載為例,在之前的加載36MB的UnCompressed AB時,其內(nèi)存是36+36=72MB,而現(xiàn)在則是36+36+26=98MB

之前的72MB是全部統(tǒng)計在Unity中,現(xiàn)在是62MB在Unity中,而36MB在Mono中體現(xiàn)。

之所以出現(xiàn)這種情況,是因為Unity引擎在新版本中(暫時還無法考證具體是從2017哪個版本開始),New WWW加載AB會走www.bytes這個操作,然后通過LoadFromMemory來進行加載。這也是為什么36MB的Uncompressed在加載后,Mono會增加36MB,而后LZ4和LZMA的AB加載,Mono也都會增加與其Size一樣的大小。

同時,多出來的26MB是由LoadFromMemory加載導致的,這里有個遺漏點需要補充下,即無論是36MB的UnCompressed AssetBundle還是10MB的LZMA?AssetBundle,其www.assetbundle調(diào)用后,其Unity內(nèi)存一項的增幅均為26MB,而如果是20MB的LZ4 AB的內(nèi)存增幅則為20MB。這里面有兩種推測。

1)LZ4 的AssetBundle bytes通過LoadFromMemory加載時,則直接轉(zhuǎn)換成LZ4的AssetBundle來進行使用;而UnCompressed和LZMA則會被壓縮成類似于LZ4的其他參數(shù)格式,所以內(nèi)存會有所偏差。

2)無論是哪種壓縮格式的bytes,都是轉(zhuǎn)成LZ4格式,但UnCompressed和LZMA格式的數(shù)據(jù)是需要進一步執(zhí)行數(shù)據(jù)轉(zhuǎn)換的,因此,需要開辟一個Buffer來進行轉(zhuǎn)換,所以多出來的6~7MB是Buffer所致。

當然,以上兩種是在沒有源碼查看的情況下來進行推測的,個人比較傾向于第一種,但不排除有其他更多原因存在。后續(xù),關(guān)于其他AssetBundle API的加載方式我們也都會進行大量測試,看來有很多內(nèi)容需要更新了,如果社區(qū)其他朋友有做過類似測試或看過其他文章,也非常歡迎來進行指正和分享。

該回答由UWA提供,歡迎大家轉(zhuǎn)至社區(qū)交流:

https://answer.uwa4d.com/question/5bcd3f4d01a33650b1f88981

UI

Q:目前我們在做臺灣版本的多語言適配,也就是將簡體版的改為繁體版的,目前不考慮圖片尺寸的問題。目前需要適配的范圍有:策劃文字、UI文字、UI的單圖、策劃配置的單圖、UI圖集、策劃配置的圖集、UI Prefab、角色以及角色技能和特效。

關(guān)于策劃文字和UI文字,我們都通過導入導出表格解決了,目前還剩下各種各樣的圖片,然后關(guān)于單圖部分,在切換語言的時候,我遍歷所有用到這些單圖的Prefab、Asset,將引用修改為多語言版本的圖片,也算是解決了。目前還剩下圖集部分,我現(xiàn)在有兩個想法:

一個是修改打圖工具,在打圖的時候篩選出不同語言的圖片,選擇當前語言的打包成一個圖集,好處就是維護簡單,不需要維護多份不同語言的圖集,壞處就是打圖的過程相對較慢,每次切換語言時間很長,然后不直觀,不能對比兩張圖集之間的區(qū)別。

另一個方法就是,打兩份圖集,通過后綴來區(qū)分不同的語言,然后效仿單圖的多語言解決方案,修改引用,好處就是打好了圖片,如果沒有修改不需要在切換的時候重新打包圖片,速度快,方便對比,壞處就是需要維護兩份圖集,修改無多語言的圖片需要同時修改兩份圖集,比較麻煩。

A1:我們沒有其他語言的圖集,做法是把圖集中帶文字的圖片拆出來用Texture來根據(jù)語言加載,以后的新項目是從設(shè)計上規(guī)范不把帶文字的圖片放入圖集。多份圖集的問題是,如果要動態(tài)切換語言,還需要切換對應(yīng)圖集,資源和內(nèi)存的冗余都需要考慮。

感謝林健@UWA問答社區(qū)提供了回答

A2:我們使用AssetBundle變種機制做的多語言,預(yù)設(shè)、圖集、紋理都可以做變種,基本可以應(yīng)對各種需求。好處是拖上去的引用不用換,Unity變種機制幫你搞定,壞處是有一個大硬傷編輯器下無法直接預(yù)覽,必須先構(gòu)建AssetBundle。

感謝littlesome@UWA問答社區(qū)提供了回答

A3:多語言版本不僅會涉及到圖片及文字替換,也會出現(xiàn)排版問題,例如阿拉伯語。所以在設(shè)計上盡量居中顯示并排版,這樣問題是向兩邊擴散的,減少文字過長被遮擋的問題。多語言有些游戲是在游戲內(nèi)切換,所以我會在游戲中加入對應(yīng)的type,在資源加載時進行區(qū)分。

Prefab的引用可以如題主所述修改。圖集規(guī)劃可以解決大部分問題,但是部分細碎圖片,我會選擇打包成大圖集,做好映射關(guān)系表,在動態(tài)加載時進行區(qū)分加載,避免對原資源造成過大改動。

感謝鄭驍@UWA問答社區(qū)提供了回答

A4:以前我做的時候是文本,圖集,Prefab,Audio等各種分開考慮,需要注意的問題就是各種語言的長度不同導致的排版,圖集下各種語言放到一起然后打AsseBundle的時候做語言篩選,多語言圖大小可能也存在不同,要注意圖集的規(guī)劃,不要出現(xiàn)分成兩個圖集的情況等。

現(xiàn)在我傾向的方案是用AssetBundle變種機制,這個要解決編輯器下預(yù)覽問題,我們在編輯器模式和機器上走的加載流程不同,編輯器模式下走的加載Prefab顯示,所以預(yù)覽這個問題對我們項目來說并不存在。

感謝趙林@UWA問答社區(qū)提供回答

該回答來自UWA問答社區(qū),歡迎大家轉(zhuǎn)至社區(qū)交流:

https://answer.uwa4d.com/question/5bc5ae0d5c3fd06b3442ddc3

?

UI

Q:UGUI字體加粗后Android真機并沒有加粗而且加寬導致文字重疊,網(wǎng)上沒有找到解決方案。不知道該如何解決。

UWA:假如你用msyh,那你需要在資源里面同時放上msyh以及msyhbd,這樣才能在UGUI中使用msyh的粗體,不然你得到的只有Unity自己加粗了的msyh。

該回答由UWA提供,歡迎大家轉(zhuǎn)至社區(qū)交流:

https://answer.uwa4d.com/question/5bc59e7d5707da4d53bc3633

?今天的分享就到這里。當然,生有涯而知無涯。在漫漫的開發(fā)周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網(wǎng)站上準備了更多的技術(shù)話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之“石”,也能攻你之“玉”。

?

轉(zhuǎn)載于:https://www.cnblogs.com/uwa4d/p/9844497.html

總結(jié)

以上是生活随笔為你收集整理的【厚积薄发】Crunch压缩图片的AssetBundle打包的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。