一、定义:
关于U3D内存优化,一直是令游戏开发者头疼的问题,因为我们会在项目中频繁创建和销毁一些对象,比如:怪物模型或者UI预设,但是有些对象会在游戏中频繁出现,例如对于战斗中的小怪物来说,如果每次使用时都创建新的物体,然后使用完后直接销毁,那么游戏的内存消耗将是巨大的。
想象一下,如果我们可以做一个池,创建后将一些常用的对象放入池中,每次使用时直接从池中查找获取,从而提高对象利用率,减少重复创建对象时的内存消耗。 ,这对于提高性能有很大的帮助,这样的池就是我们所说的——对象池。
对象池——就是将对象存储在池中,并在需要时重用它们,而不是每次都实例化一个新对象。
其次,使用对象池有几点需要注意:
1、对象池虽然可以优化对象利用率,但是对象池不能无限期地存储对象,因此内存占用也会急剧增加。 应限制池的上限,通过统计获取并淘汰使用频率较低的对象,从而动态收缩对象池;
2、对于可复用的对象,对象重置(reset)操作应该在对象池中处理;
3、如果同时在多个线程中访问统一对象池,就必须处理线程安全的问题。
3. 练习:
关于对象池的内存优化,可以参考内存池的设计模式:内存池设计与实现
具体如何设计对象池,我们可以从成熟的插件中获取,例如:
、具体使用方法:研究所对插件的初步探索(七十四)
当然,我们也可以设计自己的对象池框架:内存管理——对象池(Pool)
具体步骤:
1、将.导入到项目中;
2、在 中新建一个 Empty 对象,选中该 Empty 对象,然后在菜单栏选择 —>Path-o —>Pool —>Spawn Pool:
3、完成上述步骤后,Empty对象下就会绑定一个Spawn Pool组件,接下来我们需要设置基本信息:
同一个对象池可以存储不同的预设,我们可以为每个预设创建一个类型列,同一预设创建的对象属于同一列。
4、Spawn中各属性的作用:
:缓存池的唯一名称。
:勾选后,实例化的游戏对象的缩放比例将全部为1,如果不勾选,则使用默认比例。
Layer:勾选后实例化的游戏对象的图层将使用默认图层。
不要这样做:检查后实例化的对象将没有父节点,并且它们都将位于顶层。 建议不要检查。
不要加载:我不需要解释这一点,不是吗? 切换场景不释放。
Log :是否打印日志信息
Pre-Pool:缓存池列表,表示可以将各种类型放入缓存列表中。右侧有一个“ ”按钮,点击即可添加各个类型
:直接拖入工程即可。
:该缓存池的预加载数量。 意思是一开始加载的数量!
:如果选中,所有缓存池数据都可以“异步”加载。
:每隔几帧加载一个。
:延迟加载多长时间。
:是否开启对象实例化的限制功能。
limit :限制实例化数量,即限制缓冲池数量。 与上面的内容是冲突的。 如果同时启用,则以该功能为准。
:如果我们将缓冲池限制为只有10个,如果你不检查它,那么当你得到第11个时,你将返回null。 如果你勾选它,当你取第11个时,它会返回前10个中最不常用的一个。
:是否开启缓存池智能自动清理模式。
cull 上图:缓存池自动清理,但有几个对象始终不被清理。
cull Delay:多久执行一次自动清理,以秒为单位。从上次清理开始计数
:每次自动清理几个游戏对象。
自动清理:当池中的对象(false)当前没有被使用时,这些对象会根据上面的参数自动清理,清理是()away。
真假是由 Spawn 和方法决定的!
是否启用(勾选)的区别:
未启用:如果此时为1,如果用户希望每5秒在缓冲池中生成一个对象,那么当第二个对象被加载时,缓冲池将创建另一个对象。 如果程序再次spawn,那么就会再次生成一个这样的对象,并且一直这样生成,少数几个对象在Spawn之后还会生成几次!
(粒子系统:循环时:Spawn多次,会生成几个物体。不循环时(循环结束状态为false):会生成另一个物体。如果此时的Spawn速度很快,而之前的则无法生成如果检测到对象状态为 false,则可能会生成多个对象,直到检测到前面的对象状态为 false,则对象的生成到此结束,程序在这些对象之间来回生成!)
打开:
此时Limit为1
检查:那么程序将一直使用预加载的对象,而不会生成其他对象! 第二次加载时,即使第一个对象处于真实状态,也使用它,即操作第一个对象! (粒子系统是否有循环时,效果与此相同)
取消勾选:那么程序将一直使用预加载的对象,而不会生成其他对象! 第二次加载时,必须等第一个对象变成false后才能使用! 如果5s后,第一个对象还没有变成false,那么程序就会报错! (粒子系统是一个循环:会循环下去,只有一个预加载对象,不报错,不循环时:只有前一次变成false后才能进行第二次。只有一个预加载对象,并且没有报错!)
如果限制数量大于1,则为10
检查:始终只会生成 10 个对象。 加载第11个对象时,如果前十个对象没有一个为false,程序会选择不常用的,以免报错!
不勾选:永远只会生成10个对象,但是加载第11个对象时,如果前十个对象没有一个为假,程序就会报错!
(粒子系统,始终只有10个物体,不报错!)
5、设置好以上参数后,我们开始在代码中向对象池中添加对象以及从对象池中移除对象:
A。 获取对象池:
;
= .Pools[""];
b. 获取对象池中对象的方法:
= .[""];
= .Spawn();
C。 销毁对象池中对象的方法:
.();
d. 全部销毁的方法:
.();