1)Android平臺(tái)壓縮紋理ETC2 VS ASTC
2)Unity使用Profiler和UWA內(nèi)存差異巨大
3)Unity 2020 IL2CPP打包異常
4)TouchScreenKeyboardWrap在PC模式下打包報(bào)錯(cuò)
這是第301篇UWA技術(shù)知識(shí)分享的推送濒旦。今天我們繼續(xù)為大家精選了若干和開發(fā)贡避、優(yōu)化相關(guān)的問題,建議閱讀時(shí)間10分鐘鹦聪,認(rèn)真讀完必有收獲。
UWA 問答社區(qū):answer.uwa4d.com
UWA QQ群2:793972859(原群已滿員)
Texture
Q:1.2022年在Android平臺(tái)的ASTC支持度怎么樣了惑朦,預(yù)計(jì)2023年上的游戲能不能上ASTC乖坠?
1.1 跟iOS統(tǒng)一方便處理
1.2 更多選擇控制壓縮比例 44->1212
1.3 效果比ETC2更好
1.4 ASTC有沒有什么坑,看到有說華為部分機(jī)器不支持锰悼,會(huì)黑屏
網(wǎng)上只找到下面這個(gè)數(shù)據(jù)柳骄,2020年9月,ASTC 77%箕般。
https://developer.android.google.cn/guide/app-bundle/asset-delivery/texture-compression?hl=zh-cn
2.我理解的壓縮紋理是CPU不用解壓耐薯,直接傳輸給GPU,直接GPU硬件采樣隘世。相對于采樣ARGB32格式可柿,采樣壓縮紋理的消耗是不是更高點(diǎn),還是可以忽略不計(jì)丙者?
3.移動(dòng)平臺(tái)紋理是否是2份复斥?CPU一份,GPU顯存一份械媒,還是共享同一份目锭?
4.ASTC/ETC2的壓縮紋理尺寸是否需要2的冪?網(wǎng)上有些說法是非2的冪紋理加載到顯存的時(shí)候會(huì)進(jìn)行轉(zhuǎn)換成2的冪纷捞,轉(zhuǎn)換過程耗時(shí)痢虹,會(huì)導(dǎo)致卡頓。
https://blog.csdn.net/linxinfa/article/details/108827197
我做過以下測試:
1.AssetBundle內(nèi)的紋理尺寸是原始尺寸主儡。
2.Mumu模擬器+GPA紋理尺寸是原始尺寸奖唯,格式轉(zhuǎn)換成了ARGB32。
3.Adreno+高通真機(jī)糜值,目前還在測試丰捷,找的機(jī)器連不上Adreno Profiler。
A1:我2017年立項(xiàng)的時(shí)候跟你一樣處理過這個(gè)問題寂汇,我當(dāng)時(shí)的策略是主包使用ASTC病往,啟動(dòng)更新的時(shí)候判斷玩家是否支持ETC2,不支持的話下載ETC2版本的AssetBundle資源骄瓣。資源在線上是完全獨(dú)立的2份資源(打包的時(shí)候每次打包2份獨(dú)立資源)停巷。當(dāng)年是為了海外做的這個(gè)兼容。經(jīng)過這幾年各個(gè)大廠的洗禮,直接ASTC就行了畔勤。如果你們的游戲類型一定要下探到那么老的機(jī)器蕾各,就像我那種雙保險(xiǎn)的做法。
1. 黑屏的問題沒遇到硼被。ETC2反而因?yàn)閴嚎s算法不好示损,部分顏色失真,導(dǎo)致你在做部分PBR效果的時(shí)候嚷硫,會(huì)有問題检访。
2. 需要硬件支持,就是因?yàn)椴荒苡肅PU去處理這種軟解壓跟軟壓縮仔掸,可以忽略脆贵。
3. 移動(dòng)平臺(tái)GPU跟CPU是共享一個(gè)內(nèi)存,但是GPU會(huì)獨(dú)立開辟一份內(nèi)存起暮,所以會(huì)有2份卖氨。開啟了Mipmap的情況下不是單純的2份相同內(nèi)存,所以還有Texture Streaming這種方式來減少貼圖內(nèi)存占用负懦。
4. ASTC不需要筒捺。
至于你的測試:
Mumu模擬器在《楚留香》出來的時(shí)候就支持ASTC,后面吃雞游戲風(fēng)靡的時(shí)候更是所有模擬器都支持了纸厉,不支持的都要被淘汰系吭。這塊可以不用考慮。如果不是單獨(dú)為了發(fā)行模擬器渠道颗品,大部分情況下肯尺,發(fā)行公司都是要求禁用模擬器登錄的。
感謝簡單就好@UWA問答社區(qū)提供了回答
A2:1. 關(guān)于ASTC的支持度躯枢,題主查的數(shù)據(jù)本身可以作為參考则吟,但還需要結(jié)合考慮項(xiàng)目發(fā)行的市場。比如實(shí)際上對于中國市場而言ASTC的覆蓋率已經(jīng)非常高锄蹂,而對于東南亞南美等海外市場則還要酌情氓仲;
2. 常見的壓縮紋理是直接降低紋理資源質(zhì)量,以質(zhì)量換性能的行為得糜,它不會(huì)在GPU端重新解壓縮敬扛,相反在內(nèi)存、帶寬等方面都有所優(yōu)化掀亩;
3. 只有當(dāng)紋理資源需要運(yùn)行時(shí)修改、開啟了Read/Write Enable選項(xiàng)時(shí)欢顷,才會(huì)向CPU復(fù)制一份槽棍,否則就只有GPU的一份;
4. ASTC對分辨率沒有需求;ETC2要求分辨率為4的倍數(shù)炼七,而非2的次冪缆巧;特別地,不論是ASTC還是ETC2豌拙,如果開啟了Mipmap陕悬,則必須是2的次冪,否則同樣會(huì)壓縮失敗按傅。
感謝Faust@UWA問答社區(qū)提供了回答捉超,歡迎大家轉(zhuǎn)至社區(qū)交流:
https://answer.uwa4d.com/question/62a15f62b87a45735173440e
Memory
Q:Unity使用Profiler和UWA內(nèi)存差異為何差別這么大?
A:Profiler顯示的是引擎真實(shí)的分配內(nèi)存唯绍,但這個(gè)內(nèi)存在OS中并不僅僅是這些拼岳,它會(huì)分配更多的內(nèi)存Page,而且不同的OS版本况芒,不同的廠商分配的都不一樣惜纸。
同時(shí),OS層還會(huì)啟動(dòng)很多自身的Lib绝骚,比如渲染相關(guān)的庫耐版、文件加載的加速庫等等,這些內(nèi)存的分配压汪,都是Unity統(tǒng)計(jì)不到的粪牲。
除此之外,還有虛擬機(jī)的第三方庫蛾魄,比如Lua等虑瀑,這些的內(nèi)存是會(huì)被統(tǒng)計(jì)到PSS中,但不會(huì)被統(tǒng)計(jì)到Profiler中滴须,游戲啟動(dòng)時(shí)的各種渠道庫舌狗,也是如此。
所以扔水,PSS比Reserved大是正常的痛侍。
但如果你發(fā)現(xiàn)PSS比Reserved大了快2倍了,那一定是大家某些庫的內(nèi)存分配過大魔市,比如Lua主届、Wwise或其他大家使用的第三方庫。
感謝芭妮妮@UWA問答社區(qū)提供了回答待德,歡迎大家轉(zhuǎn)至社區(qū)交流:
https://answer.uwa4d.com/question/62a064d0b87a457351727eee
Android
Q:Unity版本2020.2.3君丁,在IL2CPP打包Android的編譯過程報(bào)錯(cuò),因?yàn)轫?xiàng)目中用的Puerts框架将宪,需要生成很多Wrap類绘闷。如果打包時(shí)勾選Split Application Binary橡庞,也用OBB分包情況下,使用Unity可以直接導(dǎo)出到APK和OBB印蔗。但如果不勾選扒最,編譯會(huì)報(bào)錯(cuò)。
同樣不勾選Split Application Binary华嘹,在Build時(shí)吧趣,Export Project導(dǎo)出到AndroidStudio工程再生成APK也不會(huì)有問題。請問有遇到過這樣的問題嗎耙厚?
Exception: Unity.IL2CPP.Building.BuilderFailedException: D:\DevEnvironment\android-ndk-r19\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++ @“C:\Users\Administrator\AppData\Local\Temp\tmp30FE.tmp” -o “D:\workroot\Crusher\Crusher\Library\il2cpp_android_arm64-v8a\il2cpp_cache\linkresult_B322E1396ADEEC5519CBECC8D02E669C\libil2cpp.so” -shared -Wl,-soname,libil2cpp.so -Wl,–no-undefined -Wl,-z,noexecstack -Wl,–gc-sections -Wl,–build-id -stdlib=libc++ -static-libstdc++ -target aarch64-linux-android21 -Wl,–wrap,sigaction “D:\Softwares\Unity2020.2.3f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Development\StaticLibs\arm64-v8a\baselib.a” -llog -rdynamic -fuse-ld=bfd.exe
A1:嘗試增加JVM的內(nèi)存,或者指定一個(gè)NDK版本颜曾。
感謝廖武興@UWA問答社區(qū)提供了回答
A2:推測可能是靜態(tài)數(shù)組太大了纠拔,編譯器的內(nèi)存模型不夠》汉溃可以自己添加IL2CPP的編譯選項(xiàng)稠诲,注意下這個(gè):
additional relocation overflows omitted from the output
感謝thrt520@UWA問答社區(qū)提供了回答
A3:看上去是NDK那邊失敗了,可以嘗試一下不要勾選Development Build诡曙,可能是生成的二進(jìn)制文件太大導(dǎo)致的奔潰臀叙。
感謝蕭小俊@UWA問答社區(qū)提供了回答
A4:親測Maximun JVM heap size,MBytes增加JVM內(nèi)存有效:
感謝題主Bomber@UWA問答社區(qū)提供了回答价卤,歡迎大家轉(zhuǎn)至社區(qū)交流:
https://answer.uwa4d.com/question/60892a236bb31032f9791493
Script
Q:在Android下可以劝萤,切換到PC打包的時(shí)候就報(bào)錯(cuò)了。請問這是什么意思慎璧?如何解決呢床嫌?
A:有文檔介紹說:Only native iPhone, Android, and Windows Store Apps are supported. 所以加個(gè)宏處理一下就可以了。
https://docs.unity3d.com/ScriptReference/TouchScreenKeyboard.html
感謝張迪@UWA問答社區(qū)提供了回答胸私,歡迎大家轉(zhuǎn)至社區(qū)交流:
https://answer.uwa4d.com/question/62903ab6b87a45735165da5f
封面圖來源于網(wǎng)絡(luò)
今天的分享就到這里厌处。當(dāng)然,生有涯而知無涯岁疼。在漫漫的開發(fā)周期中阔涉,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網(wǎng)站上準(zhǔn)備了更多的技術(shù)話題等你一起來探索和分享捷绒。歡迎熱愛進(jìn)步的你加入瑰排,也許你的方法恰能解別人的燃眉之急;而他山之“石”暖侨,也能攻你之“玉”椭住。
官網(wǎng):www.uwa4d.com
官方技術(shù)博客:blog.uwa4d.com
官方問答社區(qū):answer.uwa4d.com
UWA學(xué)堂:edu.uwa4d.com
官方技術(shù)QQ群:793972859(原群已滿員)