厚积薄发UGUI和粒子特效的穿插使用问题
这是第261篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
本期目录:
UGUI和粒子特效的穿插使用问题项目导入多个Spine动画合批后降低DrawCall问题Font Texture占用内存问题Unity Texture Streaming的疑问UGUI
Q:UGUI中粒子在滑动列表中使用时,需要将特效放在两个Image中间展示,如果将上下两个Image与特效都加Canvas后,滑动列表的Mask就不会起作用,有什么好办法吗?
A1:推荐一个不错的开源项目:Particle Effect For UGUI
https://lab.uwa4d.com/lab/5b432992d7f10a201fad1b91
感谢张首峰@UWA问答社区提供了回答
A2:我也推荐一个不错的方案:UIEffect
https://lab.uwa4d.com/lab/5b442c54d7f10a201faf6f64
感谢马三小伙儿@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60fe91ae4f8c17746013ee26
Rendering
Q:项目中使用到了Spine插件,在场景中使用了大量的Spine动画,每一个动画就是一个DrawCall,场景使用60个动画就是同时存在60个DrawCall,有没有办法将其合批到一次或者几次绘制?
Spine动画都是这样的:
A:这里提供一种可能可行的办法:项目升级到URP,使用SRP Batcher对Spine进行合批。
首先在内置的渲染管线中,我在场景中复制了完全相同的10个的Binary导出的Spine和10个Json导出的Spine。如图,连完全Copy的Spine动画都无法合批:
那URP如何操作呢?不是所有的对象都可以使用SRP Batcher来渲染,Shader必须与SRP Batcher兼容。但默认的URP工程中并没有封装Spine使用的Shader。所以,Spine官方提供了对URP的支持:http://zh.esotericsoftware.com/blog/Unity-Universal-Render-Pipeline-support。
下载官网提供的UPM包、通过PackageManager装载到使用Spine的URP项目中:
在URP的项目里,把测试用例稍作修改:我导入了两个图集、材质等因素完全不同的Spine(Spineboy和Hero),来测试不同的Spine能不能被SRP Batcher合批。
资源导入完毕后,把原来Spine资源的Shader改为URP版本的Shader。如下图,“Spine/Skeleton”改为了“Universal Render Pipeline/Spine/Skeleton”:
修改完后,查看Frame Debugger,所有的Spine的渲染都合并成一个Batch了,说明SRP Batcher不但能合批重复的Spine动画,更能使完全不同的Spine动画合批。
感谢Faust@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6100d3094f8c177460171597
Memory
Q:Font Texture占用内存问题:真机连接Profiler、真机连接RenderDoc和Unity运行Profiler对应的Font Texture不一致,Unity版本:2018.2.16f1:
Unity运行Profiler:
真机连接Profiler:
Unity连接Profiler1:
真机连接RenderDoc1:
A:因为我近期在做一些纹理相关的实验时发现部分Unity版本会使真机上Alpha8格式的纹理大小不符合计算结果:
多台手机、多个版本的测试对比,看得出这种异常发生在了一些特定手机中(其他版本也有发生细微内存变化的,但远没有2018.2版本幅度这么大)。
按理来说1024×1024分辨率的Alpha8格式纹理大小应为1MB,然而真机上是4MB。我测试的其他版本(2018.4、2023.2、2023.4、2023.3)中则正常为1MB。且Mipmap、Read/Write等选项的开关也不影响内存翻了4倍的情况。
结合本帖的问题,我做了如下比较实验(真机上的内存数据我用了UWA GOT Online Assets运行时资源检测服务,可以清晰看到内存的小数点后两位)。
场景中使用了一张1024×1024 Alpha8纹理和原大小为0.5MB的Font Texture字体纹理。
2018.4版本
编辑器中:1024×1024 Alpha8纹理 2MB
Font Texture 0.5MB
真机上:1024×1024 Alpha8纹理 1MB
Font Texture 0.5MB
Font Texture 0.125MB
2018.2版本
编辑器中:1024×1024 Alpha8纹理 2MB
Font Texture 0.5MB
真机上:1024×1024 Alpha8纹理 4MB
Font Texture 1.25MB(0.5MB×2.5)
Font Texture 0.32MB(0.125MB×2.5)
注意,此处内存虽然增大很多,但是纹理格式并没有变化,还是Alpha8。和帖子的情况十分接近。所以猜测是个别Unity版本的问题。
题主的版本是Unity 2018.2.16f1,和我实验的情况基本吻合。就是2018.2版本时Alpha8这种格式在真机上的内存大小会异常增加。如果这对项目有影响可以考虑升到2018.4。
感谢Faust@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/6100c0784f8c17746016f720
Texture
Q:目的 :使用同一份资源,在低内存设备直接使用低级别Mipmap。
实现方式游戏启动调用:
QualitySettings.streamingMipmapsActive = true;
QualitySettings.streamingMipmapsAddAllCameras = true;
QualitySettings.streamingMipmapsMaxLevelReduction = 2;
资源设置有开启Mipmap:
(SystemInfo.supportsMipStreaming == true )
实际运行效果跟上面三个方法是否调用没有关系。不知是方法调用错误,还是理解错误,望解答。
A1:要是单纯想要使用低级别Mipmap,那么不需要Texture Streaming。运行时将TextureQuality改成Half Res或者更低的即可。
感谢范世青@UWA问答社区提供了回答
A2:如果是在编辑器里面测试,记得在Editor Settings里面勾上Enable texture streaming in edit mode。Scene窗口的模式可以调成Texture Streaming,看看到底需不需要加载第N层的图片。
感谢萧小俊@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60fecc014f8c177460143e7e
20230802