推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

Unity3D 内存优化(一)对象池

   2023-08-27 网络整理佚名2220
核心提示:对象池——就是将对象存储在一个池子中,当需要时再次使用,而不是每次都实例化一个新的对象。关于对象池的内存优化,我们可以参考内存池的设计模式:内存池设计与实现具体如何设计对象池,我们可以通过从获取成熟的插件,例如::缓存池这个的预加载数量。:如果勾选表示缓存池所有的可以“异步”加载。Above:缓存池自动清理,但是始终保留几个对象不清理。

一、定义:

关于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. 全部销毁的方法:

.();

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON