TextureStreaming针对不同分档机型一般怎么设置

TextureStreaming针对不同分档机型一般怎么设置

1)TextureStreaming针对不同分档机型一般怎么设置
2)不升级Unity引擎小改动快速适配安卓16KB页面要求


这是第447篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

UWA社区主页:community.uwa4d.com
UWA QQ群:793972859

无论是社区里开发者们的互助讨论,还是AI基于知识沉淀的快速反馈,核心都是为了让每一个技术难题都有解、每一次踩坑都有回响。本期分享分别来自UWA AI问答和UWA问答社区,希望这些从真实开发场景中提炼的经验,能直接帮你解决当下的技术卡点,也让你在遇到同类问题时,能更高效地找到破局方向。


From AI 问答

Q:想问问TextureStreaming的选项有没有推荐值,针对高中低机型一般怎么设置呢?

A:关于Texture Streaming的参数设置,需结合设备性能分级(高中低)进行精细化配置,以在画面表现与内存占用间取得最佳平衡。以下是针对不同机型的推荐策略:

核心参数说明

  • Memory Budget:纹理内存预算,决定Unity开始管理Mipmap加载的阈值。所有纹理(含非流式)均计入此预算。
  • Max Level Reduction:允许丢弃的最大Mipmap层数级数,优先级高于Memory Budget。例如设为2,则最多只加载Mipmap 2及更小层级。
  • Add All Cameras:默认开启,对所有摄像机启用串流。若需精细控制,可关闭并手动为特定摄像机添加Streaming Controller组件。
  • Renderers Per Frame:每帧处理的Renderer数量,影响CPU开销。建议根据帧率动态调整,避免卡顿。

高中低机型设置推荐
1. 高端机型
目标:追求极致画质,充分利用硬件资源。

  • Memory Budget:512MB~1GB(确保略高于 Texture.desiredTextureMemory)。
  • Max Level Reduction:0或1(尽可能保留高分辨率Mipmap)。
  • 其他
    • 可适当提高Async Upload Time Slice和Buffer Size,加快资源上传速度。
    • 启用streamingTextureDiscardUnusedMips = false,利用缓存减少重复IO。

优势:画面细腻,无明显纹理“popping”现象。
注意:监控targetTextureMemory,避免超出物理内存导致OOM。

2. 中端机型
目标:平衡画质与性能,控制内存峰值。

  • Memory Budget:200MB~300MB。
  • Max Level Reduction:1~2。
  • Renderers Per Frame:256~512(根据实际帧率微调)。
  • Async Upload:
    • asyncUploadTimeSlice:4ms
    • asyncUploadBufferSize:16MB
    • asyncUploadPersistentBuffer = true

推荐做法:通过真机测试获取desiredTextureMemory,将Budget设为其1.2倍左右,留出余量。

3. 低端机型
目标:保障流畅运行,严控内存。

  • Memory Budget:100MB~150MB。
  • Max Level Reduction:2~3(强制降级,节省内存)。
  • Texture Quality:可配合使用“Half Res”模式进一步压缩非关键纹理。
  • Renderers Per Frame:128~256,降低每帧CPU开销。
  • 强制代码开启
QualitySettings.streamingMipmapsActive = true;

避免编辑器设置在移动端失效。

关键点:UI纹理务必关闭Streaming Mipmap,因其无需远近LOD,开启反而浪费计算和内存。

关键实践建议
1. 必须代码开启Streaming
仅在 Quality Settings 中勾选可能在移动端无效,务必在启动时调用:

SystemInfo.supportsMipStreaming // 先检测是否支持
QualitySettings.streamingMipmapsActive = true;

2. 真机测试为准
Editor中纹理内存远高于真机(路径不同),一切优化效果验证必须在目标设备上进行。

3. 合理启用对象

  • 仅对场景模型贴图启用Streaming Mipmap。
  • UI、图标、不带Mipmap的纹理应关闭。
  • 确保纹理开启Generate Mipmap且未勾选Read/Write Enabled(CPU内存不受Streaming影响)。

4. 动态调整策略参考
使用以下公式估算摄像机切换延迟最小时间:

最短延迟帧数 = (Texture.streamingRendererCount + RenderersPerFrame - 1) / RenderersPerFrame

结合Texture.streamingTexturePendingLoadCount判断是否完成加载,实现平滑镜头切换。

5. Lightmap支持串流
在Player Settings中启用Lightmap Streaming Enabled,同样受Budget与Max Level Reduction控制。

总结

最终配置应基于真实项目资源规模与目标设备Profile数据确定,建议结合UWA GOT Online报告中的纹理内存模块进行量化分析与迭代调优。

分享链接:
https://www.uwa4d.com/main/uwa-shared.html?shareId=1d04bf11-027a-4d83-9ebf-f51f7c8a9407


From 问答社区

分享:不升级Unity引擎小改动快速适配安卓16KB页面要求

16KB Google Play兼容性要求
自2025年11月1日起,提交到Google Play且以Android 15及更高版本为目标平台的所有新应用和现有应用更新都必须在64位> 设备上支持16KB页面大小。

https://developer.android.com/guide/practices/page-sizes
*上述网址需要使用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

根据谷歌的文档,老版本NDK在链接so阶段需要传递以下参数即可完成适配:

LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
LOCAL_LDFLAGS += "-Wl,-z,common-page-size=16384"

那么我们逐个来看:
1.libunity.so
我们知道,项目勾选了Strip Engine Code的时候Unity是使用.a根据项目情况动态链接一个libunity.so出来的,所以我们很容易插入2这行,链接相关的参数对应的文件位于: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支持自定义参数,可以通过以下函数实现增加链接参数:

PlayerSettings.SetAdditionalIl2CppArgs("--linker-flags=\"-Wl,-z,max-page-size=16384 -Wl,-z,common-page-size=16384\"");

调用一次即可,以上参数会保存在ProjectSettings.asset的additionalIl2CppArgs中。

3.lib_burst_generated.so
如果使用了burst,有条件的话可以直接升级到1.8.21+(参考以上官方链接),也可以自己魔改:使用dnSpy修改burst包.Runtime\Burst.Compiler.IL.dll的AotNativeLinkAndroid类的Link函数,添加那两行参数即可。

4.libmain.so
这个so是Unity已经编译好的,没法自己链接,好在它几乎没怎么改过,可以从已经支持了的高版本拷贝一个过来覆盖使用。

补充:上面解决的是so文件ELF的LOAD段的16KB对齐问题。

APK还存在2种模式:

  • 新模式:安装应用的时候so文件不解压出来,so在APK中是不压缩的,这种情况是通过mmap直接将APK中的so映射到内存使用的。这要求两点:so本身16K对齐 + so在APK中的偏移也要是16K对齐。
  • 旧模式:so在APK中是压缩存储的,安装时会解压so文件,这种情况只要求so本身对齐。可以通过useLegacyPackaging true开启,AndroidManifest.xml中extractNativeLibs会被设置为true。

https://developer.android.com/guide/practices/page-sizes#update-packaging
*上述网址需要使用VPN打开

互动提问:不更换Unity版本,这块会不会有问题?
https://developer.android.com/guide/practices/page-sizes?hl=zh-cn#check-code

A:目前未发现问题,游戏能正常运行。

互动提问:Unity 2019按上面步骤处理完,so 16KB对齐了,useLegacyPackaging=true,但在Android模拟器16KB镜像上,还是会崩溃,这是为什么?

A:模拟器应该是x86_64的,我是在Pixel9真机上跑的。

互动提问:按照方法处理后,AS分析APK后,lib中的.so库是正确了。但是AS依旧提示不支持16KB,这是为什么?

A:上面补充了一点信息,你的情况应该是上面的新模式了,这个还有个隐性要求:so在APK中的偏移也要是16K对齐,可以开启useLegacyPackaging试试。

感谢题主littlesome@UWA问答社区提供了回答,有经验的朋友欢迎转至社区交流:
https://answer.uwa4d.com/question/68d4e378244ce21ce9ec0920

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859