UDN
Search public documentation:

HotSpotReportGenerationCH
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 主页 > 性能、分析及优化 > 内存使用和分析 > 热点报告生成

热点报告生成


概述


下面的文章会说明如何为您的关卡设计师创建“热点报告”。这些报告将会由您的 QA 部门负责生成,而且可以用于识别由于子关卡动态载入和载出而造成的内存双列直插式封装。它们将允许您的 LD 更清楚地看到消耗最多内存的散列表元,并且应该允许他们优化他们的关卡使其满足内存需求。

创建未使用的 MemLeakCheck 数据


为了获取我们将用于表示 SP 关卡内存状态的未使用数据,您需要进行下面的操作:

  1. 加载 UnrealConsole 然后连接到将用于此次测试的游戏实例。
  2. 在您计划从中捕捉数据的版本中启动 DebugConsole 可执行函数。
  3. 加载进入您计划为其捕捉数据的 SP 关卡。
  4. 进入关卡中后,使用下面的命令:
    DoMemLeakchecking 30

    这里面的 30 表示 memleakcheck 捕捉数据之间的时间间隔(秒数)。如果需要,您可以增加或减少频率,但是为了随时可以正确追踪趋势,您通常需要使这个数字保持一致。

  5. 在 P 关卡要发生改变的时候打开 统计数据关卡 追踪功能。
  6. 经过整个 P 关卡转换到下一个 P 关卡。
  7. 在 2 捕获进入 P 关卡后,您转换返回主要菜单和/或重新启动。
  8. 在开始另一个关卡捕获数据前通常会重新启动。
  9. 根据列出的平台将 memleakcheck 文件创建在下面的文件夹中:
    • 对于 PC/UDK:
      [install]\[GameName]\Profiling\MEMLEAKS
    • 对于 iOS(将文档目录备份到 PC 中)。请参阅部署工具了解有关备份文档目录的信息。):
      [install]\[GameName]\iOS_Backups\[DeviceName]\Profiling\MemLeaks
  10. 每个 memleakfile 将会被解析到在以它开始运行的关卡命名的文件夹中。
    例如,如果您在 关卡-a 中开始捕捉数据,然后进入 关卡-b关卡-c 捕捉数据,整个运行过程将会在 关卡-a 文件夹中。
  11. 将这些 memleakcheck 文件/文件夹复制到可以轻松到达的位置。

创建可以从中获取数据的 CSV


  1. 从下面的文件夹中启动 memleakcheckdiffer.exe:
    ..\Binaries\
  2. 在 MemLeakCheckDiffer 中,选择 文件 > 打开 文件夹及其子文件中的所有 Memleak 文件
  3. 浏览并导航到您放置您的 memleakcheck 文件的位置。
  4. 等待文件夹填充 MemLeakCheckDiffer。
  5. 只要所有文件夹完成填充了 MemLeakCheckDiffer 窗口之后,请立即选择 生成全面报告
  6. 将会生成每个关卡的 CSV,同时还会创建一个 GlobalSummary CSV。
  7. CSV 位于放置您的 MemLeakCheck 文件的文件夹内部。

全面趋势数据解析


  1. 在 Excel 中打开 GlobalSummary 电子表格。
  2. 为了更加轻松地查看内容数据,隐藏除下面内容之外的所有代码行:
    • LowestTFP
    • AnimSequenceClasses
    • SkeletalMesh_Classes
    • SoundNodeWave
    • StaticMesh_Classes
  3. 高亮显示这 5 行以散列表元名称开头以这一行最后一个值结尾的代码。
  4. 选择它们后,选择 插入 > 线图
  5. 它可供您大致了解每个内容散列表元状态以及关卡内存整体趋势。

解析单独的关卡 CSV


在您知道内存封装的位置之后,您需要查出那些可能会导致内存发生改变的内容散列表元。这是从指定双列直插封装中找到内存最小值,然后从这个封装中选取散列表元的值并在双列直插风窗开始之前减去减去这些散列表元的值。它将会使您轻松地确定在这个位置引发最多问题的内容散列表元。

例如,如果关卡在进行双列直插封装之前具有 10 MB 的 AnimSequence Class 数据,而且只要这个封装开始,在这个散列表元中它就会增加为 25 MB,LD 和其他开发人员将会了解到这里记载了一些需要很多动画数据的东西,而这样将会使关卡的内存降低。

如果可以,每个双列直插封装都应该随附这个数据。只需让 LD 知道随双列直插封装时加载的 w/子关卡改变的内容散列表元数量,通常这样做就足以使他们想出哪些需要来回转换或者哪些可能需要从关卡中剔除。

为关卡设计师准备‘人性化’热点报告


在为关卡设计师准备热点报告的时候,谨记要传送尽可能多的可操作信息。也就是说他们需要知道在对内存进行双列直插封装后会发生什么事情。为达成此目的,我们可以确保包含一个内存开始减少时候动态载入的新子关卡的列表。

我们还会提供一个可以在进行封装之前将 LD 直接带到关卡区域的 bugit 位置,以便允许他们在编辑器或游戏中的这个位置环顾四周,使他们可以熟悉这里发生的事情以及可能需要改变的数量。

下面是一个关于我们的热点报告的示例:

加载下面的子关卡进行测试过程中达到的最低内存值是 20 MB:

  • SP_Example_W
  • SP_Example_02_boss
  • SP_Example_02_S
  • SP_Example_03
  • SP_Example_04

从下面的图表中,您可以看到 2 个双列直插封装位于 30 MB 标记以下:

examplegraph.jpg

第一个双列直插封装

下面的 bugit 位置会在进行该封装之前直接将您带到关卡区域:

  BugItGo -1858.2000 -2162.7903 1572.0010 64073 -16686 0=
  

在进行双列直插封装过程中,Anim Sequence Classes 增加了 15 MB,Skeletal Mesh Classes 增加了 5 MB,Sound Node Waves 增加了 5 MB 以及 Static Mesh Classes 增加了 2 MB。

以下是在进行双列直插封装第一部分的第三次和第六次捕捉数据之间动态载入的新子关卡:

  • SP_Example _Cine

第二个双列直插封装

下面这个 bugit 位置会在进行第二次封装之前直接将您带到关卡区域。

  BugItGo 904.3768 261.3029 1761.1804 -4788 -20256 72
  

在进行双列直插封装过程中,Anim Sequence Classes 增加了 10 MB,Skeletal Mesh Classes 增加了 2.5 MB,Sound Node Waves 增加了 5 MB 以及 Static Mesh Classes 增加了 1 MB。

在第 8 次和第 12 次捕捉数据之间进行第二次封装的过程中动态载入下面的子关卡:

  • SP_Example_02_boss
  • SP_Example_02_S
  • SP_Example_03

要标注的项


通常在进行封装的单独散列表员中的任何大型变更都应该标注。在很多情况下,例如,过场动画,由于像开启烘焙和剔除这样简单的解决方法的 bug 会使某些散列表元大量增加。通常最好可以尽快完成所有此类可以轻易实现的目标。

要避免的项


在编译热点报告的时候,您需要避免标注 LD 无法对其施加作用的散列表元。您还需要确定这里是否有会提供可操作数据的散列表元。在我们的测试中,Texture 池统计数据不是可以查看内存的有效散列表元,这是因为限制它们的方式与记录的内容有所不同。

准备一个追踪热点报告


追踪热点报告允许 LD 们查看自从他们接收到第一份内存报告开始进行改进或衰退的程度。在内存改进(甚至在内存足够好不需要再改进的时候)之后发送一份追踪报告可以帮助 LD 了解他们进行的更改产生的积极作用,所以这样做至关重要。

最终目标是使关卡处于并保持在内存中,与此同时使 LD 有希望发现目前他们的关卡整体状况是决定它是否会发生的关键。

长时间运行


只要内存中有足够的关卡,就可以在多个关卡上开始进行长期内存运行。要进行这项操作,您只需查找没有阻塞的关卡的一大段时间,然后启动 domemleakchecking 30 命令并尽量播放的时间长一些。在运行这些内存的过程中我们可以使用 reducepoolsize 运行,所以我们可以得到一段最长的时间。

使用这个数据,您可以比较运行和不断运行单独关卡之间的差异,从而得到这两者的内存 delta 基数。查看这个 delta 将会使您知道开始构建为单独关卡将需要的花费,而且会帮助定位可能会发生的任何内存泄露。

冷点报告


只要解决了内存封装的问题并且游戏在内存范围内(并且时间允许),可以执行冷点报告系统。这就意味着要不断地重复进行收集内存这个过程,但是现在您将需要集中精力于哪些区域有可以添加内存的空间,而不需要缩减内存。如果可以尽早完成这项操作,那么允许 LD 将那些恰好在内存范围内的区域勾勒得栩栩如生。