百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Unity重要框架之对象池框架(unity 面向对象)

ccwgpt 2024-10-07 07:04 33 浏览 0 评论

Unity作为一款强大的游戏引擎,提供了丰富的框架和工具,其中对象池框架是开发中不可或缺的重要组成部分。对象池的概念在游戏开发中被广泛应用,其主要目的是提高性能和优化内存管理。本文将深入探讨Unity中的对象池框架,解释其重要性以及如何有效地使用它。

什么是对象池框架?

对象池是一种用于重复利用游戏对象的机制,而对象池框架则是在Unity中实现和管理这种机制的工具。在游戏中,特别是在需要频繁创建和销毁对象的情况下,使用对象池能够显著减轻垃圾回收的压力,提高游戏的性能。

对象池的工作原理

对象池框架的基本原理是在游戏启动时创建一定数量的对象实例并保存在池中。当需要使用对象时,不再重新创建新的对象,而是从池中取出一个空闲的对象并重置其状态,然后将其投放到场景中。完成使用后,对象并不被销毁,而是被重新放回对象池,等待下次使用。

为什么使用对象池框架?

性能优化: 避免频繁的对象创建和销毁,减少了垃圾回收的频率,提高了游戏的性能。

内存管理: 对象池有效地管理了对象的内存,避免了不必要的内存分配和释放操作。

减少资源消耗: 对象池框架可以降低游戏的资源消耗,使游戏更加流畅。

提高对象复用率: 通过对象池,可以更高效地重用已有的对象,减少了对象的创建成本。


知识前提,单例模式基类BaseSingleton<T>,详情可以看我的这篇

Unity重要框架之单例模式框架

以下是一个基本的代码,演示如何在Unity中实现对象池的基本功能:

using System.Collections.Generic;
using UnityEngine;
public class PoolManager : BaseSingleton<PoolManager>
{
    //对象池,key为对象在资源文件夹的路径,表示这种类的小池子的名字,value为小池子
    private Dictionary<string, List<GameObject>> poolDic=new Dictionary<string, List<GameObject>>();
    /// <summary>
    /// 取出对象
    /// </summary>
    /// <param name="name">需要拿的小池子的名字</param>
    /// <returns></returns>
    public GameObject GetObj(string name)
    {
        GameObject obj = null;
        
        //有小池子 并且小池子有东西
        if (poolDic.ContainsKey(name) && poolDic[name].Count > 0)
        {
            //取出来
            obj = poolDic[name][0];
            poolDic[name].RemoveAt(0);
            obj.SetActive(true);
        }
        else
        {
            //创建一个(这里通过Resources资源加载)
            //可以根据自己的项目更换资源加载方式
            obj = GameObject.Instantiate(Resources.Load<GameObject>(name));
            obj.name = name;//把对象名改成池子名,方便管理
        }
        return obj;
    }
    /// <summary>
    /// 放入对象
    /// </summary>
    /// <param name="name">需要存储的小池子的名字</param>
    /// <param name="obj">存储的对象</param>
    public void PushObj(string name,GameObject obj)
    {
        obj.SetActive(false);
        //如果有这个池子
        if (poolDic.ContainsKey(name))
        {
            poolDic[name].Add(obj);
        }
        else//没有池子
        {
            //加入一个小池子,并初始化小池子个传入的对象
            poolDic.Add(name,new List<GameObject>() { obj });
        }
    }
}


代码功能解释:

poolDic: 一个字典,用于存储多个对象池。每个对象池以资源文件路径(或自定义名字)作为键,对应一个包含多个对象实例的列表。由于我GetObj方法当对象池中没有可用对象时,是从资源文件夹中读取并创建,所以我把key用资源文件路径来定义。

GetObj(string name): 从对象池中获取对象的方法。首先检查指定小池子是否存在并且有可用对象,如果有,则从小池子中取出一个对象并激活,否则创建一个新对象,根据你定义的方法创建,此处为从Resources文件夹读取。

PushObj(string name, GameObject obj): 将对象放回对象池的方法。将对象禁用,并根据小池子名字存入相应的小池子中。如果小池子不存在,则创建一个新的小池子。

代码设计思路:

对象池管理: 使用字典 poolDic 管理多个对象池,每个对象池以资源路径为键,对应一个对象列表。

对象获取:GetObj 方法用于从指定对象池中获取对象。如果对象池存在且有可用对象,则从池中取出,否则创建新对象。

对象放回:PushObj 方法用于将对象放回对象池。将对象禁用后,存入对应的对象池。如果对象池不存在,则创建一个新的对象池。

如何使用对象池框架?

在Unity中,可以通过以下步骤来使用对象池框架:

创建对象池: 在游戏启动时,创建一个对象池并初始化一定数量的对象实例。

从对象池中获取对象: 当需要使用对象时,从对象池中获取一个对象实例。

重置对象状态: 在使用对象前,确保对象的状态已被重置为初始状态。

使用对象: 将对象投放到场景中,完成所需的操作。

将对象放回池中: 在使用完成后,将对象重新放回对象池,等待下次使用。

使用举例:

Resources文件夹

using UnityEngine;
public class Test : MonoBehaviour
{
    private void Start()
    {
        //拿出对象
        GameObject obj= PoolManager.Instance.GetObj("MyTest/Cube");
        //对对象进行操作

        //放回对象
        PoolManager.Instance.PushObj("MyTest/Cube", obj);
    }
}


总结

本示例只是一个基础的对象池框架,还可以继续扩展和修改。对象池框架是Unity中非常重要的一部分,对于提高游戏性能和优化内存管理至关重要。通过合理使用对象池,开发者能够更好地应对游戏中频繁创建和销毁对象的需求,使游戏更加流畅和稳定。希望本文能够帮助你更深入地理解Unity中对象池框架的重要性以及如何有效地应用它。

关注我,一起学更多技术。

相关推荐

自己动手写Android数据库框架_android开发数据库搭建

http://blog.csdn.net/feiduclear_up/article/details/50557590推荐理由关于Android数据库操作,由于每次都要自己写数据库操作,每次还得去...

谷歌开源大模型评测工具LMEval,打通谷歌、OpenAI、Anthropic

智东西编译|金碧辉编辑|程茜智东西5月28日消息,据科技媒体TheDecoder5月26日报道,当天,谷歌正式发布开源大模型评测框架LMEval,支持对GPT-4o、Claude3.7...

工信部:着力推动大模型算法、框架等基础性原创性的技术突破

工信部新闻发言人今日在发布会上表示,下一步,我们将坚持突出重点领域,大力推动制造业数字化转型,推动人工智能创新应用。主要从以下四个方面着力。一是夯实人工智能技术底座。通过科技创新重大项目,着力推动大模...

乒乓反复纠结“框架不稳定”的三个小误区

很多球友由于对框架的认知不清晰,往往会把“框架不稳定”当成一种心理负担,从而影响学球进度,其典型状态就是训练中有模有样,一旦进入实战,就像被捆住了手脚。通过训练和学习,结合“基本功打卡群”球友们交流发...

前AMD、英特尔显卡架构师Raja再战GPU,号称要全面重构堆栈

IT之家8月5日消息,知名GPU架构师拉贾科杜里(RajaKoduri)此前曾先后在AMD和英特尔的显卡部门担任要职。而在今日,由Raja创立的GPU软件与IP初创企...

三种必须掌握的嵌入式开发程序架构

前言在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发。我相...

怪不得别人3秒就知道软考案例怎么做能50+

软考高级统一合格标准必须三科都达到45分,案例分析也一直是考生头疼的一门,但是掌握到得分点,案例能不能50+还不是你们说了算吗?今天就结合架构案例考点,分享实用的备考攻略~一、吃透考点,搭建知识框架从...

UML统一建模常用图有哪些,各自的作用是什么?一篇文章彻底讲透

10万+爆款解析:9大UML图实战案例,小白也能秒懂!为什么需要UML?UML(统一建模语言)是软件开发的“蓝图”,用图形化语言描述系统结构、行为和交互,让复杂需求一目了然。它能:降低沟通成本避...

勒索软件转向云原生架构,直指备份基础设施

勒索软件组织和其他网络犯罪分子正越来越多地将目标对准基于云的备份系统,对久已确立的灾难恢复方法构成了挑战。谷歌安全研究人员在一份关于云安全威胁演变的报告中警告称,随着攻击者不断改进数据窃取、身份泄露和...

ConceptDraw DIAGRAM:释放创意,绘就高效办公新未来

在当今数字化时代,可视化工具已成为提升工作效率和激发创意的关键。ConceptDrawDIAGRAM,作为一款世界顶级的商业绘图软件,凭借其强大的功能和用户友好的界面,正逐渐成为众多专业人士的首选绘...

APP 制作界面设计教程:一步到位_app界面设计模板一套

想让APP界面设计高效落地,无需繁琐流程,掌握“框架搭建—细节填充—体验优化”三步法,即可一步到位完成专业级设计。黄金框架搭建是基础。采用“三三制布局”:将屏幕横向三等分,纵向保留三...

MCP 的工作原理:关键组件_mcp部件

以下是MCP架构的关键组件:MCP主机:像ClaudeDesktop、GitHubCopilot或旅行助手这样的AI智能体,它们希望通过MCP协议访问工具、资源等。MCP主机会...

软件架构_软件架构师工资一般多少

软件架构师自身需要是程序员,并且必须一直坚持做一线程序员。软件架构应该是能力最强的一群程序员,他们通常会在自身承接编程任务的同时,逐渐引导整个团队向一个能够最大化生产力的系统设计方向前进。软件系统的架...

不知不觉将手机字体调大!老花眼是因为“老了吗”?

现在不管是联系、交友,还是购物,都离不开手机。中老年人使用手机的时间也在逐渐加长,刷抖音、看短视频、发朋友圈……看手机的同时,人们也不得不面对“视力危机”——老花眼,习惯眯眼看、凑近看、瞪眼看,不少人...

8000通用汉字学习系列讲座(第046讲)

[表声母字]加(续)[从声汉字]伽茄泇迦枷痂袈笳嘉驾架咖贺瘸(计14字)嘉[正音]标准音读jiā。[辨形]上下结构,十四画。会意形声字,从壴从加,加也表声。注:从壴,字义与鼓乐有关;从加,字义与...

取消回复欢迎 发表评论: