![]()
這是第447篇UWA技術(shù)知識分享的推送,精選了UWA社區(qū)、UWA AI問答的熱門話題等技術(shù)知識點,助力大家更全面地掌握和學習。
UWA社區(qū)主頁:community.uwa4d.com
無論是社區(qū)里開發(fā)者們的互助討論,還是AI基于知識沉淀的快速反饋,核心都是為了讓每一個技術(shù)難題都有解、每一次踩坑都有回響。本期分享分別來自UWA AI問答和UWA問答社區(qū),希望這些從真實開發(fā)場景中提煉的經(jīng)驗,能直接幫你解決當下的技術(shù)卡點,也讓你在遇到同類問題時,能更高效地找到破局方向。
本期目錄:
TextureStreaming針對不同分檔機型一般怎么設(shè)置
- 不升級Unity引擎小改動快速適配安卓16KB頁面要求
From AI 問答
Q:想問問TextureStreaming的選項有沒有推薦值,針對高中低機型一般怎么設(shè)置呢?
A:關(guān)于Texture Streaming的參數(shù)設(shè)置,需結(jié)合設(shè)備性能分級(高中低)進行精細化配置,以在畫面表現(xiàn)與內(nèi)存占用間取得最佳平衡。以下是針對不同機型的推薦策略:
核心參數(shù)說明
Memory Budget:紋理內(nèi)存預算,決定Unity開始管理Mipmap加載的閾值。所有紋理(含非流式)均計入此預算。
Max Level Reduction:允許丟棄的最大Mipmap層數(shù)級數(shù),優(yōu)先級高于Memory Budget。例如設(shè)為2,則最多只加載Mipmap 2及更小層級。
Add All Cameras:默認開啟,對所有攝像機啟用串流。若需精細控制,可關(guān)閉并手動為特定攝像機添加Streaming Controller組件。
Renderers Per Frame:每幀處理的Renderer數(shù)量,影響CPU開銷。建議根據(jù)幀率動態(tài)調(diào)整,避免卡頓。
高中低機型設(shè)置推薦
1. 高端機型
目標:追求極致畫質(zhì),充分利用硬件資源。
Memory Budget:512MB~1GB(確保略高于 Texture.desiredTextureMemory)。
Max Level Reduction:0或1(盡可能保留高分辨率Mipmap)。
其他:
可適當提高Async Upload Time Slice和Buffer Size,加快資源上傳速度。
啟用streamingTextureDiscardUnusedMips = false,利用緩存減少重復IO。
優(yōu)勢:畫面細膩,無明顯紋理“popping”現(xiàn)象。
注意:監(jiān)控targetTextureMemory,避免超出物理內(nèi)存導致OOM。
2. 中端機型
目標:平衡畫質(zhì)與性能,控制內(nèi)存峰值。
Memory Budget:200MB~300MB。
Max Level Reduction:1~2。
Renderers Per Frame:256~512(根據(jù)實際幀率微調(diào))。
Async Upload:
asyncUploadTimeSlice:4ms
asyncUploadBufferSize:16MB
asyncUploadPersistentBuffer = true
推薦做法:通過真機測試獲取desiredTextureMemory,將Budget設(shè)為其1.2倍左右,留出余量。
3. 低端機型
目標:保障流暢運行,嚴控內(nèi)存。
Memory Budget:100MB~150MB。
Max Level Reduction:2~3(強制降級,節(jié)省內(nèi)存)。
Texture Quality:可配合使用“Half Res”模式進一步壓縮非關(guān)鍵紋理。
Renderers Per Frame:128~256,降低每幀CPU開銷。
強制代碼開啟:
QualitySettings.streamingMipmapsActive = true;避免編輯器設(shè)置在移動端失效。
關(guān)鍵點:UI紋理務(wù)必關(guān)閉Streaming Mipmap,因其無需遠近LOD,開啟反而浪費計算和內(nèi)存。
關(guān)鍵實踐建議
1. 必須代碼開啟Streaming
僅在 Quality Settings 中勾選可能在移動端無效,務(wù)必在啟動時調(diào)用:
SystemInfo.supportsMipStreaming // 先檢測是否支持 QualitySettings.streamingMipmapsActive = true;2. 真機測試為準
Editor中紋理內(nèi)存遠高于真機(路徑不同),一切優(yōu)化效果驗證必須在目標設(shè)備上進行。
3. 合理啟用對象
僅對場景模型貼圖啟用Streaming Mipmap。
UI、圖標、不帶Mipmap的紋理應(yīng)關(guān)閉。
確保紋理開啟Generate Mipmap且未勾選Read/Write Enabled(CPU內(nèi)存不受Streaming影響)。
4. 動態(tài)調(diào)整策略參考
使用以下公式估算攝像機切換延遲最小時間:
最短延遲幀數(shù) = (Texture.streamingRendererCount + RenderersPerFrame - 1) / RenderersPerFrame結(jié)合Texture.streamingTexturePendingLoadCount判斷是否完成加載,實現(xiàn)平滑鏡頭切換。
5. Lightmap支持串流
在Player Settings中啟用Lightmap Streaming Enabled,同樣受Budget與Max Level Reduction控制。
總結(jié)
![]()
最終配置應(yīng)基于真實項目資源規(guī)模與目標設(shè)備Profile數(shù)據(jù)確定,建議結(jié)合UWA GOT Online報告中的紋理內(nèi)存模塊進行量化分析與迭代調(diào)優(yōu)。
分享鏈接 :
https://www.uwa4d.com/main/uwa-shared.html?shareId=1d04bf11-027a-4d83-9ebf-f51f7c8a9407
From問答社區(qū)
分享:不升級Unity引擎小改動快速適配安卓16KB頁面要求
16KB Google Play兼容性要求 自2025年11月1日起,提交到Google Play且以Android 15及更高版本為目標平臺的所有新應(yīng)用和現(xiàn)有應(yīng)用更新都必須在64位設(shè)備上支持16KB頁面大小。
https://developer.android.com/guide/practices/page-sizes
*上述網(wǎng)址需要使用VPN打開
Unity官方提供了升級引擎的方案:
https://discussions.unity.com/t/info-unity-engine-support-for-16-kb-memory-page-sizes-android-15/1589588
如果項目還在使用古老的2018、2019等引擎不好升級怎么辦?
這里介紹一個方法:
一般Unity項目主要涉及以下幾個so需要處理:
libunity.so
libil2cpp.so
lib_burst_generated.so
libmain.so
根據(jù)谷歌的文檔,老版本NDK在鏈接so階段需要傳遞以下參數(shù)即可完成適配:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384" LOCAL_LDFLAGS += "-Wl,-z,common-page-size=16384"那么我們逐個來看:
1. libunity.so
我們知道,項目勾選了Strip Engine Code的時候Unity是使用.a根據(jù)項目情況動態(tài)鏈接一個libunity.so出來的,所以我們很容易插入2這行,鏈接相關(guān)的參數(shù)對應(yīng)的文件位于:
PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\StaticLibs\arm64-v8a\link.rsp
-Wl,-z,max-page-size=16384 -Wl,-z,common-page-size=16384加入這兩行即可。
2. libil2cpp.so
IL2CPP支持自定義參數(shù),可以通過以下函數(shù)實現(xiàn)增加鏈接參數(shù):
PlayerSettings.SetAdditionalIl2CppArgs("--linker-flags=\"-Wl,-z,max-page-size=16384 -Wl,-z,common-page-size=16384\"");調(diào)用一次即可,以上參數(shù)會保存在ProjectSettings.asset的additionalIl2CppArgs中。
3. lib_burst_generated.so
如果使用了burst,有條件的話可以直接升級到1.8.21+(參考以上官方鏈接),也可以自己魔改:使用dnSpy修改burst包.Runtime\Burst.Compiler.IL.dll的AotNativeLinkAndroid類的Link函數(shù),添加那兩行參數(shù)即可。
4. libmain.so
這個so是Unity已經(jīng)編譯好的,沒法自己鏈接,好在它幾乎沒怎么改過,可以從已經(jīng)支持了的高版本拷貝一個過來覆蓋使用。
補充:上面解決的是so文件ELF的LOAD段的16KB對齊問題。
APK還存在2種模式:
新模式:安裝應(yīng)用的時候so文件不解壓出來,so在APK中是不壓縮的,這種情況是通過mmap直接將APK中的so映射到內(nèi)存使用的。這要求兩點:so本身16K對齊 + so在APK中的偏移也要是16K對齊。
舊模式:so在APK中是壓縮存儲的,安裝時會解壓so文件,這種情況只要求so本身對齊。可以通過useLegacyPackaging true開啟,AndroidManifest.xml中extractNativeLibs會被設(shè)置為true。
https://developer.android.com/guide/practices/page-sizes-packaging
*上述網(wǎng)址需要使用VPN打開
互動提問:不更換Unity版本,這塊會不會有問題?
https://developer.android.com/guide/practices/page-sizes?hl=zh-cn-code
A:目前未發(fā)現(xiàn)問題,游戲能正常運行。
互動提問:Unity2019按上面步驟處理完,so 16KB對齊了,useLegacyPackaging=true,但在Android模擬器16KB鏡像上,還是會崩潰,這是為什么?
A:模擬器應(yīng)該是x86_64的,我是在Pixel9真機上跑的。
互動提問:按照方法處理后,AS分析APK后,lib中的.so庫是正確了。但是AS依舊提示不支持16KB,這是為什么?
![]()
A: 上面補充了一點信息,你的情況應(yīng)該是上面的新模式了,這個還有個隱性要求:so在APK中的偏移也要是16K對齊,可以開啟useLegacyPackaging試試。
感謝題主littlesome@UWA問答社區(qū)提供了回答,有經(jīng)驗的朋友歡迎轉(zhuǎn)至社區(qū)交流:
https://answer.uwa4d.com/question/68d4e378244ce21ce9ec0920
封面圖來源于網(wǎng)絡(luò)
今天的分享就到這里。生有涯而知無涯,在漫漫的開發(fā)周期中,我們遇到的問題只是冰山一角,UWA社區(qū)愿伴你同行,一起探索分享。歡迎更多的開發(fā)者加入UWA社區(qū)。
UWA官網(wǎng):www.uwa4d.com
UWA社區(qū):community.uwa4d.com
UWA學堂:edu.uwa4d.com
點擊下方名片關(guān)注我們,將我設(shè)為星標,及時接收小編每日推送哦,性能優(yōu)化不迷路~
近期精彩回顧
【萬象更新】
【充電一刻】
【充電一刻】
【萬象更新】
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.