Unity框架与资源打包
对象池
一种通用型的技术,在其他语言中也会用到
- 池
线程池、网络连接池,池是一个思想,将不用的东西暂时用池存起来,等到再次使用的时候再调出来用,节省CPU的调度
- 对象
C#的任何一个类都可以实例化一个对象Object
Unity中的游戏对象GameObject
- 思路
最开始的时候,池中没有对象,需要生成。用完之后放到池中。再次使用的时候再从池中获取
3.1 回收对象
把对象放到池中
3.2 获取对象
从池中获取对象
3.3 代码实现
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool
{
region 单例
// 声明单例
private static ObjectPool Instance;
///
/// 获取单例
///
/// The instance.
/// Res path.
public static ObjectPool GetInstance(string resPath = "")
{
if (Instance == null)
{
if (resPath != "")
Instance = new ObjectPool(resPath);
else
Instance = new ObjectPool();
}
Instance.UpdateResourcePath(resPath);
return Instance;
}
// 构造函数
private ObjectPool()
{
prefabs = new Dictionary();
pools = new Dictionary>();
}
private ObjectPool(string resPath)
{
prefabs = new Dictionary();
pools = new Dictionary>();
resourcePath = resPath;
}
endregion
region 对象预设体资源管理
// 资源加载路径
private string resourcePath;
// 用字典存储所有的预设体
private Dictionary prefabs;
// 更新预设体加载路径
private void UpdateResourcePath(string resPath)
{
resourcePath = resPath;
}
// 获取预设体
private GameObject GetPrefab(string prefabName)
{
// 如果包含预设体,直接返回
if (prefabs.ContainsKey(prefabName))
return prefabs[prefabName];
// 如果不包含预设体,添加新的预设体,并返回
return LoadPrefab(prefabName);
}
// 加载预设体
private GameObject LoadPrefab(string prefabName)
{
// 拼接路径
string path = "";
if (resourcePath != "")
{
path += resourcePath;
}
// 加载预设体
GameObject obj = Resources.Load(path + prefabName);
// 存入字典
if (obj != null)
prefabs.Add(prefabName, obj);
// 返回
return obj;
}
endregion
region 对象池
// 对象池
private Dictionary> pools;
///
/// 回收对象
///
/// Object.
public void RecycleObject(GameObject obj)
{
// 非激活
obj.SetActive(false);
// 获取对象名称
string objName = obj.name.Replace("(Clone)", "");
// 判断有无该类对象池
// 如果没有,实例化一个子池
if (!pools.ContainsKey(objName))
pools.Add(objName, new List());
// 存入
pools[objName].Add(obj);
}
///
/// 获取对象
///
/// The object.
/// Object name.
/// Pool event.
public GameObject SpawnObject(string objName, System.Action poolEvent = null)
{
// 声明一个输出结果
GameObject result = null;
// 如果有池,并且池中有对象
if (pools.ContainsKey(objName) && pools[objName].Count > 0)
{
result = poolsobjName;
pools[objName].Remove(result);
}
// 如果没有池,或者池中没有对象,需要生成
else
{
// 拿到预设体
GameObject prefab = GetPrefab(objName);
if (prefab != null)
result = GameObject.Instantiate(prefab);
}
// 激活
result.SetActive(true);
// 执行事件
if (result && poolEvent != null)
poolEvent(result);
// 返回结果
return result;
}
endregion
}
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Unity游戏后期优化
1.1 开发中的重点问题两个瓶颈 Cpu向Gpu发送指令,每发送一次数据,称为DrawCall(DC)Cpu从硬盘读取,处理高并发与并行计算(I/O)1.2 优化时针对的点MeshMatirial(纹理,shader)以上两条任意一个发生变化,就会重新产生一个DC,所以我们优化的时候主要针对它们 UI优化2.1 搭UI的时候需要注意的问题 2.1.1 UI层级计算NGUI的渲染单位是panel,UGUI的渲染单位是Canvas,每建一个Canvas至少增加一个DC 如果UI下面没有子物体,层级为0用了同一个材质球、纹理的UI,可以同一批送去GPU2.1.2 UI重建已经通过了DC,后期修改了它的位置Canvas将子物体的顶点、mesh和material收集起来,发给GPU 位置尽量不动动态静态分离隐藏的方式setActive = false移走不同的层2.1.3 UI重绘指重复的渲染UI,UI没有深度,有多少层渲染多少,影响GBuffer 2.2 其他问题在内存允许的情况下,对于UI界面进行缓存根据UI界面的使用频率,分层处理UI界面粒子保持在400以下3 内存优化3.1 三块内存C#...
- 下一篇
详解蚂蚁金服 SOFAJRaft | 生产级高性能 Java 实现
SOFAStackScalable Open Financial Architecture Stack 是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。 本文根据SOFA Meetup#1 北京站现场分享整理,完整的分享 PPT 获取方式见文章底部。 前言 SOFAJRaft 是一个基于Raft一致性算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP,适用于高负载低延迟的场景。SOFAJRaft 是从百度的braft移植而来,做了一些优化和改进,感谢百度 braft 团队开源了如此优秀的 C++ Raft 实现。 GitHub 地址:https://github.com/alipay/sofa-jraft 之前,我们有一篇介绍 SOFAJ
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Mario游戏-低调大师作品
- 2048小游戏-低调大师作品
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- 设置Eclipse缩进为4个空格,增强代码规范
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境