关于memory:厚积薄发Instruments如何看Mono内存分配

63次阅读

共计 3891 个字符,预计需要花费 10 分钟才能阅读完成。

1)Instruments 如何看 Mono 内存调配
​2)对于 Addressable v1.11.2 的疑难
3)开展 UV2 时导致 Mesh 顶点数减少
4)晋升 Unity 编辑器中代码的编译速度
5)Renderdoc 调试的疑难


这是第 217 篇 UWA 技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫 10 分钟,认真读完必有播种。

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

Memory

Q:例如在调配了一个 10MB 数组,对应在 Unity Profiler 中会看到开拓了至多 10MB 大小的 Mono 内存。

那么在 Instruments 中,如何查看调配的内存信息呢?Allocations 中的信息是此过程中调配的所有内存信息吗,尝试调配过 100MB 内存,Allocations 中的统计没有任何增长。

A:我这边也做了测试:

创立了 100MB 大小的 int 数组,Size 理论应该是 400MB。

而后到 Profile 察看:

能够看到 ManagedHeap 正确调配了这 400MB 的空间。

而后打包 iOS 后到 Xcode 运行,运行前首先把 Run 这个 Scheme 的 Malloc Stack 勾上。

RUN 当前点选 Memory 并导出 Memory Graph 来察看:

因为应用程序的内存都是在 VirtualMemory 空间调配的,因而查看 VM Regions 的 VM_ALLOCATE 局部。

能够发现 128X3+16 刚好 400MB 的调配。

调用堆栈也很好确定:

正是咱们的测试代码。

而后咱们来看 Instruments。首先是 Allocations 局部,有一点要留神,该栏的下部有一些选项:

留神最初一个选项,如果抉择第一个:

All Heap & Anonymous VM,All Heap 对应 App 理论调配的物理空间,不蕴含 VM,Anonymous VM 的官网解释是:

interesting VM regions such as graphics- and Core Data-related. Hides mapped files, dylibs, and some large reserved VM regions。

因而一些比拟大的预留调配空间是不会显示的。

将这个选项切换为 All VM Regions,就能看到调配的 400M 了:

并且左边详情页面也正确显示了调用堆栈:

另外,咱们还能够从 VM Tracker 来察看。关上 VMTracker 的 Snapshots:

就能看到这 400MB 的具体调配信息:

能够发现,Virutal Size 略大于 400MB,因为程序其余局部也要申请一些内存。而这 400MB 又别离保留在 Resident 和 Swapped 内,其中 Resident 局部又根本等于 Dirty Size,阐明这部分大小的空间被标记了 Dirty 是不能被替换进来的,剩下 240MB 左右空间是 Clean 空间,能够临时被替换进来以保障有足够的物理空间能应用。这也是因为咱们只是申请了这部分空间,并没有进行具体的赋值初始化和应用。

那如果赋值应用了呢?批改代码测试

运行 Instruments 后再察看:

能够分明的发现这 400MB 都在 Dirty Size 内。这种状况真正会给该 App 和 iOS 以内存压力。

举荐浏览:
《写给 Unity 开发者的 iOS 内存调试指南》

《Understanding iOS Memory (WiP)》

感激黄程 @UWA 问答社区提供了答复


Addressable

Q:对于 Addressable v1.11.2 开始编辑器在“Fast Mode”模式下运行会获取 SubAsset 失败的问题。

A:明天将我的项目应用 Addressables 零碎从 1.8.4 降级到 1.14.2。忽然发现 AssetReference 指向的资源进行实例化总是报 Key 有效的谬误。考察后发现从 1.11.2 开始,为了给 FastMode 进一步减速,官网批改了流程。

之前版本即便是 Fast Mode 下,也是要进行一次 Build,并且 Play 时读取 Build 进去的 Catalog,Catalog 会序列化所有的 AssetEntry 和 SubAsset,生成 ResourceLocationMap 对象而后进行检索。咱们应用了不少 AssetReference 来指向 SubAsset 应用。这时应用没有问题。

1.11.2 版本开始,Fast Mode 间接提供编辑器环境下 AddressableAssetSettings 对象的 GUID 而非 Catalog 文件门路,因而 Play 后初始化时则会启用 FastMode 专用的初始化操作 FastModeInitializationOperation,这时生成的不是 ResourceLocationMap,而是 AddressableAssetSettingsLocator,这个 Locator 只是遍历了编辑器 Group 窗口对应可见的 Group 内的 AssetEntry,而 AssetEntry 外部的 SubAsset 则不会被遍历到,因而如果游戏中用到 SubAsset,就会报 Key 有效的谬误。

官网 Changelog:

Refactored Play Mode Script for "Use Asset Database" to pull data directly from the settings. This reduces the time needed to enter play mode.

倡议:

  • 临时只应用 v1.8.4 版本(经我的项目长期应用,绝对较为稳固)
  • 不倡议应用 1.9.2 到 1.11.2 期间版本,还有其余 bug
  • 降级到最新的状况下,应用 Simulate Groups 模式进行开发
  • 期待官网后续改良

感激题主黄程 @UWA 问答社区提供了答复


Rendering

Q:在 Unity 中主动开展 UV2(Generate Lightmap UVs),会造成个别物体的 Mesh 中顶点个数减少。

我主动开展的一个高空,顶点数从 134 变成 136,如果不开展 UV2,是没有问题的。请问,有什么方法能够在开展 UV2 时,不减少顶点个数吗?

在导入 FBX 模型时,没有勾选优化 Mesh 和其余影响顶点的一些选项。

A:因为有时候 2 个面片对应到 Lightmap 上 2 个不间断区域,而这两个面片上的顶点可能共享,因而须要拆开成 2 个顶点,其余数据统一,然而 UV2 不同。属于失常景象。

想要不减少,除非美术手动设置 UV2 并导出,即便如此,如果模型在一些面是突围闭合的,也很难保障顶点不反复。其实这个时候是顶点在 Maya 等工具内曾经做了减少后导出。Unity 内可能看不出变动。

感激黄程 @UWA 问答社区提供了答复


Build

Q:有没有什么方法能够晋升 Unity 编辑器中代码的编译速度?咱们当初每批改一次代码,期待的编译工夫都将近半分钟。

A1:对于大型项目来说,这的确是大家常常遇到的状况。一般来说,Unity Editor 会依照脚本的依赖关系编译代码,其次要分为以下四个步骤:

  • 编译 Standard Assets、Pro Standard Assets 和 Plugins 文件夹中的 Runtime Script;
  • 编译以上三个文件夹中 Editor 文件夹下的 Script;
  • 编译我的项目中所有残余的 Runtime Script(Editor 文件夹以外 Script);
  • 编译残余 Script(即 Editor 文件夹中 Script)。

晓得了 Unity 编辑器的脚本编译个性后,咱们则倡议研发团队能够将一些长时间不须要改变的脚本代码(比方各种插件代码)放入到 Standard Assets、Pro Standard Assets 或 Plugins 文件夹中,这样这些代码只须要编译一次,后续的工夫就都能节省下来。

有敌人做过测试,在他们的我的项目中通过下面的改变,原来我的项目每次的编译工夫从 23s 降落到 7s。想想看,这将节俭你和你的团队多少工夫!

举荐插件:Mad Compile Time Optimizer
举荐浏览:《优化 Unity 我的项目编译速度》

感激题主 Jessica@UWA 问答社区提供了答复

A2:添加程序集定义:

https://docs.unity.cn/cn/2020.2/Manual/ScriptCompilationAssemblyDefinitionFiles.html

感激 wangzuxiong@UWA 问答社区提供了答复

A3:拆分工程编译成不同的 DLL,Unity 2017 后能够应用引擎自带的工具定义成不同的工程。

感激 mrchen@UWA 问答社区提供了答复


Rendering

Q:Pixel Context 是灰的:

Debug Vertex 也是灰色的:

这是为什么呢?

A1:像素调试的 Shader 里加 #pragma enable_d3d11_debug_symbols。

感激燃野 @UWA 问答社区提供了答复

A2:官网文档说有阐明,只能在 D3D11 或者 D3D12 中进行调试:

https://renderdoc.org/docs/how/how_debug_shader.html#hlsl-debugging

感激 Xuan@UWA 问答社区提供了答复

封面图来源于网络


明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在 UWA 问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。

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

官网技术 QQ 群:793972859(原群已满员)

正文完
 0