UDN
Search public documentation:

MobileLoadTimesAndInstallPackageSizeCH
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

移动设备应用程序加载时间及安装后所占空间大小

文档概要:减少移动设备应用程序的加载时间及最终安装程序所占空间的常用方法。

文档变更记录: 最初创建。

概述


本文列出了一些用于确定及降低您的应用程序加载时间及安装文件大小的常见方法。

加载时间


着色器


在移动设备平台上,着色器编译通常占用大量的启动时间。一般在游戏运行时花费这么大的消耗是不可接受的,因为随着帧频率的停顿编译时间将会变得非常明显。为了避免这种停顿,虚幻引擎将会通过预先编译及渲染这些着色器在启动时‘准备’大部分着色器。让该系统完成大部分必要的编译着色器补充步骤。 目前,移动设备没有提供保存 预先编译好的/预先准备的 以供稍后加载的二进制文件。

Shader Keys(着色器关键码)

UE3中移动设备上的着色器通过它们独特的着色器关键码加以区分。请参照MobileMaterialReference中的信息来获得关于这个实现的介绍。降低着色器关键码的数量不是简单的在您的应用程序中降低总的材质数量的问题,因为材质可以根据特定的材质设置生成不同数量的关键码。

减少Shader Keys(着色器关键码)


移动设备着色器分析器

MobileShaderAnalyzer工具可以帮助您获得您的应用程序正在生成的着色器关键码的数量、这些关键码从哪些材质生成而来、及如何修改材质来降低着色器关键码的数量。请参照上面的连接获得使用该工具的信息。

重复的关键码

正如文章中针对MobileShaderAnalyzer所提到的,通常材质将迭代具备某些设置的多个版本,因为引擎不知道这些材质是如何被使用的。通过清晰地告知引擎您使用这些材质的目的,您可以从您的应用程序中删除很多重复的版本。

  • 植皮. 如果您看到具有皮肤和没有皮肤的着色器的两个版本,并且您知道将要总是在植皮的网格物体上使用它们,那么您可以将该材质添加到您的应用程序的!DefaultEngine.ini文件下的!MobileMaterialCookSettings部分中。在该部分添加一行 ‘+SkinningOnlyMaterials=’。在烘焙过程中将仅创建该着色器带皮肤的版本,将立即将该材质所创建的关键码数量减少一半。示例:

[MobileMaterialCookSettings]
+SkinningOnlyMaterials=M_FireChest
+SkinningOnlyMaterials=M_IceChest

  • 雾 如果您在您的游戏中启用了雾,那么引擎将会创建带雾和不带雾的着色器版本,当任何可能的情况下为了获得更好的性能时,将会动态地使用不带雾的着色器进行渲染。如果您的应用程序能够承受一直用带雾的版本的着色器所带来的性能消耗,那么您可以通过在您的应用程序的!DefaultSystemSettings.ini的[SystemSettings]部分下设置bMobileMinimizeFogShaders=true来禁用该着色器迭代版本。
  • 粒子设置 有很多粒子设置可以强制 打开/关闭 着色器中的某个迭代版本。如果您看到启用了您不需要的任何关键设置,那么可以在材质中禁用那个功能。

Material Instance Constants(材质实例常量)

最小化着色器关键码创建数量的最好方法是尽可能地利用主材质和材质实例常量(MICs)。在子材质中改变材质实例常量一般不会增从主材质创建的着色器关键码的数量。从主材质着手创作您的内容是稍后项目中着色器关键码呈爆炸式增多的很好方法。请查看MaterialInstanceConstant (材质实例常量)页面了解更多信息。

其它着色器关键码相关注意事项


Shader Groups(着色器组)

着色器组尽管不能帮忙消除着色器关键码,但是却可以通过在应用程序中延迟预先准备着色器关键码子集的时间点。最常见的例子是地图加载。您可以在您的应用程序中快速地为每个关卡创建一个着色器组,然后烘焙器将那个地图所有的关键码添加到它自己的着色器组中,并根据加载的关卡不同动态地预先准备这些关键码。这在某种程度上增加了您得地图加载时间,但是一般却大大地降低了您的应用程序的总加载时间。 每个地图的着色器组是通过Engine.ini文件的!MobileShaderGroups部分创建的,如下所示:

 [Engine.MobileShaderGroups]
.ShaderGroup=MyGroup
.Package=MyMapName

由!MyMapName 所指出的地图引用的着色器激昂会被添加到一个“MyGroup”着色器组,当您加载该地图时将会编译并准备这些着色器。 您可以从您的游戏烘焙器辅助工具(如果您已经写了这个工具)动态地创建着色器组,如下所示:


Commandlet->AddDynamicMobileShaderGroup(FName(*GroupName), FName(*PkgFilename));

在游戏过程中,当您需要编译这些着色器时,仅需要调用


GMobileShaderInitialization.StartCompilingShaderGroup(FName(*ShaderGroupName), TRUE);

当您想加载屏幕或者某些其他静态UI时您将需要这样的编译,以便 不会出现停顿现象。

未预先准备的关键码

注意,有些时候可能会有引擎不会动态地预先准备某些着色器关键码的情形,一般会发生在第三方软件绑定到引擎渲染通道上的情形中。您可以通过在您的!DefaultEngine.ini 文件中包含它们来手动地将这些关键码在启动时进行预先准备,如下所示:

[Engine.StartupShaderKeys]
.Key=0x1980000000_0x3000000000000000

引导时间分析

请参照ProfilingBasics获得关于分析引导时间的信息。

应用程序大小


以下部分讨论了可以帮助您识别及降低您的最终应用程序包大小的工具及方法。

IPA 查看器(iOS)


对于iOS设备,您的最终可执行包被编译成一个单独的可以部署到该设备上的.ipa 包。位于UE3/UDK Binaries文件夹下的IPAExamine.exe程序是个命令行应用程序,用于报告您的IPA中包含的各种文件大小的详细情况。 可以通过在命令行上输入以下命令来获得这个工具的详细帮助信息:

IPAExamine /?

。 最简单的应用是运行

IPAExamine <您的ipa文件的完整路径>

该命令将会列出IPA中包含的内容,按扩展名排列,有一个概括表格详细说明了各个文件类型的文件的所占空间的大小。通常,仅需要这步就能指出针对那些数据作出调整可以将此整体的应用程序大小。

注意,通过在您的系统设置ini文件中启用!MobileFlashRedForUncachedShaders布尔项,可以判断着色器是否是在运行时进行预先准备的。

检查已烘焙的数据


一旦您找出了您的安装包中可以降低整体大小的目标位置,您或许会需要进一步查看那些内容来找出哪些特定的资源是主要诱因。通常导致应用程序过大的最大的罪魁祸首将是网格物体或者贴图数据。以下工具将可以帮助判定是否是这种情形,并针对每种情况进行进一步探索:

有用的命令行开关

PkgInfo

要检查您的烘焙包(.XXX文件)中的内容,你可以使用!PkgInfo命令行开关,详见CommandletList页面的介绍。 比如,


Gamename.exe PkgInfo <path to package> -exports –simple –platform=<platform> > myfile.txt

该命令的输出结果可以快速地导入到Excel中以便对包内容进行深入分析。 如果您不知道为什么某个资源会被包含到该包中,那么Find Asset Referencers Commandlet(找到资源引用项命令行开关)或虚幻编辑器中的‘List Objects that reference this object(列出引用该对象的对象)’功能应该可以提供这方面信息。

挖掘烘焙包数据

另一个有用的工具是MineCookedPackages命令行开关,用于将版本的大部分已烘焙资源上的数据填充到一个SQL数据库中。详细信息可以在上面链接的wiki页面中找到。

挖掘TFC数据
Mine Cooked Packages命令行开关是非常强大的,但是目前没有考虑到编辑器中设置的贴图上的LODBias信息,及由于!DefaultSystemSettings.ini文件中的贴图组设置导致的任何贴图变化(在运行时考虑了每个设备的设置,但在烘焙过程中使用‘base’设置)。 如果在engine.ini的 [TextureStreaming] 部分!MinTextureResidentMipCount设为0(对于移动设备开发来说这是默认值),那么所有的已烘焙贴图将完全位于您的TFC文件中。知道这一点,您可以创建日志文件,该文件详细列出了添加到你的.tfc文件中的每个贴图,并使用它作为您的最终贴图验证清单。要想完成这个处理,需要重新对所有数据进行完全烘焙,并向烘焙器命令行中传入 –WriteTFCReport标记。这将向您的游戏文件夹中输出一个CSV文件 (TFC_Generation_Report.txt),该文件详细描述了烘焙的每个贴图层,列出了它所在的包和大小。