Unity优化之Native Memory

当优化应用程序时,本机内存是一个关键部分,因为大多数引擎代码都在常驻内存中。当您将代码集成到本机插件中时,您可以直接控制它,但是从Unity内部系统控制和优化本机内存消耗并不总是可能的。内部系统使用不同的缓冲区和资源,这可能并不总是显而易见的影响内存消耗。下面的部分详细介绍了Unity内部系统,并解释了在本机探查器中经常看到的内存数据。

Native Buffer

Unity使用许多不同的本地分配器和缓冲区。有些是持久的,例如常量缓冲区,而另一些是动态的,例如后缓冲区。下面的小节描述缓冲区及其行为。

Scratchpad

Unity将常量存储在一个4MB缓冲池中,并在帧之间通过池循环。池在其生存期内绑定到GPU,并显示在Xcode或Snapdragon等帧捕获工具中。

Block allocator

Unity在一些内部系统中使用块分配器。每当Unity需要分配新的内存页块时,都会有内存和CPU开销。通常,页面的块大小足够大,以至于只有在Unity第一次使用系统时才会出现分配。在第一次分配之后,页面块被重用。在内部系统如何使用块分配器方面存在细微的差异。

AssetBundles

第一次加载asset bundle时,由于块分配器启动,需要额外的CPU和内存开销,从而允许Asset Bundle分配第一页内存块。

但是,Unity重用Asset Bundle 系统分配的页面,如果您希望一次加载多个Asset Bundle ,则可能需要分配第二个或第三个块。在应用程序终止之前,所有这些都是保持分配状态的。

Resources

Resources使用与其他系统共享的块分配器,因此在首次从Resources加载资产时(正如在启动过程中已经发生的那样),没有CPU或内存开销。

Ringbuffer

Unity使用环形缓冲区将纹理推送到GPU。可以通过QualitySettings.AsyncUploadBufferSize调整此异步纹理缓冲区。注意:在Unity分配环缓冲区内存之后,不能将其返回到系统。

Assets

Assets在运行时会导致本机和托管内存问题。除了托管内存之外,Unity在不再需要时将本机内存返回到操作系统。由于每一个字节都有价值,特别是在移动设备上,您可以尝试以下方法来减少本机运行时内存:

  • 从网格中删除未使用的通道
  • 从动画中删除多余的关键帧
  • 使用“Quality Settings”中的“maxLOD ”从构建中删除细节组中更高的网格。
  • 在生成之后检查editor.log,以确保磁盘上每个资产的大小与其运行时内存使用成比例。
  • 通过使用Quality Settings 的Rendering部分中的Texture Quality设置来减少上载到GPU内存的内存,以通过mipmap强制降低纹理分辨率。
  • 法线贴图的大小不需要与漫反射贴图(1:1)的大小相同,因此您可以对法线贴图使用较小的分辨率,同时仍然可以获得较高的视觉逼真度,并节省内存和磁盘空间。

请注意,由于托管堆的严重碎片化,托管内存的影响通常会超过本机内存问题。

Cloned Materials

请注意克隆的材质,因为访问任何渲染器的“材质”属性都会导致克隆材质,即使未指定任何内容。此克隆的材料不会被垃圾收集,只有在更改场景或调用resources.Unloadunusedassets()时才会清除。如果要访问只读材料,可以使用CustomRenderer.SharedMaterial。

Unloading Scenes

调用UnloadScene()销毁和卸载与场景关联的游戏对象。注意:这不会卸载关联的资产。为了卸载资产并释放托管内存和本机内存,需要在卸载场景后调用 Resources.UnloadUnusedAssets()

Audio

Virtual Voices

Unity根据平台的实时可听性动态地将声音设置为虚拟或真实。例如,Unity将播放距离较远或音量较低的声音设置为虚拟声音,但如果这些声音靠近或变大,则会将其更改为真正的声音。 Audio Settings 中的默认值对于移动设备来说是很好的值。

  Max Virtual Voice Count Max Real Voice Count
Default 512 32
Maximum 4095 255

DSP Buffer Size

Unity使用DSP buffer sizes来控制mixer latency。Audio System FMOD定义了与平台相关的DSP缓冲区大小。缓冲区大小会影响延迟,因此应仔细处理。缓冲区的数量默认为4。Unity中的音频系统对Unity中的音频设置使用以下采样计数:

Latency = Samples * Number of Buffers Samples Number of Buffers
Default iOS & Desktop: 1024 Android: 512 4
Best latency 256 4
Good latency 512 4
Best performance 1024 4

Audio Import Settings

使用正确的设置可以节省运行时内存和CPU性能。

  • 如果音频文件不需要立体声,则启用“ Force to mono”选项;这样做将减少运行时内存和磁盘空间。这主要用于带有单声道扬声器的移动平台。
  • 较大的音频剪辑应设置为Streaming。Unity5.0及更高版本中的流媒体有200KB的开销,因此您应该将小于200KB的音频文件设置为Compressed into Memory
  • 对于较长的剪辑,以Compressed into Memory方式导入音频以节省运行时内存(如果剪辑未设置为Streaming)。
  • 只有当您有足够的内存,并且需要考虑cpu性能的时候,使用Decompress On Load,因为此选项需要大量的内存。

各种平台还应该首选压缩格式设置来节省运行时内存和磁盘空间:

  1. 对于非常短的剪辑(如经常播放的声音效果),将压缩格式设置为adpcm。ADPCM提供固定的3.5:1压缩比,并且解压缩成本低。
  2. 在android上使用vorbis进行更长的剪辑。Unity不使用硬件加速解码。
  3. 在iOS上使用MP3或Vorbis可获得更长的剪辑片段。Unity不使用硬件加速解码。
  • MP3或Vorbis需要更多资源进行解压缩,但提供的文件大小要小得多。高质量的MP3需要较少的资源进行解压,而任何一种格式的中低质量文件都需要几乎相同的CPU时间进行解压。
  • 提示:使用Vorbis可以获得更长的循环声音,因为它可以更好地处理循环。MP3包含预定大小的数据块,因此如果循环不是块大小的精确倍数,则MP3编码将增加静音,而Vorbis则不会。

猜你喜欢

转载自blog.csdn.net/s15266312720s/article/details/89819704