Unity GC 优化要点
参考:http://blog.csdn.net/znybn1/article/details/76464896
为啥要点?因为讲的重点。
游戏运行时来存储数据,当这些数据不再被使用时,存储这些数据的内存被释放以便于以后这些内存被复用。
目的?
介绍GC如何工作,在什么情况下触发GC和如何高效的使用内存以减少GC对游戏的影响。
了解 ?
垃圾(Garbage)是存储这些无用数据的内存的术语,
GC(Garbage Collection 垃圾回收)是使这些内存可以再次使用的过程。
GC 引起的问题?
性能问题表现为帧率过低,帧率剧烈波动或间歇性卡顿。
Unity内存管理简介?
Unity可以访问两个内存池,栈和堆(托管堆)。栈用于短期存储小块数据,堆用于长期存储和较大数据块。
栈用于短期存储小块数据,堆用于长期存储和较大数据块。
当变量超出作用域,该内存不再被使用并可以归还给原来的内存池。当内存被归还给原有的内存池里,我们
称该内存被释放。栈内存在变量超出作用域时被实时释放,而堆内存在变量超出作用域之后并没有被释放并保持被分配的状态。
无用的堆只在执行GC时才被释放。!!!超重要!!!
GC 识别和释放未使用的堆内存。GC定期运行以清理堆。
栈分配和释放发生什么?
栈分配和释放简单快速。这是因为栈只用于在短时间内存储小数据。分配和释放总是以可预测的顺序发生,
并具有可预测的大小。
栈的工作方式类似于栈数据类型:这是一个简单的元素集合,这种情况下的内存块,只能以严格的顺序添加和删除元素。这种简单性和
严格性使得它变得非常快速。
堆分配时发生什么?
堆分配比栈分配复杂额多。因为堆可以用来存储长期和短期数据及各种不同类型大小的数据。分配和释放并不总是按可预测的顺序
进行且可能需要大小差距巨大的内存块。
首先,Unity检查堆上是否有足够的空间内存,如果有,则该变量的内存被分配。
如果没有,Unity触发GC试图释放未使用的堆内存,这个操作可能很慢。如果GC之后堆内存足够,则该变量的内存被分配。
如果GC之后堆上还是没有足够的空闲内存,Unity将向操作系统申请更多内存以扩大堆大小。这个操作可能很慢。
堆分配可能会很慢,特别在必须执行GC和扩大堆大小时。
(我们减少GC,其实就是降低扩大堆的次数)
GC是个费时的操作,堆上的对象越多,代码中的引用数越多,GC越费时。
GC时,发生的步骤?
当堆变量超出作用域后,存储该变量的内存并没有被立即释放。无用的堆内存只在执行GC时被释放。
每次执行GC时,将执行以下步骤。
a.垃圾收集器检索堆上的每个对象、
b.垃圾收集器搜索所有当前对象引用以确定堆上的对象是否仍在作用域内
c.不在作用域内的对象呗标记为删除
d.删除被标记的对象并将内存返回给堆。
GC是个费时的操作,堆上的对象越多,代码中引用越多,GC越费时。
何时触发GC?
堆分配时堆上的可用内存不足时触发GC。
GC会自动运行。(频率因平台而异)
手动强制调用GC。
GC 的问题?
如果堆上有很多对象和大量的对象引用要检查,则检查所有这些对象的过程可能很慢。这可能导致游戏卡顿或缓慢运行。
另一个问题是GC在不合时宜的场合被触发。
堆碎片:当从堆中分配内存时,会根据必须存储的数据大小从不同大小的块中的可用空间中获取内存。
当这些内存返回到堆时,堆可能分成很多由分配快分隔的小空闲kuai.这意味着虽然可用内存总量很高。但是由于
碎片化严重而无法分配一块连续的大内存。这意味着GC被触发或不得不扩大堆大小。
(游戏内存大小会高于实际所需要的大小,GC会被频繁的触发)
如果减少堆分配的垃圾?
a.缓存技术
如果我们的代码重复调用产生堆分配的函数,然后丢弃结果,这将产生不必要的垃圾。对此,我们应该存储对这些对象的引用并
复用他们。
Unity GC 优化要点的更多相关文章
- Unity下XLua方案的各值类型GC优化深度剖析
转自:http://gad.qq.com/article/detail/25645 前言 Unity下的C#GC Alloc(下面简称gc)是个大问题,而嵌入一个动态类型的Lua后,它们之间的交互很容 ...
- Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践
protobuf-net优化效果图 protobuf-net是Unity3D游戏开发中被广泛使用的Google Protocol Buffer库的c#版本,之所以c#版本被广泛使用,是因为c++版本的 ...
- Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译
本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...
- Unity全面优化
前言 Unity的项目优化已经是老生常谈,很多人在项目完成之后,即便创意新颖,也会觉得差强人意,原因就在于没有做详细的项目优化.众所周知,Unity是一个综合性的3D开发引擎,其中包含图像渲染,逻辑处 ...
- Unity 性能优化(力荐)
开始之前先分享几款性能优化的插件: 1.SimpleLOD : 除了同样拥有Mesh Baker所具有的Mesh合并.Atlas烘焙等功能,它还能提供Mesh的简化,并对动态蒙皮网格进行了很好的支持. ...
- Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译
本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- Unity性能优化(1)-官方教程The Profiler window翻译
本文是Unity官方教程,性能优化系列的第一篇<The Profiler window>的简单翻译. 相关文章: Unity性能优化(1)-官方教程The Profiler window翻 ...
- Unity内存优化(贴图层面)
聊聊近况: 距离上一篇文章已经过了好久,主要原因是我懒了.公司项目也到了开始优化的阶段,上网找的资料,看过了就忘.还是想把它整理一下,写出来.其实我说的东西,网上都有,我只是搬运工而已. 贴图压缩: ...
随机推荐
- java位移运算符2 转
https://blog.csdn.net/xxx134617/article/details/7454774 java中int类型占4个字节,二进制用补码表示: 3的二进制表示: 00000000 ...
- 生产环境,vue页面跳转的时候,js报404的问题
最近上线的一个vue项目,需要各种路由跳转,在开发和测试环境都没问题,但是在生产环境,发现后期更新代码的时候,有些机型(ios机型,暂未发现android有问题)跳转路由的时候,标题修改了,但是内容并 ...
- 教你如何用勾勾街快速生成一个苹果IOS APP
现在苹果手机上的各种各样的APP,想不想也有一款属于自己的专属APP?很简单,用勾勾街可以在3分钟内快速制作一款,快来看看! 工具平台: 勾勾街 (www.gogojie.com ) 操作方法: 1. ...
- Y1吐槽002 情绪
看了石原里美的<高岭之花>,虽然全程基本都是看不懂的,但是风间直人对喜怒哀乐里面的怒和哀的分析还是深有感触. 悲哀的人心里有爱 愤怒的人心里有恨,一个人装了太多的恨的话,别人是拯救不了的: ...
- Spring系列__01HelloWorld
Spring作为一款成熟的Java框架,其优点和意义不用我多说,可以参考:https://m.w3cschool.cn/wkspring/pesy1icl.html 今天开始写一下Spring家族的总 ...
- 将普通用户添加到sudo
将普通用户添加到sudo组 可以编辑/etc/sudoers文件将普通用户加入sudo组.要注意的是修改该文件只能使用visudo命令:1.首先切换到root #su - (注意有 “-” ,这和su ...
- SSM 框架搭建
SSM框架搭建(Spring.SpringMVC.Mybatis) 一:基本概念 Spring : Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框 ...
- 用Java写hello world
public class HelloWorld{ public static void main(String[] args){ System.out.println("hello worl ...
- codeforces 13 D
给你500个红点和蓝点,让你找多少点红点构成的三角形里没有蓝点. 巧妙啊!我们考虑一个很远位置的点,不妨设这个为O,然后n^2枚举红点,考虑Oij里面蓝点的个数, 然后 对于 ijk这个三角形,我们可 ...
- 手动安装composer详细教学
1.下载compser.phar 地址 https://getcomposer.org/download/ 2.新建composer.bat 文件,写入“@php "%~dp0compose ...