Unity内存详解

本文深入探讨了Unity的内存管理,包括Android内存管理的特点,如内存交换与页大小,以及Unity内存的三层结构。重点讲解了Unity的Native和Managed内存,内存分配方式,以及最佳实践,如减少GameObject数量、音频优化和AssetBundle的使用策略。同时,提到了Unity Managed Memory的GC机制和内存池,以及如何避免僵尸内存。最后,分享了Unity的内存及性能优化工具和解决方案。
摘要由CSDN通过智能技术生成

整理自2019.12.15 Unity UUG北京的演讲 讲师:高川(Unity大中华区企业技术支持经理)

什么是内存

  • 物理内存

    1.CPU访问内存是一个慢速过程
    因此会使用cache来加速访问,大家可以留意CPU的板载示意图,占据最大面积的是Cache模块,如下图
    在这里插入图片描述
    CPU如果在Cache中没有找到数据,称为一次Cache Missing,如果内存数据 指令是不连续的,会导致大量的Cache Missing
    在这里插入图片描述
    2.Unity的ECS和DOTS的目的之一就是提高内存的连续性,减少Cache Missing
    3.台式设备与移动设备的内存架构差异很大
    4.目前很多厂商提出手游端游化,但是需要注意的是,在技术上是不可能的(注:应该可以理解为使用的优化策略不同)
    5.移动设备没有独立显卡以及显存,有的时候,你的内存使用并不大,但还是会内存溢出,例如在Android上,可以看一下有没有OpenGL的out of memory的log,这意味这显存使用太大了
    6.CPU板上面积更小,缓存级数更少,大小也更小,例如一台台式机,L3的大小为8-16M,而移动的CPU,例如骁龙845,只有2M,Cache Missing的概率更大

  • 虚拟内存

    1.内存交换
    移动设备不支持内存交换(注:就是把部分物理内存中的数据保存在硬盘上),谷歌的解释是移动设备和台式设备的IO速度是不一样的,因此移动设备在做内存交换的时候会耗费大量的时间在IO上,并且移动设备的存储介质的可擦写次数和台式设备差距也很大
    2.iOS可以进行内存压缩
    把不活跃的内存压缩起来,放在特定的内存空间中,以节约物理内存,所以在iOS上可以看到有的时候实际使用的内存比物理内存大很多

  • 内存寻址范围

    1.32位CPU和64位CPU
    严格来说,它们的寻址范围是无法确定谁高谁低的,CPU的位数指的是运算位数,不是MCU位数,只是目前大部分是对应的,即32位CPU对应32位的寻址范围,64位CPU对应64位的寻址范围

Android的内存管理

Android的内存大,但是管理不太好

  • 内存的基本单位 Page

    1.默认4K一个page(与linux相同),但并不意味是4K对齐的
    2.回收和分配以page为单位
    3.分为用户态和内核态,常见的一个问题是,用户态中的一个指针越界到内核态,该程序就会挂掉

  • 内存管理工具-low memory killer(AKA lmk)

    一些现象都和它有关,例如闪退 服务消失 手机重启等
    Android内存分为9层,如下图

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值