内存使用

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

你添加到体验中的每个建筑和脚本组件都会消耗内存。当内存使用达到引擎限制时,用户的设备或服务器可能会崩溃,因此您需要主动监控内存使用并采取优化措施。 开发者控制台 提供两个用于监控内存使用的工具,包括:

  • 内存 — 查看使用类别的实时内存消耗,包括你的自定义组件和引擎内部过程的内存使用。

  • Luau堆 — 在堆内存上创建截图,这表示对你的脚本的内存分配。该工具提供各种内存分配视图,可以帮助您从不同角度识别当前内存分配和问题,例如对象类型和引擎类类别。它还允许您创建多个快照来比较随时间推移的内存使用差异。

您可以使用以下任意方式在测试或实时体验会话期间打开控制台:

  • F9
  • 在聊天中输入类型 /console
  • 使用经验菜单:
    1. 打开体验中的 Roblox 菜单

    2. 选择 设置 标签。

    3. 滚动到 开发者控制台 并单击 打开

记忆

内存 工具分类和显示实时内存使用。它显示每个类别的内存使用量以 MB 并生成时间变更的图表。

要查看内存分配:

  1. 打开 开发者控制台

  2. 扩展工具下拉列表以选择 内存

    Dropdown menu of all Developer Console tools with the Memory option highlighted for selection.
  3. 扩展客户端-服务器下拉列表以选择 客户端服务器

  4. 浏览内存使用类别和项目。对于想要查看超时使用模式的类别或项目,扩展类别以显示图表。

    • 核心内存 — 引擎核心构建过程的内存使用,包括网络、虚拟形象和图形用户界面(GUI)元素,这些元素你没有直接控制权。

    • 放置内存 — 根据您构建体验的方式使用内存,包括模型、地形、零件、脚本和所有其他自定义元素,您添加到体验中的。

      类别描述
      HttpCache 来自 Roblox 服务器的资产(图像、网格等)已加载到内存中的缓存中。
      实例 Instances 在那场景。
      信号 在实例之间发射的信号(向一个实例发射事件以触发另一个实例的事件)。
      Lua堆 用于核心脚本(与 Roblox 客户端一起发布的脚本)和自定义脚本的堆内存。
      脚本 Luau 脚本。
      物理冲突 物理模拟的碰撞数据。
      物理部件 物理几何和动力学。
      图形实体模型 图形数据渲染固体模型。
      图形网格部件 用于 MeshPart 对象的图形。
      图形粒子 用于粒子系统的图形。
      图形部件 零件的图形。
      图形空间哈希 一般渲染。
      图形地形 地形图形。
      图形纹理 纹理记忆。
      图形纹理角色 角色的纹理记忆。
      声音 内存中的声音。
      流媒体声音 传送声音。
      地形声量 地形体素。
      地形物理 地形物理。
      用户界面 常用的图形用户界面元素使用的内存。
      动画 用于动画数据的内存,例如姿势和 KeyframeSequence 用于虚拟形象动画的缓存数据。
      导航 支持结构使用的内存为 PathfindingService
    • 未跟踪内存 — 系统无法轻易分配给特定来源的内存分配。

    • 放置脚本记忆 — 使用您的脚本的内部记忆,了解如何个别脚本和自定义记忆标签对整体内存使用的贡献。

    • 核心脚本内存 — 你没有直接控制权的内部引擎脚本的内存使用。

    在这些类别中, PlaceMemoryPlaceScriptMemory 是最重要的性能优化类别,因为它们可以帮助您了解您的建筑和编程选择如何影响内存消耗和优化潜在领域。了解更多关于 PlaceScriptMemory 的深度信息,您可以使用 Luau 堆 工具来创建截图并分析不同 метри克的内存分配。

Luau堆

Luau堆 工具允许您在堆内存当前分配上创建快照,该快照指向将堆内存分配给 Luau脚本存储变量、表、函数和其他运行时数据结构的内存分配。该工具提供各种内存分配视图,可帮助您从不同角度识别内存分配和问题,例如对象类型和引擎类类别。它还允许您创建多个快照来比较随时间推移的内存使用差异。

创建快照

要创建您记忆分配的快照:

  1. 打开 开发者控制台

  2. 扩展工具下拉列表以选择 LuauHeap

    Dropdown menu of all Developer Console tools with the LuauHeap option highlighted for selection.
  3. 扩展客户端-服务器下拉列表以选择 客户端服务器

  4. 点击 创建快照 按钮。

分析内存使用

该工具提供五个视图,您可以从中选择查看基于不同视图的 Luau 内存分配:

  • — 显示聚合的内存使用树,每个节点代表分配内存的对象
  • 对象标签 — 显示运行时类型的内存大小和数量,例如 functiontablethread
  • 内存类别 — 显示由引擎分配的内存类别的内存大小和数量。引擎在分配时将一个记忆类别分配给对象。
  • 对象类别 — 显示由脚本使用并存储其实例的引擎类别的内存大小和数量,例如 EnumItemAnimationCFrame
  • 独特参考 — 显示没有数据模型中的父级的实例数量和总数,以及所有路径,这些路径只能通过脚本访问实例对象。

图表

视图是所有 Luau 堆视图中最详细和复杂的视图。它显示一个聚合的内存使用树,每个节点代表分配内存的对象。树展示了对象之间的连接以及对象参考之间最短路径的派生。它具有以下内存大小列:大小 — 自身内存使用加上数据结构内的内存使用。自己 — 为数据结构本身直接分配的内存,不包括任何包含的内容的内存使用。

An example Graph view

树图根的根是 registry ,它存储所有引擎和 Luau 参考,例如连接到信号的函数或任务库、由模块脚本返回的表和类,以及全球函数、表和类别。通常会父辈以下常见入口:

  • Module @Path.To.Module 是由模块脚本返回的表。
  • name:123 =Path.To.Module 是指特定脚本中的函数。匿名函数没有名称。顶层节点经常指向全球脚本函数。 无名函数没有名称。例子::1= Workspace.[Username].Animate
  • upvalue 是捕获函数的参考。请参阅捕捉本地范围获取更多信息。
  • env 指的是函数的环境。在大多数情况下,它是代表脚本全球范围的表。
  • globals 指的是线程的环境。
  • [key] 代表用作表键的对象。
  • array 代表一个阵数组。
  • stack 指的是存储所有函数本地的阵列。
  • constants 代表函数使用的所有常量值。

记忆类别

内存类别 视图显示内存大小和内存类别,这是引擎在分配时为对象分配的。默认情况下,内存类别与脚本名称相同,或您可以使用 debug.setmemorycategory 函数分配自定义内存类别名称。

唯一的参考

独特引用视图显示没有数据模型中的父级的实例的内存使用,只能通过脚本访问,以及所有路径锁定实例对象的路径。该视图有两个 метric:

  • 计数 — 显示可从同一路径访问的具有相同名称的实例数量,例如同一表中命名为 Dragon 的多个实例。
  • 总实例数 — 显示那些根中的所有对象、脚本和声音对象的总数,构成一个 Dragon 实例。
An example Unique Reference view

这个视图有助于识别不需要连接的实例,当您不再需要它们时需要断开。如果您在此查看中看到许多意外情况,请检查它们所持有的路径,并评估它们是否必要。