unity-内存GC

这篇具有很好参考价值的文章主要介绍了unity-内存GC。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity内存,原生内存(Native Memory)和托管内存(Managed Memory

其中Native Memory大家接触的会比较少,而且可操控性也比较少,例如AssetBundle,Texture,Audio这些所占的内存,这一部分内存是由Unity自身来进行管理的。我们平时开发通常会接触到的是Managed Memory,也就是我们自己定义的各种类

创建内存

第一种new和delete:

Obj *a = new Obj;

delete a;

第二种malloc和free:

Obj *a = (obj *)malloc(sizeof(obj));

free(a);

首先new属于c++的操作符(类似于 +、-等),而malloc是c里面的函数,理论上来讲操作符永远快于函数。

其次new分配成功时,返回的是对象类型的指针,无须进行类型转换,而分配失败则会抛出Exception。而malloc分配成功则是返回void * ,需要通过强制类型转换变为我们需要的类型,分配失败只会返回一个空(NULL)。

然后还有非常重要的一点就是,malloc基本上大家的实现是类似的,new却各有各的不同。我们知道new会去调用构造函数(constructor),所以很多人会把new理解成malloc+constructor,但是这种理解是错误的。因为在c++实现的standard里,你会发现new会不会调用malloc完全由new库的实现来自行决定,也就是说new和malloc是两者独立的。

另外从严格的c++和c的意义上来讲,他们分配内存的位置是不一样的,new会分配在自由存储区(Free Store),而malloc会分配在堆(heap)上。这两者的区别简单来说,你new分配的内存再delete后是否直接释放还给系统是由new自己来决定的,而malloc分配的内存再free后是一定会还回去的。

unity-内存GC

MemoryManager.FallbackAllocation的Tag 栈内存满了。 FallBack到我们的主堆分配器。 耗时长 处理办法 1. 分帧处理 。2。 改源码的 栈内存默认大小。

Managed Memory

unity-内存GC

unity 一次gc 。

当脚本尝试在托管堆上进行分配但没有足够的可用堆内存来容纳分配时,Unity 会运行垃圾收集器。

当垃圾收集器运行时,它会检查堆中的

所有对象,并将应用程序不再引用的任何对象标记为删除。

Unity 然后删除未引用的对象,从而释放内存。

GC的实现

实现GC的策略有很多种,其中最常见一种就是 Tracing garbage collection,或者叫 Mark-Sweep,(unity 用这个)这种算法会通过一个 root Object,遍历这个该对象引用的变量,并且标记,递归这个过程,这样就确定了所有reachable的对象,剩下的对象即视为garbage。

另一种常见的策略还有引用计数(Reference counting),它是通过为每个对象维护一个引用计数,这代表当前对该对象的引用数目,当引用为0,即代表该对象为 Garage。引用技术有如下缺点

  • 循环引用问题
  • 保存计数带来的空间开销
  • 修改引用数目带来的速度开销以及原子性要求
  • 非实时(一个引用的变化可能递归得导致一系列引用修改,内存释放)

有很多算法可以一定程度解决上述问题,顺便一提,C++使用的智能指针即是基于引用计数实现的,COM对象也使用了引用计数来管理。

增量式GC(incremental garbage collection)

上文提到的 Unity GC实现是非分代式的,也就是是说,要么不做,要做就一次性作完。unity 在 2018 的版本推出了所谓增量式GC的功能,还是基于 Boehm–Demers–Weiser garbage collector 的实现,但是不再是非分代式的,这能带来特别的技巧♂中第二点同样的好处,即均衡负载到多帧,消除毛刺。可以缓解卡顿。因为GC的执行分配到每帧了,所以单帧GC的执行时间会受到垂直同步 还有 unity 的 Application.targetFrameRate 的影响。

增量式GC目前还是抢先体验版本,因为它事实上还是存在一些问题,它的基本实现原理还是标记-清扫,但是在两次增量式GC之间,对象的引用可能会发生变化,导致前一次GC的标记失效,需要重新进行遍历标记,最糟的情况会退化为普通的非分代GC(其实更糟,因为前面的工作全白费了)。比如这样的代码文章来源地址https://www.toymoban.com/news/detail-406637.html

到了这里,关于unity-内存GC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • memory泄露分析方法(native篇)

    #本文介绍native泄露分析方法# Native泄露非常难以治理,因为系统Native内存可共享的,不像JavaHeap内存是私有的 捕捉泄露:测试每天从monkey中筛选出内存超标的app, 从dumpsys_meminfo_pid看 native heap 大,我们采用几种工具可以找到泄露调用栈: 上述工具使用方法网上有详细介绍,

    2024年02月01日
    浏览(52)
  • 记一次Native memory leak排查过程

    路由计算服务是路由系统的核心服务,负责运单路由计划的计算以及实操与计划的匹配。在运维过程中,发现在长期不重启的情况下,有TP99缓慢爬坡的现象。此外,在每周例行调度的试算过程中,能明显看到内存的上涨。以下截图为这两个异常情况的监控。 TP99爬坡 内存爬坡

    2024年02月11日
    浏览(35)
  • Unity webgl 版本崩溃提示Memory access out of bounds 系列问题巨坑

     如上图所示,这真的是个巨坑,只有火狐浏览器可以正常打开,其他浏览器都报上面的错误,百度,翻墙,查找各种办法解决之后无果,只是得出一个结论,有N种原因都可能导致这个问题的出现。 既然不知道问题的原因,那就只能自己测试,在尝试了无数遍资源优化打包测

    2024年02月11日
    浏览(38)
  • [Unity]⭐浅谈Unity内存优化,内存碎片?僵尸内存?以及什么是GC垃圾回收机制。

    目录 🟥 一、什么是内存? 1.物理内存   2.虚拟内存 🟧 二、Unity的内存 1.Unity的内存分类 2.游戏运行时内存占用情况 3.什么是MONO内存? 4.内存碎片、僵尸内存 🟨三、GC 垃圾回收 1.定义 2.一张图清晰得看一下流程~ 3.GC的作用及步骤 4.GC存在的问题及优化策略 🟩 四、内存优

    2024年02月03日
    浏览(38)
  • 【Unity嵌入原生IOS,仅退出Unity应用】

    官方的说法是这样的: 调用此方法可完全卸载 Unity,并在 Unity 退出后接收对 UnityFrameworkListener 的回调。Unity 将释放所有内存。 注意:进行此调用后,您将无法在同一进程中再次运行 Unity。可在 AppController 上设置 quitHandler 以覆盖默认进程终止。 所以官方提供了一个卸载的方

    2024年02月11日
    浏览(36)
  • Unity内存优化技巧

            当涉及到Unity游戏的开发和优化时,内存管理是一个非常重要的方面。合理地管理和优化内存可以显著提高游戏性能并减少资源消耗。在本篇博客中,我们将探讨一些Unity内存优化的技术,并附带代码实现和注释,以帮助你更好地理解这些概念。         在游戏

    2024年02月07日
    浏览(38)
  • unity-内存GC

    Unity内存,原生内存(Native Memory)和托管内存(Managed Memory 其中Native Memory大家接触的会比较少,而且可操控性也比较少,例如AssetBundle,Texture,Audio这些所占的内存,这一部分内存是由Unity自身来进行管理的。我们平时开发通常会接触到的是Managed Memory,也就是我们自己定义的

    2023年04月09日
    浏览(23)
  • Unity内存管理

    物理内存:CPU访问内存是一个慢速过程,我们需要做的是减少Cache miss,就让内存从数据不连续的状况变为内存连续的情况,所以Unity提供了ECS和DOTS。台式设备与移动设备内存架构差异很大,移动设备没有独立显卡,独立显存,显存和数据内存在一个地方,CPU板载面积更小、缓

    2024年02月15日
    浏览(16)
  • Unity UI内存泄漏优化

    项目一运行,占用的内存越来越多,不会释放,导致GC越来越频繁,越来越慢,这些都是为什么呢,今天从UI方面谈起。 首先让我们来聊聊什么是内存泄漏呢? 一般来讲内存泄漏就是指我们的应用向内存申请了一块地址,然后这块地址的相关引用全部丢失了,这块内存无法再

    2024年02月12日
    浏览(34)
  • Unity 性能优化二:内存问题

    目录 策略导致的内存问题 GFX内存 纹理资源 压缩格式 Mipmap 网格资源 Read/Write 顶点数据 骨骼 静态合批 Shader资源 Reserved Memory RenderTexture 动画资源 音频资源  字体资源 粒子系统资源 Mono堆内存 1. Assetbundle 打包的时候,单个资源被重复打包,可以把依赖的资源,单个打包,通过

    2024年02月15日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包