游戏人生
About Me
  • 你好
  • Math
    • Number
      • Float IEEE754对确定性的影响
      • Pairing Function及其用途
    • Vector and Matrix
      • TRS基础概念
      • LossyScale深入分析
    • Quatenion
      • FromToRotation实现细节
    • Lerp and Curve
      • Slerp球形插值
      • Bezier Curve为什么重要
      • Interpolation和Extrapolation实现细节
  • Programming
    • C#
      • 学习资料
      • C# struct灵魂拷问
      • CIL的世界:call和callvirt
      • .NET装箱拆箱机制
      • .NET垃圾回收机制
    • Go
      • 基础特性
      • 如何正确的判空interface
      • 如何用interface模拟多态
      • 如何定制json序列化
      • 如何安全在循环中删除元素
      • 如何安全关闭channel
      • 如何集成c++库(cgo+swig)
      • 如何性能测试(benchmark, pprof)
    • Lua
      • 基础特性
  • General Game Development
    • Game Engine
      • 学习资料
      • 关于游戏引擎的认知
    • Networking
      • 帧同步
      • 状态同步
      • 物理同步
    • Physics
      • PhysX基本概念
      • PhysX增加Scale支持
      • PhysX场景查询
      • PhysX碰撞检测
      • PhysX刚体动力学
      • PhysX角色控制器
      • PhysX接入项目工程
      • 物理同步
      • 物理破坏
    • Design Pattern
      • 常用设计模式
      • MVP 架构模式
      • ECS 架构模式
  • Unity
    • Runtime
      • Unity拥抱CoreCLR
      • 浅析Mono内存管理
    • UGUI
      • 浅析UGUI渲染机制
      • 浅析UGUI文本优化
      • 介绍若干UGUI实用技巧
    • Resource Management
      • 浅析Unity堆内存的分类和管理方式
      • 深入Unity资源
      • 深入Unity序列化
      • 深入Assetbundle机制
    • Async
      • 深入Unity协程
      • 介绍若干Unity协程实用技巧
      • 异步动作队列
    • Hot Reload
      • Unity+Xlua
      • Xlua Examples学习(一)
      • Xlua Examples学习(二)
    • Editor Extension
    • Performance
      • 浅析Unity Profiler
      • 介绍一个Overdraw分析工具
  • Platform
    • WebGL
  • Real-world Project
    • Souce Engine
    • DOOM3 BFG
Powered by GitBook
On this page
  1. Unity
  2. Resource Management

浅析Unity堆内存的分类和管理方式

引言

对于Unity游戏,堆内存占用大致分为三块:Native堆(Unity资源)、Native Dll(第三方DLL库) 和Mono堆(c#资源)。具体来说:

  • Native (internal)

    • AssetData: Textures,AudioClips,Meshes

    • Game Objects & Components: Transforms, etc

    • Engine Internals: Managers,Rendering,Physics,etc

  • Mono (managed)

    • scripts' object (reference type)

    • Unity Wrappers objects

  • Native Dll

    • 3rd library Dlls

堆的内存管理方式为:

  • Mono堆通过对应版本的 Mono GC 进行内存管理;

  • Native堆由Unity提供了一些API以及某种自动内存管理。

关于mono和GC的讨论见下一章节,本节讨论的是Native堆上的内存管理。


注: 上文中的Unity Wrappers objects就是unity暴露给c#的一些类,大都继承自Object类,比如GameObject、AudioClip、Transform等。可以这样理解:Unity.Object数据是比较庞大的,像一座冰山,大部分保存在native堆中,而露出到c#的部分可以通过轻量级的wrapper对象来访问。如下图:

代码示例:

GameObject wrapperObj = new GameObject();

上面这行代码在mono里创建了一个GameObject的wrapper对象(占用mono内存不方便测量),同时也在native里创建了GameObject的数据实体(占用native内存256B左右),unity还会自动为其添加一个Tranform组件(占用native内存272B)。也就是在上图中创建了一个“红色球体”。

这些wrapper对象通过mono堆的GC管理。但要注意的是:将wrapperObj被置为null之后虽然不久会被GC,但其对应的Native资源却不会得到释放,除非在场景里和代码中没有任何引用时再手动调用Resources.UnloadUnusedAssets()才会释放Native资源,或场景切换后自动调用这个API。

另外,unity提供了API或实现了 IDisposable 接口来通过这些wrapper对象来主动释放Native资源。

  • API的例子:Destroy(wrapperObj), DestroyImmediate(wrapperObj)。

  • IDisposable的例子具体见后文关于c#资源的讨论。

PreviousResource ManagementNext深入Unity资源

Last updated 2 years ago