5

在Runtime下,IL2CPP与Mono打包对应的PSS内存占用问题

 1 year ago
source link: https://blog.uwa4d.com/archives/TechSharing_322.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.
neoserver,ios ssh client

1)在Runtime下,IL2CPP与Mono打包对应的PSS内存占用问题
​2)获得AssetBundle内部依赖关系的方法
3)Unity 2019 Streaming Mipmap在某些情况下采样等级错误
4)根据RenderDoc的数据,计算渲染量


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

UWA社区主页:answer.uwa4d.com
UWA QQ群:465082844

Memory

Q:IL2CPP打包比Mono打包在Runtime下跑同样的案例PSS内存占用更高一些,请问是合理的吗?

A:推测可能是IL2CPP包是64位的,而Mono包是32位的,天然内存占用就会高一些,另外IL2CPP在打包的时候,会把各种泛型的代码给展开,所以对应的代码so加载进内存,内存占用也会高一些。

下面是同样的测试案例,两种打包方式的PSS占用截图。

Mono包:

1.png
2.png

IL2CPP包:

3.png
4.png

从上图中可以看到,IL2CPP包比Mono包内存占用更多的体现在Code、Native Heap和Private Other三个类别上。

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


AssetBundle

Q:获得AssetBundle内部依赖关系的方法。注:Manifest的依赖关系不准确。

之前发现从Manifest里面获得的依赖关系在很多情况下都不准确。

比较明显的是,当Prefab嵌套时,Manifest数据会显示Prefab依赖被嵌套的Prefab;而SpriteAtlas和Sprite依赖关系是反的。其他还有很多情况会额外依赖不需要的资源。用WebExtract解开AssetBundle本身,里面的数据是正确的依赖数据。

因此,现在想找到一个方法,脱离Manifest,自行建立依赖关系表。

现在的问题在于,如果对每个输出的AssetBundle执行解包和正则分析,会花费大量时间,并且本身文本匹配也有风险。

有没有什么干净的流程,可以获得AssetBundle内部记录的依赖关系?

A:用UnityEditor.Build.Content.ContentBuildInterface下面的方法获取到的依赖信息是准确的。如下面两个函数:
ContentBuildInterface.GetPlayerDependenciesForObjects
ContentBuildInterface.CalculatePlayerDependenciesForScene

如果用SBP,Manifest可以在编译完成后加个Task读m_DependencyData,自己建立一个。或者直接用ContentBuildInterface预构造的也可以满足了。

感谢题主欧月松@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/632a6dfae73cb53fa4d725bc


Texture

Q:游戏使用了Mipmap技术,同时为了节省内存开启了流式加载Streaming Mipmap:

5.png

但是在做热更模型的时候,发现某些贴图的Mipmap会采样一个很低的值(很糊),然后即便调整摄像机远近也没有变化(不能动态采样了)。

正常打包出来的资源没有问题(贴图在一个独立Bundle里),但热更打出了的资源就有问题(模型、材质、贴图等都在一个Bundle里),而且贴图占用内存未达到Budget上限。

不知道问题出在哪了,该如何解决?

A:根据描述分析,有可能是加载了贴图之后把Bundle卸载了。把贴图放在单独的Bundle里面的时候,可能这个Bundle没有被卸载;但在热更的时候,贴图和模型、材质等放在同一个Bundle,可能用代码加载这个Bundle之后又卸载了,就会出现这个问题。

Streaming系统刚开始加载的时候会加载分辨率较低的一层Mipmap,之后根据距离动态调整,如果此时已经把贴图所在的Bundle卸载了,就无法根据摄像机距离调整采样的Mipmap层级。

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


Rendering

Q:最近在分析几款游戏的特效。已经用RenderDoc抓了几帧。也找到了渲染粒子特效的Pass。

现在问题,能否从顶点Buffer中分析出粒子的数量?或者有无别的方法估算出粒子的数量?

A:如下图,如果是四边形的粒子,比如billboard,66/3=22个三角形,22/2=11个粒子。

6.png

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

封面图来源于网络


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

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:465082844


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK