当前位置: 首页 > news >正文

司法局网站建设/百度推广怎么优化关键词的质量

司法局网站建设,百度推广怎么优化关键词的质量,深圳网站建设网页推广网站设计,定制家具价格欢迎加入Unity业内qq交流群:956187480 一:对象池的理解 1.核心思想 是创建一个池子,池子里面一开始有预存有一定数量的对象,当你需要使用对象时直接从池子里取就可以,如果池子里面预存的数量不够就通过池子创建新的对…

欢迎加入Unity业内qq交流群:956187480


一:对象池的理解

1.核心思想

是创建一个池子,池子里面一开始有预存有一定数量的对象,当你需要使用对象时直接从池子里取就可以,如果池子里面预存的数量不够就通过池子创建新的对象拿来用。当对象使用结束后不直接删除,而是归还给池子,如果池子里对象总数大于预存数量的话就删掉多余的(灵活处理),保证池子在空闲状态里面只有预存的对象。

2.优化逻辑

对于对象池的优化逻辑其实是见仁见智的,并不是随随便便就拿来用,其实很多时候我们并不需要通过对象池来处理,通过对象池的主要目的是:
防止对象被频繁的创建和删除,从而内存抖动、频繁GC(垃圾回收)对象初始化成本较高

二:对象池的操作

1.预加载

就是预加载一定数量的对象。如果不做预热的,那么第一次创建对象的时候还是直接涉及初始化问题。一个很容易懂道理是玩家宁愿在加载界面多等1秒,也不会愿意在游戏中卡顿0.1秒,所以我觉得如果不做预热的对象池优化只做了一半。

    //初始化对象池,预加载指定对象private void InitPoolObj(){go = Resources.Load("Prefabs/Entity/Cube") as GameObject;for (int i = 0; i < _capacity; i++){var initObj = Instantiate(go);initObj.name = go.name;initObj.transform.SetParent(transform);_objectList.Add(initObj);}foreach (var item in _objectList){item.SetActive(false);}}

2.借用

通俗点讲就是从池中获取物体,如果是第一次获取物体要初始化池。 如果池中没有想要的物体了,则创建一个该对象

    // 在Objects获取指定的GameObject,如果没有则new一个。public GameObject Spawn(string name, bool isDespawnSelf = false){GameObject temp = null;if (_objectList.Count > 0){foreach (var item in _objectList){if (item.name == name){temp = item;_objectList.Remove(item);temp.gameObject.SetActive(true);break;}}}else{temp = Instantiate(go) as GameObject;temp.name = go.name;}if (isDespawnSelf){StartCoroutine(Recovery(temp));}return temp;}

3.归还

物品用完了原本是要删除的,但是应用了对象池之后则是把物体归还到池内,前提是池中数量是不大于预设的最大数量的(防止太多内存炸了),如果池中数量已经大于了预设的最大数量,则直接删除

  //自动回收IEnumerator Recovery(GameObject go){yield return new WaitForSeconds(5);Despawn(go);}// 将用完的GameObject放入dormantObjects中public void Despawn(GameObject go){go.transform.SetParent(transform);go.SetActive(false);_objectList.Add(go);//FIFO 如果dormantObjects大于最大个数则将之前的GameObject都推出来。while (_objectList.Count > _capacity){GameObject temp = _objectList[0];_objectList.RemoveAt(0);Destroy(temp);}}

4.余量归还

上面在归还的时候说如果大于了设定的数量阈值就不返回池中而是直接删除,但实际上删除也有可能会带来时间成本,所以我们可以先不删除,在每次游戏中途的过关之类的加载界面的时候再删除缩小内存池。如果怕在加载界面之前内存爆了的话可以多设置一个必须删除的阈值(此处没有处理)

   //FIFO 如果dormantObjects大于最大个数则将之前的GameObject都推出来。while (_objectList.Count > _capacity){GameObject temp = _objectList[0];_objectList.RemoveAt(0);Destroy(temp);}

5.重置

每个新拿出来的物体应该和新创建的一样是崭新的,不能明显带有上次使用过的状态,因此再每次物体出池的时候要对可能存在后效性的地方重置。在unity中则是在物体的OnEnable()中写物体手动初始化的内容,包括清空刚体的力等等,OnEnable()和Start()的区别就是Start()只在物体第一次启用的第一帧运行,OnEnable会在每次物体重新启用的时候运行。

6.代码


using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PoolManager : BaseManager<PoolManager>
{// 存储动可重用的GameObject。public List<GameObject> _objectList = new List<GameObject>();// 对象池大小private int _capacity = 5;GameObject go;protected override void Awake(){base.Awake();InitPoolObj();}//初始化对象池,预加载指定对象private void InitPoolObj(){go = Resources.Load("Prefabs/Entity/Cube") as GameObject;for (int i = 0; i < _capacity; i++){var initObj = Instantiate(go);initObj.name = go.name;initObj.transform.SetParent(transform);_objectList.Add(initObj);}foreach (var item in _objectList){item.SetActive(false);}}// 在Objects获取指定的GameObject,如果没有则new一个。public GameObject Spawn(string name, bool isDespawnSelf = false){GameObject temp = null;if (_objectList.Count > 0){foreach (var item in _objectList){if (item.name == name){temp = item;_objectList.Remove(item);temp.gameObject.SetActive(true);break;}}}else{temp = Instantiate(go) as GameObject;temp.name = go.name;}if (isDespawnSelf){StartCoroutine(Recovery(temp));}return temp;}//自动回收IEnumerator Recovery(GameObject go){yield return new WaitForSeconds(5);Despawn(go);}// 将用完的GameObject放入dormantObjects中public void Despawn(GameObject go){go.transform.SetParent(transform);go.SetActive(false);_objectList.Add(go);//FIFO 如果dormantObjects大于最大个数则将之前的GameObject都推出来。while (_objectList.Count > _capacity){GameObject temp = _objectList[0];_objectList.RemoveAt(0);Destroy(temp);}}}

7.扩展对象池 有各种各样的扩展此处不展开讨论 


欢迎加入Unity业内qq交流群:956187480

http://www.lbrq.cn/news/833095.html

相关文章:

  • 江苏港口建设费申报网站/学习软件
  • 湖南做网站 联系磐石网络/企业推广是做什么的
  • 网站地图在线生成/seo专业术语
  • 佛山网站建设网络推广/易推广
  • 互联网公司怎么盈利/购买seo关键词排名优化官网
  • 惠州网络营销公司/seo和sem的区别
  • wordpress获取所有标签/seo网站优化外包
  • 网站建设毕业设计选题/seo百度站长工具查询
  • 公司做网站报价/百度站长app
  • 北京网站建设优化学校/网络营销运营推广
  • 网站建设思企互联/百度公司在哪里
  • 连云建网站公司/简述企业网站如何推广
  • 经典wordpress网站/下载百度官方网站
  • 网站布局教程/google app下载
  • 如何将自己做网站放上网/山东seo推广公司
  • 温州微网站开发/网络推广员为什么做不长
  • 做网站选择系统/seo推广一个月见效
  • vuejs做视频网站/大数据营销是什么
  • 微信制作网站公司简介/黑帽seo排名优化
  • 宁波专业网站建设公司/网络培训平台
  • 网站备案 谁接入谁负责/域名购买哪个网站好
  • 个人免费注册公司网站/百度上首页
  • 合肥做网站web0551/相亲网站排名前十名
  • 品牌形象宣传策划方案/湖南关键词优化推荐
  • 嘉兴做网站/湖南靠谱关键词优化
  • gps建站教程视频/德州网站建设优化
  • 天津seo培训哪家好/搜索引擎优化核心
  • 集团网站设计建设/ai智能搜索引擎
  • 烟台做网站排名/企业培训师
  • 湖南星大建设集团有限公司网站/百度手机快速排名点击软件
  • Excel导出实战:从入门到精通 - 构建专业级数据报表的完整指南
  • 在git中同时配置gitcode和github访问权限
  • 【机器人】HOV-SG 开放词汇 | 分层3D场景图 | 语言引导机器人导航
  • 进阶向:智能图像背景移除工具
  • NLP-文本预处理
  • NLP:LSTM和GRU分享