初识对象池

对象池一般应用于一些需要重复使用的物体,比如子弹、陨石,如果直接销毁会产生大量的碎片占用内存空间,最好的方式就是循环利用这些物体,可以创建一个空物体当做对象池,当要使用而没有时就会在对象池里创建一个新的对象,有就直接从对象池里调用,当不需要使用物体时就将物体放回对象池,这里涉及到了一个队列的应用,调用时出队,不用时入队;

public static ObjectPool instance;
    static Queue<GameObject> Pool = new Queue<GameObject>();
    public GameObject bullet;
    GameObject obj;
    public Transform parent;
    void Start () {
        instance = this;
    }
    private void Update()
    {
        Debug.Log("123456");
        if (Input.GetButtonDown("Fire1"))
        {
            StartCoroutine(BulletLife());
        }
    }
    IEnumerator BulletLife()
    {
        obj = Creat(bullet, Vector3.zero, Quaternion.identity);
        obj.GetComponent<Rigidbody>().AddForce(obj.transform.forward * 100);
        yield return new WaitForSeconds(2);
        Delete(obj, parent.position, Quaternion.identity);
    }
    //创建游戏物体-----预制体,出生点,旋转,父物体
    public GameObject Creat(GameObject _prefabs,Vector3 _pos,Quaternion qua)
    {
        GameObject g = null;
        if (Pool.Count>0)
        {
            g = Pool.Dequeue();
            g.SetActive(true);
            g.transform.position = _pos;
        }
        else
        {
            g = Instantiate(_prefabs, _pos, qua);g.transform.SetParent(GameObject.FindGameObjectWithTag("Bullet").transform);
        }
        return g;
    }

    //游戏物体删除-----预制体,回到出生点位置,旋转
    public static void Delete(GameObject _object,Vector3 _resoucesPos,Quaternion qua)
    {
        _object.SetActive(false);
        _object.transform.position = _resoucesPos;
        _object.transform.localRotation = qua;

        Pool.Enqueue(_object);
    }

### 对象加载过程概述 在Java中,对象的创建和加载是一个复杂的流程,涉及多个阶段的操作。以下是关于Java对象加载的主要环节: #### 1. 类加载 类加载是对象实例化之前的关键步骤之一。当程序首次访问某个类时,Java虚拟机会通过类加载器将其加载到内存中[^3]。这一过程可以分为以下几个子阶段: - **加载**:找到并读取类的二进制数据(通常是从`.class`文件),并将这些数据转换成方法区中的运行时表示形式。 - **验证**:确保被加载的类具有正确的内部结构,并且不会危害虚拟机的安全性。 - **准备**:为该类分配静态字段所需的存储空间,并设置默认初始值。 - **解析**:将常量池内的符号引用替换为直接引用。 - **初始化**:执行类构造器 `<clinit>()` 方法来完成静态变量赋值和其他必要的操作。 #### 2. 内存分配 一旦类成功加载至JVM的方法区内存区域之后,便进入堆内存分配给新创建的对象实例。此部分由垃圾回收机制管理,具体取决于所采用的GC算法及其配置策略。 #### 3. 实例初始化 这是最后一个正式确立一个完全可用的新对象状态的重要时刻。它包括两方面工作: - 执行父类无参构造函数; - 运行当前定义好的构造方法体代码片段以赋予成员属性特定初识数值或者调用其他业务逻辑功能。 ```java public class Example { private int value; public Example(int initialValue){ this.value = initialValue; // 初始化实例变量 } } // 创建Example对象示例 Example obj = new Example(42); ``` 上述例子展示了如何显式地传递参数并通过自定义构造器来进行实例初始化[^1]。 #### 4. 引用赋值 最后一步就是把刚刚建立起来的那个独一无二实体地址指针保存下来供后续使用——即让局部变量、数组元素或者其他地方持有对该实际存在的映射关系表示法。 --- ### 总结 整个过程中涉及到许多细节处理和技术要点,比如线程同步考虑因素等等都会影响最终表现效果。因此深入了解每一步骤背后原理对于成为一名优秀的软件工程师至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值