Unity中解决Instantiate实例化物体卡顿问题

一:前言

当在执行多次Instantiate实例化物体时,会卡顿严重甚至在移动端会导致程序崩溃
因为Instantiate会产生大量的GC,使CPU过高,导致崩溃

下面是一段测试代码:当我们按下按键时实例化100000个预制体

using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject prefab;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            Generate();
        }
    }

    private void Generate()
    {
        for (int i = 0; i < 100000; i++)
        {
            Instantiate(prefab);
        }
    }
}

运行后通过profiler查看性能

发现在实例化物体的那一帧产生了3.8MB的GC,而正常来说每帧的GC不能超过2KB,产生如此高的GC在移动端会导致内存溢出从而崩溃闪退。更可怕的是这一帧用时

### Unity 中的物体生成方法(实例化) 在 Unity 中,物体的生成主要通过 `Instantiate` 方法实现。该方法可以将预制体(Prefab)或场景中的已有对象复制一份,并在运行时动态添加到场景中。这种机制广泛应用于游戏开发中的道具生成、敌人刷新、UI 动态创建等场景。 #### 基本用法 最简单的使用方式是直接传入一个 GameObject 实例作为模板,并指定位置和旋转: ```csharp GameObject newObject = Instantiate(prefab, position, rotation); ``` 其中: - `prefab` 是要实例化的预制体; - `position` 是新生成物体的世界坐标; - `rotation` 是其旋转角度。 若希望将新生成的物体挂载到某个父物体下,可以通过设置其 `transform.parent` 属性来实现: ```csharp newObject.transform.SetParent(parentTransform); ``` 此方式可确保新生成的物体成为指定父物体的子级[^1]。 #### 与 Transform 结合使用 Unity 提供了更简洁的方式,允许在调用 `Instantiate` 的同时直接指定父级变换: ```csharp Instantiate(prefab, parentTransform, false); ``` 其中第三个参数表示是否将位置重置为父物体的本地坐标系原点。设为 `false` 可保留世界坐标位置[^2]。 #### 性能注意事项 尽管 `Instantiate` 是一种非常方便的对象生成方式,但在大量连续调用时可能会导致性能问题。例如一次性实例化数万个对象时,主线程会被阻塞,造成帧率下降甚至卡顿现象[^3]。 为了避免这种情况,可以采用以下策略: - **对象池(Object Pooling)**:预先创建一定数量的对象并缓存,按需激活/禁用,避免频繁调用 `Instantiate` 和 `Destroy`。 - **异步加载与协程结合**:通过协程分批生成物体,减少单帧负载。 - **资源异步加载**:如果预制体较大或依赖外部资源,建议使用 `Addressables` 或 `Resources.LoadAsync` 配合协程进行异步加载。 #### 示例代码 以下是一个完整的示例脚本,演示如何在按下按键时生成物体并将其作为指定父物体的子物体: ```csharp using UnityEngine; public class ObjectSpawner : MonoBehaviour { public GameObject prefab; // 要实例化的预制体 public Transform parentTransform; // 父物体 void Update() { if (Input.GetKeyDown(KeyCode.Space)) { SpawnObject(); } } void SpawnObject() { GameObject newInstance = Instantiate(prefab, Vector3.zero, Quaternion.identity, parentTransform); newInstance.name = "Spawned_Object"; } } ``` 此脚本可在任意游戏物体上挂载,通过设置 `prefab` 和 `parentTransform` 字段即可控制生成逻辑[^1]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello Bug.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值