This page has been translated automatically.
视频教程
界面
要领
高级
实用建议
基础
专业(SIM)
UnigineEditor
界面概述
资源工作流程
Version Control
设置和首选项
项目开发
调整节点参数
Setting Up Materials
设置属性
照明
Sandworm
使用编辑器工具执行特定任务
如何擴展編輯器功能
嵌入式节点类型
Nodes
Objects
Effects
Decals
光源
Geodetics
World Nodes
Sound Objects
Pathfinding Objects
Players
编程
基本原理
搭建开发环境
使用范例
C++
C#
UnigineScript
统一的Unigine着色器语言 UUSL (Unified UNIGINE Shader Language)
Plugins
File Formats
材质和着色器
Rebuilding the Engine Tools
GUI
双精度坐标
应用程序接口
Animations-Related Classes
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
VR-Related Classes
创建内容
内容优化
材质
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Tutorials
注意! 这个版本的文档是过时的,因为它描述了一个较老的SDK版本!请切换到最新SDK版本的文档。
注意! 这个版本的文档描述了一个不再受支持的旧SDK版本!请升级到最新的SDK版本。

内存分配器

Allocator负责管理应用程序的内存分配。例如,创建新节点时需要进行RAM分配。

默认情况下,标准系统malloc动态地在堆上分配内存。但是,使用标准分配器可能会导致性能下降:每次分配都需要额外的内存量。换句话说,操作系统存储有关内存分配的数据,这可能会消耗大量RAM。此外,标准系统分配器提供有关内存消耗统计信息的不准确信息。

这就是为什么UNIGINE除了标准系统malloc之外还提供自定义分配器。它在中分配内存,使分配过程更快,更有效。此外,它还可以收集内存消耗的统计信息,包括分配总数和每帧分配数的信息。

注意
UNIGINE分配器收集小分配的统计信息,因为内存泄漏主要发生在大小高达4000字节的小分配中。要检查统计信息,请运行memory_info控制台命令。

内存池#

UNIGINE自定义分配器为分配提供了两个主内存池静态动态

  • 静态池在引擎启动时只分配一次,不能更改。
  • 动态池动态增加,并在静态池中分配的内存已满时发挥作用。
注意
每种类型可以有几个池。池的大小始终是16的倍数。

还有额外的实例池,用于存储开发人员定义的分配。通常,这些都是定期需要的分配。它们的工作方式与动态池相同,但实例池没有大小限制。

静态池#

静态池对于优化内存消耗至关重要。换句话说,在使用静态池时,每个分配消耗的额外内存大约为零。另外,它优化了分配本身,使它们更快。

配置静态池#

静态池受您应预先指定的大小值的限制。为此,您需要知道所需的内存量及其布局。简而言之,您需要知道每种类型(16,32,48字节等)要分配多少内存。例如,下图演示了四个静态池,其中包含16、32、48和64字节的分配:

注意
UNIGINE提供了自动配置静态池的功能。但是,我们建议根据您的项目需要设置静态池。

静态池的配置应该为对应于最低规格的特定硬件完成。静态池设置存储在.boot配置文件中。

注意
当内容完成后,必须为发布版本执行此过程。在此点之后所做的任何更改都可能使静态池配置不理想。

一般来说,过程如下:

  1. 在项目中,确定需要大量内存的位置。
  2. 设置您的项目,使其从此位置开始。
  3. 使用 -memory_statistics_enabled 1 命令行选项运行应用程序。它将启用收集池配置所需的内存统计信息。
    注意
    仅当之前没有配置静态池时,才会收集统计信息。
  4. 在控制台中,运行memory_optimize_static_pools控制台命令以更新和优化静态池。
  5. 紧接着,运行boot_config_save控制台命令将静态池设置保存到.boot配置文件中,以便在下次应用程序启动时使用它们。
  6. 重新启动应用程序以使用更新的静态池配置。
注意
如果超过限制,静态池将无法运行。在这种情况下,将激活动态池

动态池#

注意
Linux操作系统不支持动态池。

动态池也可以优化性能,但不能优化内存消耗。但是,它们仅受RAM大小的限制,这是一个优点。此外,动态池更灵活,因为它们可以根据需要扩展和缩小它们的大小。

注意
如果您没有根据项目的需要设置静态池的大小,则将主要使用动态池。

配置动态池#

每个动态池存储特定类型的分配:16、32、48字节分配等。因此,您始终可以检查动态池中分配了多少每种类型的内存。这些值始终是16的倍数。例如,在下面的图片中,有16个不同大小的池:

要配置动态池,可以使用memory_dynamic_pool控制台命令。它通过指定分配的最大大小来定义动态池的数量。默认情况下,它设置为256字节,这意味着有16个池包含大小从16到256字节的分配。

注意
由于分配的大小是16的倍数,指定的值将在必要时自动调整。

分析池统计#

要获取有关所有已分配静态和动态内存池的信息,请使用memory_info控制台命令。

它将小分配的统计信息显示为一个表,其中每行对应一个内存池。

静态池分配

  • 第一个值指示存储在池中的分配类型。
  • 第二个值显示池中的当前内存分配。
  • 第三个值表示池中发生的最大内存消耗。此值指示引擎请求的最大内存量(峰值消耗)。
  • 第四个值指示引擎启动时的初始内存分配,它定义了引擎可以从池中消耗的最大内存量。
  • 第五个值表示维护池所需的RAM开销。
  • 第六个值表示当前分配的数量,以百万为单位。
动态池分配

  • 第一个值指示存储在池中的分配类型。
  • 第二个值指示池中保留了多少分配以供进一步使用。此值限制为2Mb。
  • 第三个值显示池中的可用分配量。
分配总数

表中的值提供了所有池中发生的所有内存分配的统计信息

显存分配#

除了自定义RAM分配器外,UNIGINE还提供了一个使用内存池管理VRAM分配的选项。

注意
显存池仅用于PC应用程序,因为在控制台上使用显存的过程与在Pc上使用的过程不同。

使用显存分配至少有两个原因:

  • 默认情况下可分配的最小内存块为64Kb。为了避免为显着较小的图形资源(例如,需要少于64Kb的纹理)分配如此大量的内存,我们需要使用内存池。
  • 分配的过程极其缓慢,因此我们必须提前分配显存,然后根据需要进行分配。
注意
默认情况下启用VRAM分配。

配置池#

有控制台命令允许您配置显存分配的池:

d3d12_small_pool_enabled配置文件: *.boot
描述:
  • 打开和关闭小池分配。默认情况下,已启用分配。但是,您可以通过控制台禁用它们,保存.boot配置文件,然后重新启动应用程序以应用更改。
d3d12_small_pool_size配置文件: *.boot
描述:
  • 设置池的最大大小,以Kb为单位。
d3d12_small_pool_chunk_size配置文件: *.boot
描述:
  • 指定可分配的内存块的最小大小,单位为Kb。块的大小将等于或大于此值。

配置块大小时,必须在峰值、性能和内存消耗之间找到平衡。块大小越大,帧率和性能越稳定,但内存消耗越大。因此,我们建议运行测试并微调值。

分析池统计#

要获取有关所有已分配显存池的信息,请使用video_memory_info控制台命令。它将为您提供以下信息:

注意
池的数量可能因显卡而异。
Heap Default 表中的值显示默认堆的统计信息,包括当前VRAM消耗、分配的VRAM量、池中的分配数等。
Heap Upload 表中的值显示用于上载堆的统计信息。
Heap Readback 表中的值显示用于回读堆的统计信息。

有关更多详细信息,请参阅本文

分析分配#

UNIGINE提供有关RAM和VRAM使用和分配分析的统计信息。要访问此信息,请运行通用分析器并查看以下值:

注意
统计信息将因操作系统而异。

RAM分配统计#

CPU ram free 当前可用内存量。
CPU ram usage physics 工作集的当前大小。工作集是当前在物理RAM中可见的内存页集(检查源)。
CPU ram usage committed 内存管理器为正在运行的进程提交的私有内存总量(检查源)。
CPU ram malloc UNIGINE自定义分配器分配的内存量。
CPU ram static pool 静态池中分配的内存量。
CPU ram dynamic pool 动态池中分配的内存量。仅适用于Windows。
CPU ram instance pool 实例池中分配的内存量。
Frame Allocations 每帧进行的分配数量。
Live Allocations 运行时期间分配的当前/最大数量(峰值消耗)。

VRAM分配统计#

GPU vram free 当前可用的显存量。
GPU vram usage GPU使用的VRAM量。此值由图形驱动程序提供。
GPU ram usage GPU使用的RAM量。此值由图形驱动程序提供。
GPU alloc 引擎在GPU上进行的分配数量。
GPU Frame Allocations 每帧进行的显存分配数。
GPU Live Allocations 运行时期间分配的当前/最大数量(峰值消耗)。
GPU Allocator small pool size VRAM池的最大大小。
GPU Allocator small usage 显存池的实际使用情况。

还有一个单独的统计块,用于跟踪蒙皮网格贴花的分配。

GPU Allocator skinned 为蒙皮网格分配的显存量。
GPU Allocator decals 为贴花分配的显存量。

场景中的每个蒙皮网格都独立分配内存。蒙皮网格的VRAM在单独的池中以块的形式分配。UNIGINE允许通过skinned_mesh_pool_chunk_size控制台命令配置块的大小。默认情况下,它是64Mb。

注意
块大小越大,蒙皮网格的性能越高。

贴花也是如此。要配置贴花的块大小,请使用decal_pool_chunk_size控制台命令。

最新更新: 2024-09-05
Build: ()