UDN
Search public documentation:

MemLeakCheckTrackingCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 主页 > 内存系统 > 内存泄露检查追踪
UE3 主页 > 性能、分析及优化 > 内存使用和分析 > 内存泄露检查追踪

MemLeakCheck Tracking(内存泄露检测追踪)


概述


MemLeakCheck提供了一个关于您的游戏所使用的内存状况的非常简单并容易理解的视图。它就是一个文本文件,所以您可以通过比较它们的不同来轻松地查看它们的变化。只是,MemLeakCheck 是一个可以调用所有其他重要内存命令的元命令。您可以在此对内存信息进行一站式管理。

运行 MemLeakCheck


主要使用两种方法完整且快速地运行 memleakcheck:

MemLeakCheck

为了生成一个完整的 memleakcheck,您只需在控制台中运行 MemLeakCheck 。这样将会由于大量时间消耗(长达一分钟)而使游戏停止运行,但是之后会将大型文件输出到 Profiling\MemLeaks 目录中,其中根据地图名称和时间戳记进行索引。您还可以在记事本文件中打开它。完整的 MemLeakCheck 包含一个其中几乎全部都是重要资源的列表,按照字母顺序进行排序。将它分为不同的部分。完整的 MemLeakCheck 非常适用于追踪始终加载的内容,以便不断进行内存使用情况比较。按照字母排列应该允许任何工具中的简单文本差异。

MemLeakCheck -fast

如果您在控制器中运行 MemLeakCheck -fast ,那么它需要的时间会更加短(通常是 5 秒),然后打印输出一份不够详细的报告。该报告包括所有必需的追踪数据,但是不包括大型资源列表以及任何慢的操作。它主要用于 DoMemLeakChecking 命令,作为热点报告生成的一部分,但是在完整 MemLeakCheck 的大停顿将会中断功能(例如网络超时)的情况下有用。

Release vs. Test

要记住的一件事情是根据使用何种可执行配置运行它 MemLeakCheck 命令的输出会有所不同。Release 运行具有更加准确的信息,但是 Release 可执行函数需要的内存明显比 Test 可执行函数多,所以您需要对此进行调整。通常情况下,使用具有 DoMemLeakChecking 的 Test 是个不错的主意,同时要在您需要采取全部 MemLeakCheck 转存的情况下使用 Release。

示例使用情况


这里有一些不同的方法,您可以在其中使用 MemLeakCheck 命令追踪内存问题:

  • 如果您的游戏正在发生内存泄漏,那么查看它是否是 UObject 内存泄露的最快的方法是在启动地图时进行 MemLeakCheck(内存泄露检查)。运行一段时间, 然后再次运行 MemLeakCheck(内存泄露检查)。比较两个文件的不同并找出在数量上具有巨大增长的对象或相关的池。
  • 在自动化测试期间,您可以设置每5分钟执行一个MemLeakCheck (内存泄露检测)。这会为您提供一个关于内存和对象在整个自动化测试期间的变化的一个很好的视图。按照热点报告生成的描述使用 MemLeakCheckDiffer 工具是进行这项操作的简单快捷的方法。
  • 进行一次 MemLeakCheck(内存泄露检测)来查看您的关卡所使用的内存情况。您能够看到所有动态创建的对象,以及加载了多少动画集等,这是非常好的。在这两个多人游戏地图上比较相似的情况是查找为什么某个地图所使用的内存比预期多的好方法。
  • 通过记录以前的 MemLeakCheck 数据的源码并定期将它与新的 MemLeakCheck 数据进行比较,您可以在项目周期过程中追踪到内存分配中的更改。它在追踪“为什么突然我的内存比上周少了 5MB?”这样的问题时非常有用。

输出部分


Memleakcheck 文件的输出可以大致被分为几个部分。注意,根据平台以及各个游戏划分的 MemLeakCheck 文件的各个部分:

报头

文件的顶部有时间戳记、命令行开关(对于检查用于特定运行的 -reducepoolsize= 非常有用)、BugItGo 位置和一些内存概述信息。当文件中的数据不合理时,通常要确保检查头文件,查看是否传入了一些奇怪的内容或者您所查看的是不是以前的文件。此外,注意对于大多数部分而言列出了用于生成这个部分的特定命令。

类列表

Class List(类列表)是文件的第一个主要块,而且这个列表将游戏中的每个类按照字母顺序进行排列。数量是显而易见的。NumByte 是当前供该类的所有对象使用的内存具体数量。MaxByte 是与类相关联的已分配内存的数量,所以其中包括诸如 TArray 闲置空间这样的内存。ResByte 是与该类的对象相关联的“资源”内存总数,而且根据特定的类它的意义有所不同。TrueResByte 是需要添加到任何供对象本身使用的内存的“资源”内存数量。例如,ParticleSytemComponent 的 TrueResByte 是当前激活 PSC 需要的渲染线程内存的数量。通常,要弄清楚一个类真正使用的内存数量,您需要同时添加 MaxByte 和 TrueResByte。

特定对象列表

在一个完整的内存泄露检查中,这个时候会显示对象的一些详细列表。下面还有更多其他信息。它们与 Class List(类列表)相似,但是会列出单个资源。

平台内存

下一个部分是针对平台的内存,各个平台之间有很大不同。在大多数情况下,Release 模式会提供更多的有效平台内存,而且还会输出所有 STAT MEMORY 变量的值。

针对游戏的内存

这部分主要讲的是针对游戏的内存分配

渲染内存

这个时候会输出 Render Target(渲染目标)、GPU Resource(GPU 资源)、Shader Cache(着色器缓存)、Texture Streaming(贴图动态加载)和 Octree 大小。它们在 Test 中丢失或不正确,因为这个数据不可用。

配置/软件包内存

在这里会输出所有加载的配置/位置文件的大小以及完整的软件包列表。这个软件包列表可以用于确定在给定点加载的数据类型,并且显示在完整且快捷的输出中。

资源列表

在整个转存中,它现在会输出贴图、声音和粒子的完整列表。下面还有其他更多内容,其中大部分在快捷模式中都被跳过了。

Actor 列表

会输出完整的 actor 列表接下来还有创建时间和所有者。它对于在时间长的游戏会话中查找 actor 泄露是非常有效的。

关卡列表

在这里会输出 STAT LEVELS 命令的输出结果。这对于将内存使用与当前加载的关卡关联起来是非常有用的,在追查顿卡时这样做会有所帮助。