3

关于切换场景加载耗时的优化问题 - UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 |...

 1 year ago
source link: https://blog.uwa4d.com/archives/TechSharing_317.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1)关于切换场景加载耗时的优化问题
​2)SpriteAtlas打包AssetBundle后运行时内存大小和什么有关系
3)手机上使用MRT的限制和兼容性
4)如何控制粒子系统组件数量的上限


这是第317篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

Loading

Q:在切场景时,为什么调整Application.backgroundLoadingPriority为High可以减少加载耗时呢?

A:Application.backgroundLoadingPriority这个API会限制主线程的集成的时间,默认设置是ThreadPriority.BelowNormal,也就是每一帧执行主线程集成的操作耗时不能超过4毫秒,这将会导致每一帧剩余的时间用于等待或者渲染,而这些等待和渲染的时间都是无意义的耗时。如果把这个设置改为ThreadPriority.High,那么每一帧执行主线程集成的操作耗时可以增加到50毫秒,大大减少了所需要的帧数。

这里主线程的集成时间体现在函数Application.Integrate Assets in Background上面,它会受到加载Texture、Mesh的Texture.AwakeFromLoad、Mesh.AwakeFromLoad的影响,另外对于比较复杂的Prefab(父子节点多,层数多)需要进行拼装,耗时也会体现在这个函数当中。

感谢龙粲@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/63970a9366be116e07bdde12


AssetBundle

Q:SpriteAtlas打包AssetBundle后运行时内存大小和什么有关系?明明只有2张Atlas,2个纹理只有6MB,最终AssetBundle的内存却达到11.7MB。

1.png
2.png

A:运行时AssetBundle大小会受到打包Sprite数量的影响,打包了1700个Sprite的情况下AssetBundle内存11.7MB。

测试了同样大小的SpriteAtlas,打包了6个1024*1024大小的Sprite,AssetBundle大小却只有4.9KB。

3.png
4.png

感谢宗卉轩@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/639707f166be116e07bddafc


Rendering

Q:手机上使用MRT有什么限制吗,兼容性如何?

A:在支持OpenGL ES 3.0的手机上就支持MRT,可参考:
https://www.informit.com/articles/article.aspx?p=2181697&seqNum=2
https://registry.khronos.org/OpenGL/specs/es/3.0/es_spec_3.0.pdf

另外实测过,在红米4X这样非常低端的手机上,MRT也是可以正常运行的。红米4X的GPU是Adreno 505。

感谢Xuan@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/63970a1f66be116e07bddd8c


Rendering

Q:项目Overdraw有点高,我们想做一个与MMO游戏里同屏角色数量上限类似的,粒子系统上限的功能。

也就是低端分档下,当粒子数量达到某个值以后,就不再往画面里画新的粒子了。但只对特效Prefab数量做限制还是比较模糊,毕竟不同特效的粒子数量不同,所以想精确到播放状态的粒子组件数量。

A1:用Find肯定很耗时,尽量用逻辑做。比如,粒子系统一般都做缓存池管理,可以直接把相关逻辑写在这里:做一个计数器C,某个特效E要实例化或出池时,同时传入它的子粒子数量A(提前配置好),加给C;入池再减掉A;对C作监控看是否在某个值内,否则停止所有实例化和出池操作。同理,给每个特效E挂一个触发器脚本,激活或隐藏的时候把子粒子数量A传给写在某处逻辑的计数器C即可。

另外实际做的时候,还可以给不同的粒子特效加上不同的计算影响系数,这样可以让某些特效(比如多人游戏中玩家角色的技能)出现的概率更高一些,而其他特效(其他玩家的技能)显示得少一些。

感谢Faust@UWA问答社区提供了回答

A2:提个思路,对于每一个特效Prefab,可以离线给这个Prefab做一个评分。对于场上存在的特效Prefab,记录总的特效评分,可以设置一个总的上限评分,超过就不显示。

这样问题就抛到了离线分析每个特戏Prefab评分上,评分参考维度可以参考:特效粒子发射器数量、特效overdraw、特效Batches、特效内存等等。

感谢范世青@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/63970f5266be116e07bde241

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK