1)Unity性能優(yōu)化分析思路
2)Unity2020后Paticle子節(jié)點(diǎn)旋轉(zhuǎn)并把ScalingMode設(shè)置為Hierarchy后,對(duì)根節(jié)點(diǎn)進(jìn)行縮放時(shí)表現(xiàn)不正常
3)FBX默認(rèn)會(huì)冗余l(xiāng)it.mat、lit.shader如何解決
4)部分手機(jī)(小米12)運(yùn)行時(shí)不時(shí)閃退問(wèn)題
這是第294篇UWA技術(shù)知識(shí)分享的推送。今天我們繼續(xù)為大家精選了若干和開(kāi)發(fā)、優(yōu)化相關(guān)的問(wèn)題,建議閱讀時(shí)間10分鐘,認(rèn)真讀完必有收獲。
UWA 問(wèn)答社區(qū):answer.uwa4d.com
UWA QQ群2:793972859(原群已滿員)
Unity
Q:Unity有多少優(yōu)化點(diǎn)?比如合批:靜態(tài)合批、SRP合批、GPU實(shí)例化、UGUI Reruild、光照烘焙、反射探針、光照探針、Shader.Parse、Shader.CreateGPUProgram、場(chǎng)景加載優(yōu)化和GC優(yōu)化,還有哪些優(yōu)化點(diǎn)?
A1:大方向上可以從CPU、內(nèi)存、GPU這三個(gè)方向切入。
細(xì)分一下可以從CPU、內(nèi)存、渲染、資源優(yōu)化、耗電優(yōu)化、網(wǎng)絡(luò)優(yōu)化、卡頓優(yōu)化、優(yōu)化工具的選擇掌握這幾個(gè)點(diǎn)入手。
一、CPU優(yōu)化
1. 緩存計(jì)算結(jié)果
2. 預(yù)處理
3. 限幀法
4. 主次法
5. 多線程
6. 引擎模塊(動(dòng)畫(huà)、物理、粒子、導(dǎo)航)
7. 邏輯優(yōu)化
二、內(nèi)存優(yōu)化
1. 緩存法
2. 內(nèi)存池
3. 資源管理器
4. 控制GC
5. 邏輯優(yōu)化
6. Shader變體數(shù)量?jī)?yōu)化
三、渲染優(yōu)化
1. SetPassCall渲染狀態(tài)切換頻次控制
2. DrawCall數(shù)量控制
3. 帶寬負(fù)載
4. 顯存占用
5. GPU計(jì)算量
四、卡頓優(yōu)化
1. 降幀法
2. 攤幀法
3. 限制數(shù)量法
4. 邏輯優(yōu)化
5. IO優(yōu)化
6. 使用進(jìn)度條
五、資源優(yōu)化
1. 紋理優(yōu)化
2. UI優(yōu)化
3. 字體優(yōu)化
4. 模型優(yōu)化
5. 場(chǎng)景優(yōu)化
6. 粒子優(yōu)化
7. 材質(zhì)優(yōu)化
8. 指定標(biāo)準(zhǔn)美術(shù)規(guī)范
9. Shader變體數(shù)量?jī)?yōu)化
六、耗電優(yōu)化
上面說(shuō)到的優(yōu)化點(diǎn),或多或少都會(huì)影響到手機(jī)的耗電,也是優(yōu)化耗電的措施,除此之外還有:
1. 動(dòng)態(tài)調(diào)整限幀
2. 動(dòng)態(tài)調(diào)整畫(huà)質(zhì)
七、網(wǎng)絡(luò)優(yōu)化
1. 減少無(wú)用字段
2. 降低字段精度
3. 避免重復(fù)發(fā)送
4. 網(wǎng)絡(luò)異步化
5. 壓縮無(wú)效字節(jié)
6. 壓縮協(xié)議包
以上說(shuō)的這些要點(diǎn),大部分摘抄歸納自《移動(dòng)游戲性能優(yōu)化通用技法》。強(qiáng)烈建議多花些時(shí)間認(rèn)真閱讀一下這篇文章,然后以這篇文章作為指南,再去仔細(xì)研究里面提到的優(yōu)化細(xì)節(jié)該如何展開(kāi)。
感謝馬三小伙兒@UWA問(wèn)答社區(qū)提供了回答
A2:優(yōu)化點(diǎn)肯定是無(wú)窮無(wú)盡的,這里搬運(yùn)UWA的客戶端性能優(yōu)化思路,針對(duì)常見(jiàn)的引擎模塊的相關(guān)問(wèn)題都做了分析,講的是比較全比較透的,常見(jiàn)的優(yōu)化難題都羅列了。
《Unity性能優(yōu)化 — 動(dòng)畫(huà)模塊》
《Unity性能優(yōu)化系列 — 資源內(nèi)存泄漏》
《Unity性能優(yōu)化系列—Lua代碼優(yōu)化》
《粒子系統(tǒng)優(yōu)化——如何優(yōu)化你的技能特效》
《UWA本地資源檢測(cè)更新,助你嚴(yán)守項(xiàng)目性能的每個(gè)角落!》
感謝芭妮妮@UWA問(wèn)答社區(qū)提供了回答
ParticleSystem
Q:Unity 2020后Paticle子節(jié)點(diǎn)旋轉(zhuǎn)并把ScalingMode設(shè)置為Hierarchy后,對(duì)根節(jié)點(diǎn)進(jìn)行縮放時(shí)表現(xiàn)不正常。
在2019及其之前的版本沒(méi)有這個(gè)問(wèn)題。升級(jí)到2020后出現(xiàn)。
子節(jié)點(diǎn)的旋轉(zhuǎn)會(huì)改變對(duì)應(yīng)的縮放軸,如果x軸旋轉(zhuǎn)了-90度,那么根節(jié)點(diǎn)縮放y軸就等于縮放了z軸。
具體見(jiàn)下圖:



A:已找到對(duì)應(yīng)官方答復(fù):
《particle-system-behavior-changes-when-it-is-rotated-or-scaled-in-negative-axis》
2018.3b版本后不建議對(duì)Billboard節(jié)點(diǎn)使用旋轉(zhuǎn)和非統(tǒng)一縮放。
感謝jiacat@UWA問(wèn)答社區(qū)提供了回答
Material
Q:打AssetBundle包發(fā)現(xiàn)會(huì)包含lit.mat、lit.shader,原因是FBX默認(rèn)自帶的,有嘗試下面方法:
1. 代碼設(shè)置 renderer.sharedMaterials = new Material[] ,但是下次再打開(kāi)Unity或Reimport,又變回lit。
2. 監(jiān)聽(tīng)文件變化,發(fā)現(xiàn)是FBX的同上操作,但是這個(gè)在打AssetBundle包時(shí)又報(bào)一些莫名其妙的錯(cuò)誤。
請(qǐng)問(wèn)大家都是怎么處理的?

A1:兩種方式解決這個(gè)問(wèn)題:
一種是美術(shù)在出資源時(shí)直接不導(dǎo)出材質(zhì)資源。
一種是自己在Unity導(dǎo)入資源進(jìn)程里寫(xiě)個(gè)批處理,在導(dǎo)出時(shí)默認(rèn)去除掉這材質(zhì)球。
不管用哪種,都需要導(dǎo)入后,自己在資源上做好策略管理,手動(dòng)的整理好材質(zhì)與Shader的目錄,跟打包的策略對(duì)應(yīng)。這樣可以更好地做好項(xiàng)目規(guī)范,還能為后期資源冗余的問(wèn)題做優(yōu)化。前期能做好這個(gè)規(guī)范,后期關(guān)于資源冗余的問(wèn)題也不會(huì)太頭疼。
感謝廖武興@UWA問(wèn)答社區(qū)提供了回答
A2:在2020.3.17里面有效,不論是ReImport FBX還是重啟Unity,都是有用的:

材質(zhì)球會(huì)變成下面這樣:

感謝Xuan@UWA問(wèn)答社區(qū)提供了回答
Memory
Q:目前只出現(xiàn)在小米12手機(jī),Android系統(tǒng) 12,小米系統(tǒng)13.0.16.0。運(yùn)行后10-20分鐘左右就時(shí)不時(shí)閃退。
Unity版本 2019.4.3f1 L2cpp
E/Unity: Using memoryadresses from more than 16GB of memory
(Filename: /Users/builduser/buildslave/unity/build/Runtime/Allocator/UnityDefaultAllocator.cpp Line: 120)
bool UnityDefaultAllocator::AllocationPage<(RequestType)0>(void const*) const+268) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
UnityDefaultAllocator::RegisterAllocation(void const*)+148) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
UnityDefaultAllocator::Allocate(unsigned long, int)+64) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
MemoryManager::Allocate(unsigned long, unsigned long, MemLabelId const&, AllocateOptions, char const*, int)+308) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
QueueAllocator::QueueAllocator(unsigned int, MemLabelId)+60) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
AsyncUploadManager::ScheduleAsyncRead(AtomicNode*)+280) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
AsyncUploadManager::ScheduleAsyncCommand(AtomicNode*)+48) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
AsyncUploadManager::ScheduleAsyncCommandsInternal()+56) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
AsyncUploadManager::ScheduleAsyncCommands()+56) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
AsyncUploadManager::AsyncResourceUpload(GfxDevice&, int, AsyncUploadManagerSettings const&)+416) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
GfxDeviceWorker::RunCommand(ThreadedStreamBuffer&)+26744) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
GfxDeviceWorker::RunExt(ThreadedStreamBuffer&)+44) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
GfxDeviceWorker::Run()+136) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
GfxDeviceWorker::RunGfxDeviceWorker(void*)+4) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
Thread::RunThreadWrapper(void*)+512) (BuildId: d0b079d6aac2d769613621db6d01af8abf84a793)
A1:Unity發(fā)行日志說(shuō)2019.4.15修復(fù)了這個(gè)問(wèn)題,我們升級(jí)完之后基本不閃退,但是在vivo的安卓12手機(jī)上還是有問(wèn)題,然后又升級(jí)到2019.4.34,目前沒(méi)看到閃退。
感謝大秋衣@UWA問(wèn)答社區(qū)提供了回答
A2:可參考:
感謝Arboo@UWA問(wèn)答社區(qū)提供了回答
封面圖來(lái)源于網(wǎng)絡(luò)
今天的分享就到這里。當(dāng)然,生有涯而知無(wú)涯。在漫漫的開(kāi)發(fā)周期中,您看到的這些問(wèn)題也許都只是冰山一角,我們?cè)缫言赨WA問(wèn)答網(wǎng)站上準(zhǔn)備了更多的技術(shù)話題等你一起來(lái)探索和分享。歡迎熱愛(ài)進(jìn)步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官網(wǎng):www.uwa4d.com
官方技術(shù)博客:blog.uwa4d.com
官方問(wèn)答社區(qū):answer.uwa4d.com
UWA學(xué)堂:edu.uwa4d.com
官方技術(shù)QQ群:793972859(原群已滿員)