Unity官方文档中关于内存管理的翻译(2021.3)

news2024/11/19 3:45:01

原文:Memory in Unity - Unity 手册

Unity内存管理

为了确保您的应用程序运行时没有性能问题,了解Unity如何使用和分配内存非常重要。本文档的这一部分解释了Unity中内存是如何工作的,适用于希望了解如何提高应用程序内存性能的读者。

Unity使用三个内存管理层来处理应用程序中的内存:

1. 托管内存:一个受控的内存层,使用托管堆和垃圾收集器来自动分配和分配内存。

2. C#非托管内存:与Unity Collections命名空间和包一起使用的内存管理层。这种内存类型称为“非托管”,因为它不使用垃圾收集器来管理未使用的内存部分。

3. 本地内存:Unity用于运行引擎的C++内存。在大多数情况下,这个内存对Unity用户是不可访问的,但如果您想要微调应用程序性能的某些方面,了解它可能会有用。

托管内存

Mono和IL2CPP的脚本虚拟机(VM)实现了托管内存系统,有时也称为脚本内存系统。这些VM提供了一个受控内存环境,分为以下不同类型:

- 托管堆:VM自动控制的内存部分,使用垃圾收集器(GC)来管理。因此,分配在托管堆上的内存被称为GC分配。分配的任何发生都会在Profiler中记录为GC.Alloc样本。
- 脚本堆栈:当应用程序进入和退出任何代码范围时,堆栈会构建和解开。
- 本地VM内存:包含与Unity的脚本层相关的内存。在大多数情况下,您不需要操作本地VM内存,但了解它包括与代码生成相关的执行代码内存,尤其是关于泛型使用、Reflection使用的类型元数据以及运行VM所需的内存。

由于托管内存系统使用VM,它具有受控环境,自动跟踪分配的引用以管理其生命周期。这意味着您的应用程序不太可能在其他代码尝试访问内存时过早释放内存。这还意味着您对内存泄漏有一些保障,当内存从代码或未使用的内存堆积中不可访问时发生。

在Unity中使用托管内存是管理应用程序内存的最简单方法;但它也有一些缺点。垃圾收集器很方便使用,但在释放和分配内存时的方式不可预测,这可能会导致性能问题,比如当垃圾收集器必须停止释放和分配内存时会发生卡顿。为了解决这种不可预测性,您可以使用C#非托管内存层。

有关托管内存工作原理的更多信息,请参阅托管内存文档。

C#非托管内存

C#非托管内存层允许您访问本地内存层以微调内存分配,同时编写C#代码非常方便。

您可以使用Unity核心API中的Unity.Collections命名空间(包括NativeArray)以及Unity Collections包中的数据结构来访问C#非托管内存。如果您使用Unity的C#作业系统或Burst,您必须使用C#非托管内存。有关更多信息,请参阅作业系统和Burst的文档。

本地内存

Unity引擎的内部C/C++核心具有自己的内存管理系统,称为本地内存。在大多数

情况下,您不能直接访问或修改这种内存类型。

Unity将您项目中的场景、资产、图形API、图形驱动程序、子系统和插件缓冲区以及本地内存内的分配都存储在本地内存中,这意味着您可以通过Unity的C# API间接访问本地内存。这意味着您可以安全且轻松地操作应用程序的数据,而不会失去Unity本地核心中的本地和高性能代码的好处。

大多数情况下,您不需要与Unity的本地内存交互,但每当您使用Profiler时,都可以通过Profiler标记来查看它如何影响应用程序的性能。

原文:Managed memory - Unity 手册

Managed memory

Unity的托管内存系统是基于Mono或IL2CPP虚拟机(VMs)的C#脚本环境。托管内存系统的好处在于它管理内存的释放,因此您不需要通过代码手动请求释放内存。

Unity的托管内存系统使用垃圾回收器和托管堆来自动释放内存分配,当您的脚本不再持有对这些分配的引用时。这有助于防止内存泄漏。内存泄漏发生在分配了内存后,对它的引用丢失,然后永远不会释放内存,因为它需要引用才能释放。

这个内存管理系统还保护内存访问,这意味着您不能访问已被释放的内存,或者对于您的代码来说从未有效的内存。然而,这个内存管理过程会影响运行时性能,因为分配托管内存对CPU来说是耗时的。垃圾回收也可能会在完成之前阻止CPU执行其他工作。

值类型和引用类型

当调用一个方法时,脚本后端会将其参数的值复制到为该特定调用保留的内存区域中,这个数据结构称为调用堆栈。脚本后端可以快速复制占用几个字节的数据类型。然而,对象、字符串和数组通常要大得多,而且脚本后端定期复制这些类型的数据是低效的。

在托管代码中,所有非空引用类型对象和所有装箱的值类型对象都必须分配在托管堆上。

熟悉值类型和引用类型对于有效管理代码很重要。有关更多信息,请参阅Microsoft的有关值类型和引用类型的文档。

自动内存管理

当创建对象时,Unity会从称为堆的中央池中分配所需的内存,这是您的Unity项目选择的脚本运行时(Mono或IL2CPP)自动管理的内存部分。当对象不再使用时,曾经占用的内存可以被回收并用于其他用途。

Unity的脚本后端使用垃圾回收器来自动管理应用程序的内存,因此您不需要使用显式方法调用来分配和释放这些内存块。自动内存管理需要的编码工作较少,并减少了内存泄漏的可能性。

托管堆概述

托管堆是您的Unity项目选择的脚本运行时(Mono或IL2CPP)自动管理的内存部分。

在上面的图表中,蓝色框表示Unity分配给托管堆的一定数量的内存。其中的白色框代表Unity在托管堆的内存空间内存储的数据值。当需要额外的数据值时,Unity会从托管堆(标有A的地方)分配它们的空间。

内存碎片和堆扩展

上图显示了内存碎片的示例。当Unity释放一个对象时,该对象占用的内存会被释放。然而,空闲空间不会成为一个“自由内存”的单一大池。

已释放对象的两侧可能仍在使用。因此,被释放的空间是其他内存段之间的“间隙”。Unity只能使用这个间隙来存储与已释放对象相同或更小尺寸的数据。

这种情况被称为内存碎片化。当堆中有大量可用内存,但只能在对象之间的“间隙”中使用时,就会发生这种情况。这意味着即使总共有足够的空间来分配大块内存,托管堆也找不到足够大的连续内存块来分配给该分配。

(被标注为A的对象是需要添加到堆上的新对象。被标注为B的项目是已释放对象占用的内存空间,以及空闲的未分配内存。尽管总的空闲空间足够,但由于没有足够的连续空间,所以被标注为A的新对象的内存无法适应堆,因此必须运行垃圾收集器。)

如果分配了一个大对象,并且没有足够的连续空闲空间来容纳它,如上所示,Unity内存管理器会执行两个操作:

首先,如果垃圾回收器尚未运行,则运行垃圾回收器。这试图释放足够的空间来满足分配请求。

如果在垃圾回收器运行后,仍然没有足够的连续空间来容纳请求的内存量,则必须扩展堆。堆扩展的具体量取决于平台,但在大多数平台上,当堆扩展时,它会扩展到前一次扩展的两倍。

托管堆扩展注意事项

堆意外扩展可能会引发问题。Unity的垃圾收集策略倾向于更频繁地碎片化内存。您应该注意以下事项:

Unity不会在定期扩展堆时释放分配给托管堆的内存;相反,它会保留扩展的堆,即使其中的大部分部分为空。这是为了防止需要重新扩展堆,如果发生更多的大型分配。

在大多数平台上,Unity最终会将托管堆的空闲部分使用的内存释放回操作系统。这种情况发生的间隔不受保证,不可靠。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1076290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4+经典思路,肿瘤+WGCNA+预后模型鉴定预后标志物

今天给同学们分享一篇4经典思路的生信文章“Identification and validation of a five-gene prognostic signature based on bioinformatics analyses in breast cancer”,这篇文章于2023年1月27日发表在Heliyon期刊上,影响因子为4。 乳腺癌(…

Java集合(三)--- List接口

文章目录 一、List接口常用实现类的对比二、List接口中的常用方法代码 提示:以下是本篇文章正文内容,下面案例可供参考 一、List接口常用实现类的对比 二、List接口中的常用方法 代码 package com.tyust.edu;import org.junit.Test;import java.util.A…

界面组件DevExpress WinForms v23.2新功能预览 - 增强MVVM相关功能

本文主要描述了DevExpress WinForms即将在几个月之后发布的v23.2中包含的新功能,持续关注我们获取更多最新资讯哦~ DevExpress WinForms有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于使用的应用…

Linux 安全 - LSM源码分析

文章目录 前言一、简介1.1 DAC 和 MAC1.2 LSM 调用流程图 二、LSM相关数据结构2.1 struct security_hook_list2.2 union security_list_options2.3 structure security_hook_heads 三、security_bprm_check四、LSM 源码分析3.1 early_security_init3.2 security_init3.2.1 secu…

代码随想录第39天 | ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍 /*** param {number[]} nums* return {number}*/ var rob function(nums) {//dp[i]max(dp[i-2],dp[dp-3])if(nums.length2)return Math.max(nums[0],nums[1])let dpnew Array(nums).fill(0)dp[0]nums[0]dp[1]Math.max(nums[0],nums[1])for(let i2;i<nums.le…

MacDroid pro 1.8(安卓设备文件传输)

MacDroid是一款适用于Mac OS的Android设备管理应用程序&#xff0c;它可以让用户轻松地将Android手机或平板电脑连接到Mac电脑&#xff0c;并在两者之间进行文件传输和数据同步。 通过MacDroid&#xff0c;用户可以通过USB或Wi-Fi连接&#xff0c;快速、简单地将文件从Android…

JVM第一讲:JVM相关知识体系详解+面试(P6熟练 P7精通)

JVM相关知识体系详解面试(P6熟练 P7精通) 面试时常常被面试官问到JVM相关的问题。本系列将给大家构建JVM核心知识点全局知识体系&#xff0c;本文是JVM第一讲&#xff0c;JVM相关知识体系详解和相关面试题梳理。 文章目录 JVM相关知识体系详解面试(P6熟练 P7精通)1、JVM学习建议…

学习vue-router

可参见: vue-router 详解_vue router_七月J的博客-CSDN博客 https://www.cnblogs.com/chen-ao666/p/17144552.html vue-router的使用 使用vue-router的步骤: 创建路由组件 配置路由映射: 组件和路径映射关系 使用路由: 通过和 <router-link>: 该标签是一个vue-router中…

在React中,什么是props(属性)?如何向组件传递props?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【DRAM存储器十三】DDR介绍

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考资料&#xff1a;《镁光DDR数据手册》 目录 DDR SDRAM芯片引脚 DDR SDRAM芯片框…

京东数据报告:2023年常温奶消费市场数据分析

众所周知&#xff0c;目前大家所熟知的乳企品牌最初能够在中国市场立足&#xff0c;靠的就是常温奶产品。作为一个传统领域赛道&#xff0c;常温奶多年来的规模增长大多来自于新老产品的升级迭代。 然而在消费加速升级的当下&#xff0c;常温奶行业显然陷入了僵局&#xff0c;…

软件测试工程师简历项目经验该如何编写(文档)

软件测试工程师简历项目经验怎么写 面试是我们进入一个公司的门槛&#xff0c;通过了面试才能进入公司&#xff0c;你的面试结果和你的薪资是息息相关的。 在面试之前&#xff0c;不得不聊聊简历&#xff0c;简历是职场的敲门砖&#xff0c;是拿到offer的通行证&#xff0c;那…

基于Java+SpringBoot+Vue在线问卷调查系统的设计与实现 前后端分离【计算机毕业设计·文档报告·代码讲解·安装调试】

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Magica Cloth 使用方法笔记

Magica Cloth 使用方法笔记 官方使用文档链接&#xff1a; インストールガイド – Magica Soft 鱼儿效果案例&#xff1a; https://www.patreon.com/posts/69459293 安装环境&#xff1a; 关于在Unity 2018.4.12版本 下 导入 Magic Cloth 之前&#xff0c;需要提前置入的…

Bytebase 2.9.0 - 支持在工单创建前执行 SQL 审核

&#x1f680; 新功能 在工单创建前即可执行 SQL 审核。支持预定义表模板&#xff0c;可在变更或设计 Schema 时应用这些模板。 &#x1f384; 改进 增强工单搜索功能&#xff0c;支持通过「实例/数据库/工单类型/创建日期/创建人/发布人/订阅人」搜索。改进了分支功能的交…

跨行或跨列布局

关键点 1、float 实现 2、flex 实现 3、grid 实现效果预览: html: <div class="container"><h2>float 实现</h2>

广州华锐互动:候车室智能数字孪生系统实现交通信息可视化

随着科技的不断发展&#xff0c;数字化技术在各个领域得到了广泛的应用。智慧车站作为一种新型的交通服务模式&#xff0c;通过运用先进的数字化技术&#xff0c;为乘客提供了更加便捷、舒适的出行体验。 将智慧车站与数字孪生大屏结合&#xff0c;可以将实际现实世界的实体车站…

问题记录:无法删除.dll文件,显示“文件已在Windows资源管理器中打开”

序言 用过的无效方法列表&#xff1a; 360 解除占用无效360 粉碎无效单纯的用taskkill /f /t /im "xxx.dll" 进程名无效 解决方法 1&#xff09;tasklist /m 文件名 tasklist /m 得到进程PID 7692 2&#xff09;taskkill /F /PID 7692 &#xff08;该命令效果…

BeautifulSoup在数据采集中的应用

目录 一、BeautifulSoup库的安装和导入 二、HTML或XML文档的解析 1、直接将HTML文本字符串作为参数传递给BeautifulSoup函数&#xff1a; 2、 通过文件路径或URL加载HTML或XML文档&#xff1a; 三、导航和搜索 1、find()方法&#xff1a;查找文档中的某个元素。 2、 fin…

你真的会维护接口测试用例吗?接口/接口自动化用例常见问题+解决...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口测试用例维护…