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í)閃退問題
這是第294篇UWA技術(shù)知識(shí)分享的推送侯谁。今天我們繼續(xù)為大家精選了若干和開發(fā)、優(yōu)化相關(guān)的問題章钾,建議閱讀時(shí)間10分鐘墙贱,認(rèn)真讀完必有收獲。
UWA 問答社區(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)畫、物理役拴、粒子糊探、導(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)化
上面說到的優(yōu)化點(diǎn)瞪慧,或多或少都會(huì)影響到手機(jī)的耗電,也是優(yōu)化耗電的措施部念,除此之外還有:
1. 動(dòng)態(tài)調(diào)整限幀
2. 動(dòng)態(tài)調(diào)整畫質(zhì)
七弃酌、網(wǎng)絡(luò)優(yōu)化
1. 減少無用字段
2. 降低字段精度
3. 避免重復(fù)發(fā)送
4. 網(wǎng)絡(luò)異步化
5. 壓縮無效字節(jié)
6. 壓縮協(xié)議包
以上說的這些要點(diǎn),大部分摘抄歸納自《移動(dòng)游戲性能優(yōu)化通用技法》儡炼。強(qiáng)烈建議多花些時(shí)間認(rèn)真閱讀一下這篇文章妓湘,然后以這篇文章作為指南,再去仔細(xì)研究里面提到的優(yōu)化細(xì)節(jié)該如何展開乌询。
感謝馬三小伙兒@UWA問答社區(qū)提供了回答
A2:優(yōu)化點(diǎn)肯定是無窮無盡的榜贴,這里搬運(yùn)UWA的客戶端性能優(yōu)化思路,針對(duì)常見的引擎模塊的相關(guān)問題都做了分析妹田,講的是比較全比較透的唬党,常見的優(yōu)化難題都羅列了。
《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問答社區(qū)提供了回答
ParticleSystem
Q:Unity 2020后Paticle子節(jié)點(diǎn)旋轉(zhuǎn)并把ScalingMode設(shè)置為Hierarchy后,對(duì)根節(jié)點(diǎn)進(jìn)行縮放時(shí)表現(xiàn)不正常房铭。
在2019及其之前的版本沒有這個(gè)問題驻龟。升級(jí)到2020后出現(xiàn)。
子節(jié)點(diǎn)的旋轉(zhuǎn)會(huì)改變對(duì)應(yīng)的縮放軸缸匪,如果x軸旋轉(zhuǎn)了-90度翁狐,那么根節(jié)點(diǎn)縮放y軸就等于縮放了z軸。
具體見下圖:
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問答社區(qū)提供了回答
Material
Q:打AssetBundle包發(fā)現(xiàn)會(huì)包含lit.mat露懒、lit.shader闯冷,原因是FBX默認(rèn)自帶的,有嘗試下面方法:
1. 代碼設(shè)置 renderer.sharedMaterials = new Material[] 懈词,但是下次再打開Unity或Reimport蛇耀,又變回lit。
2. 監(jiān)聽文件變化坎弯,發(fā)現(xiàn)是FBX的同上操作纺涤,但是這個(gè)在打AssetBundle包時(shí)又報(bào)一些莫名其妙的錯(cuò)誤。
請(qǐng)問大家都是怎么處理的抠忘?
A1:兩種方式解決這個(gè)問題:
一種是美術(shù)在出資源時(shí)直接不導(dǎo)出材質(zhì)資源撩炊。
一種是自己在Unity導(dǎo)入資源進(jìn)程里寫個(gè)批處理,在導(dǎo)出時(shí)默認(rèn)去除掉這材質(zhì)球崎脉。
不管用哪種拧咳,都需要導(dǎo)入后,自己在資源上做好策略管理囚灼,手動(dòng)的整理好材質(zhì)與Shader的目錄骆膝,跟打包的策略對(duì)應(yīng)。這樣可以更好地做好項(xiàng)目規(guī)范啦撮,還能為后期資源冗余的問題做優(yōu)化谭网。前期能做好這個(gè)規(guī)范,后期關(guān)于資源冗余的問題也不會(huì)太頭疼赃春。
感謝廖武興@UWA問答社區(qū)提供了回答
A2:在2020.3.17里面有效,不論是ReImport FBX還是重啟Unity劫乱,都是有用的:
材質(zhì)球會(huì)變成下面這樣:
感謝Xuan@UWA問答社區(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ā)行日志說2019.4.15修復(fù)了這個(gè)問題,我們升級(jí)完之后基本不閃退殖妇,但是在vivo的安卓12手機(jī)上還是有問題刁笙,然后又升級(jí)到2019.4.34,目前沒看到閃退谦趣。
感謝大秋衣@UWA問答社區(qū)提供了回答
A2:可參考:
感謝Arboo@UWA問答社區(qū)提供了回答
封面圖來源于網(wǎng)絡(luò)
今天的分享就到這里疲吸。當(dāng)然,生有涯而知無涯前鹅。在漫漫的開發(fā)周期中摘悴,您看到的這些問題也許都只是冰山一角,我們?cè)缫言赨WA問答網(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(原群已滿員)