Profiler
内存
- Profiler 中看到的内存是通过 unity 自身引擎看到的内存分配,凡是引擎创建和销毁的内存,引擎有记录,可以给出准确的引用内存占用信息.
- 第三方库的内存分配无法进行统计,以及一些其他的内存分配是无法进行统计的.
- 在真实环境上面,(例如移动设备上面,Xcode的 instrument,Android 的 USS)内存都比 profiler 上要多,因为这些内存包括 2 部分,A:真实的 used 的物理内存,B:缓存的(cached)的物理内存,这是不同平台决定的.Android 和 iOS 系统在资源不使用的时候均不会立即将其进行回收,而是将其放在缓存的物理内存中,一遍下次再使用时,可以快速的加载.
- 当系统发现 APP 的内存不够用时,才会在底层调用一个 memory killer 线程来轮询缓存物理内存,为 APP 清理内存.
- unity 的 profiler 只记录目前真实使用的物理内存,即上述所说的 A 部分内存.
- System.ExecutableAndDlls该项在 profiler 里面占用很多,该项显示的是执行文件和所调用的库(物理,渲染,IO 等系统库)的总和.即无需关心此项.
- Used total 的计算公式为: Used total = Unity + Mono + GfxDriver + Profiler + additionalUsedMemory.
additionalUsedMemory在profiler 中没有显示,因为在大多数平台下都为 0(PC/Android/iOS 都为 0),一般情况下 Used Total 的值就是除 FMOD 之外各项的总和了.Reserved Total 同样适用的. - PersistentManager.Remapper 主要提供文件的持久化存储,包括各种序列化的 asset,项目的 setting 文件,维护文件系统中的文件与内存中数据的对应关系.如果项目中大量适用 AssetBundle ,在对 AsserBundle 进行 Unload 之前都会需要占用 Remapper 的内存的,而 Remapper 本身的实现适用内存池,其数值只会增大,那么为了使 Remapper 占用的内存保持稳定,则在加载一定数量的 AssetBundle 之后需要进行 Unload 操作,而不要一次性把所有的 AssetBundle 进行 Unload.(这样的操作对维持整个 mono heap 的大小也是重要的,mono heap 本身也是只增大不减小的)
网友评论