zoukankan      html  css  js  c++  java
  • Unity中对象池的使用

    unity中用到大量重复的物体,例如发射的子弹,可以引入对象池来管理,优化内存。

    对象池使用的基本思路是:

    将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用。恰当地使用对象池,可以在一定程度上减少频繁创建对象所造成的开销。

    并非所有对象都适合拿来池化――因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况。

    代码如下所示:

     1 using UnityEngine;
     2 using System.Collections;
     3 using System.Collections.Generic;
     4 
     5 public class GameObjectPool : MonoBehaviour {
     6     //单例模式
     7     private static GameObjectPool instance;
     8 
     9     public static GameObjectPool Instance
    10     {
    11         get { return GameObjectPool.instance; }
    12         set { GameObjectPool.instance = value; }
    13     }
    14 
    15     private static Dictionary<string, ArrayList> pool = new Dictionary<string, ArrayList>{ };
    16     // Use this for initialization
    17     void Start ()
    18     {
    19         Instance = this;
    20     }
    21     public static Object Get(string prefabName, Vector3 position, Quaternion rotation)
    22     {
    23         string key = prefabName + "(Clone)";
    24         Object o;
    25        //池中存在,则从池中取出
    26         if (pool.ContainsKey(key) && pool[key].Count>0)
    27         {
    28             ArrayList list=pool[key];
    29             o=list[0] as Object;
    30             list.Remove(o);
    31             //重新初始化相关状态
    32             (o as GameObject).SetActive(true);
    33             (o as GameObject).transform.position = position;
    34             (o as GameObject).transform.rotation = rotation;
    35         }
    36         //池中没有则实例化gameobejct
    37         else
    38         {
    39             o = Instantiate(Resources.Load(prefabName),position,rotation);
    40         }
    41           return o;
    42     }
    43     
    44 
    45     public static Object Return(GameObject o)
    46     {
    47         string key = o.name;
    48         if (pool.ContainsKey(key))
    49         {
    50             ArrayList list=pool[key];
    51             list.Add(o);
    52         }
    53         else
    54         {
    55             pool[key] = new ArrayList(){ o};
    56         }
    57         o.SetActive(false);
    58         return o;
    59     }
    60 }
  • 相关阅读:
    svn: E120106: ra_serf: The server sent a truncated HTTP response body.
    HTTP method POST is not supported by this URL解决
    TinyOS文件结构清单解析
    Crush Course 神话学笔记
    Django 入门
    Crush Course 心理学笔记
    网络相关知识汇总链接
    9.21 小程序开发培训讲座
    论文简读之LAIA
    Android studio 的那些坑
  • 原文地址:https://www.cnblogs.com/AaronBlogs/p/6878152.html
Copyright © 2011-2022 走看看