这是我在《Unity游戏优化 (第2版)》看的,记录一下~
内存效率是性能优化的一个重要元素
有啥问题呢?
不必要的内存分配由于过高的垃圾回收(消耗CPU时间)将导致糟糕的用户体验
内存泄漏将导致崩溃
1.Mono平台
Mono是个开源项目,基于API、 规范和微软的.Net Framework的工具构建了自己的类库平台
本质上,是.Net类库的开源重置,在几乎不访问原始源码的情况下完成,和微软的原始类库完全兼容
Mono项目的目标是通过框架提供跨平台开发,也就是说用一种编程语言编写的代码运行在很多不同的硬件平台上
Mono也支持很多不同的编程语言
也就是说:可以编译成.Net的通用中间语言(Common Intermediate Language,CIL)的任何语言都能与Mono平台集成
Unity并不是构建在Mono平台之上的,只是作为一个组成的部分。
Unity底层运行C++处理渲染、动画、资源管理等
Mono的用处大部分是实现玩法逻辑提供高级脚本语言
为啥用高级脚本语言呢?
其通过自动垃圾回收抽象并分离了复杂的内存管理,并提供各种安全管理内存的特性,这些都以牺牲运行时的开销为代价,简化了编程的行为
这样的语言 通常称为:托管语言,其特点是:托管代码
是微软创造的一个术语,指必须在公共语言运行时(Common Language Runtime,CLR)运行的源码,和通过目标操作系统编译与运行的代码不同。
托管的意思是:指依赖于独立运行时环境来执行,且由自动垃圾回收进行监控的代码
其缺点就是运行时消耗通常比本地代码要更大
2.内存域
Unity引擎中的内存空间本质上可以划分为3个不同的内存域,每个域存储不同的数据类型,关注不同的任务集
a.托管域
是Mono平台工作的地方
写的任何MonoBehaviour脚本和自定义的C#类在运行时都会在此域实例化对象
任何C#代码都会很明确与此域交互
内存空间也会自动被垃圾回收管理
b.本地域
Unity有一些底层的本地代码功能,它由C++编写,并根据目标平台编译到不同的应用程序中
这里关心的是内部内存空间的分配,为各种子系统(渲染管线、物理系统、用户输入)分配资源数据(纹理、音频文件、 网格)和内存空间
还包括 GameObject 和 Compoent 等重要游戏对象的部分本地描述,以便和这些内部系统交互
也是大多数内建Unity类(Transofrom等)保存期数据的地方
如果外部像访问这里,会访问 在本地域中的对象描述的包装器
指令会由Unity进入它的本地代码,在那里生成结果,然后复制回托管域
也就是 本地-托管桥
跨越这个桥通常需要内存进行上下文切换,会为游戏带来相当严重的潜在性能问题
c.外部库
比如DirectX和OpgenGL库,还有项目中很多自定义库和插件
在C#代码引用这些类库将导致类似的内存上下文切换和后续成本
网友评论