Unity 的内存优化

Unity中的内存

  • 托管内存:主要是指使用托管堆或者垃圾收集器自动分配和管理的内存,也包括脚本堆栈与虚拟机内存;
  • C#非托管内存:可以在C#下与Unity Colloection名字空间和包结合使用,不使用垃圾收集器管理的内存部分;
  • Native内存:Unity用于运行引擎的C++内存;

Unity内存查看工具

  • Unity Profiler
  • Memory Profiler(Unity 2021+)

Unity的Native内存分配

Unity底层是C++实现的,一般来说,游戏引擎都不会直接通过melloc或new来直接分配内存,而是至少在其之上封装一层来做内存管理、统计与检查等工作;

Unity中C++层会根据用途不同,抽象成不同的Allocator来进行内存分配,通过不同的Memory label标签与Owner ship的设置进行标记与追踪,通过Memory manager进行统一的管理;

Allocator的分类

按用途分类

  • Main Allocators:绝大多数内存使用的分配器
  • Fast Per Thread Temporary Allocators:线程使用的临时分配器,比如各个线程的栈分配器
  • Fast Thread Shared Temporary Allocators:线程间内存共享的临时分配器
  • Profiler Allocators

这些都是用途抽象出来的分配器,在Unity引擎代码中并没有对应的分配器的类;

在Unity代码中是根据分配算法分类的分配器;

按底层类型分类

  • Unity Default Allocator
  • Bucket Allocator
  • Dynamic Heap Allocator
  • Dual Thread Allocator
  • TLS Allocator(Thread Local Storage)
  • Stack Allocator
  • Thread Safe Linar Allocator

与按类型分类的分配器是一对多的关系,也就是按类型分配的分配器底层都是按算法分类的分配器实现的;

主要的底层分配器

BucketAllocator桶分配器

DynamicHeapAllocator动态堆分配器

DualThreadAllocator

TLS Stack Allocator

Thread Safe Linear Allocator

主线程分配回退流程

工作线程分配回退流程

托管内存优化

  • Boxing Allocation装箱操作
  • String字符串拼接
  • 闭包分配
  • 避免使用Linq库
  • Unity中有NonAlloc的方法使用NonAlloc方法
  • Unity.Object.FindObjectsOfType、UnityEngine.Component.GetComponentsInParent等返回对象列表的方法都有堆内存分配
  • 成员变量访问形式改用方法而不是点变量,如UnityEngine.Mesh.vertices => UnityEngine.Mesh.GetVertices
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇