Unity中Instantiate实例化物体卡顿问题的解决
#代码知识 发布时间: 2026-01-12
本文实例为大家分享了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在移动端会导致内存溢出从而崩溃闪退。更可怕的是这一帧用时1519.24毫秒也就是1.5秒所以程序在此帧会出现卡顿现象
二、解决方法
卡顿或程序崩溃的原因就是在某一帧中产生了大量的GC
所以可以把一帧的操作分帧进行
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour
{
public GameObject prefab;
private void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
StartCoroutine(Generate());
}
}
private IEnumerator Generate()
{
int tempCount = 0;
for (int i = 0; i < 100000; i++)
{
if (tempCount <= 5000)
{
Instantiate(prefab);
tempCount++;
}
else
{
tempCount = 0;
yield return new WaitForEndOfFrame();
Instantiate(prefab);
}
}
}
}
三、协程中几种yield reutrn的执行顺序
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour
{
private void Start()
{
StartCoroutine(WaitForNull());
StartCoroutine(WaitForEndFrame());
StartCoroutine(Wait0());
StartCoroutine(WaitForFixedUpdate());
}
private IEnumerator WaitForNull()
{
Debug.Log("[1]WaitForNull:" + Time.frameCount);
yield return null;
Debug.Log("[2]WaitForNull:" + Time.frameCount);
}
private IEnumerator WaitForEndFrame()
{
Debug.Log("[1]WaitForEndFrame:" + Time.frameCount);
yield return new WaitForEndOfFrame();
Debug.Log("[2]WaitForEndFrame:" + Time.frameCount);
}
private IEnumerator Wait0()
{
Debug.Log("[1]Wait0:" + Time.frameCount);
yield return 0;
Debug.Log("[2]Wait0:" + Time.frameCount);
}
private IEnumerator WaitForFixedUpdate()
{
Debug.Log("[1]WaitForFixedUpdate:" + Time.frameCount);
yield return new WaitForFixedUpdate();
Debug.Log("[2]WaitForFixedUpdate:" + Time.frameCount);
}
private void Update()
{
Debug.Log("update");
}
private void FixedUpdate()
{
Debug.Log("FixedUpdate");
}
private void LateUpdate()
{
Debug.Log("LateUpdate");
}
}
经过测试,得出以下结论
- WaitForFixedUpdate在一帧的FixedUpdate后Update前调用
- WaitForNull和Wait0在一帧的Update后LateUpdate前调用
- WaitForEndFrame在会在一帧的LateUpdate后调用
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
代码知识SEO上一篇 : ant design vue中表格指定格式渲染方式
下一篇 : C#操作excel打印的示例
-
SEO外包最佳选择国内专业的白帽SEO机构,熟知搜索算法,各行业企业站优化策略!
SEO公司
-
可定制SEO优化套餐基于整站优化与品牌搜索展现,定制个性化营销推广方案!
SEO套餐
-
SEO入门教程多年积累SEO实战案例,从新手到专家,从入门到精通,海量的SEO学习资料!
SEO教程
-
SEO项目资源高质量SEO项目资源,稀缺性外链,优质文案代写,老域名提权,云主机相关配置折扣!
SEO资源
-
SEO快速建站快速搭建符合搜索引擎友好的企业网站,协助备案,域名选择,服务器配置等相关服务!
SEO建站
-
快速搜索引擎优化建议没有任何SEO机构,可以承诺搜索引擎排名的具体位置,如果有,那么请您多注意!专业的SEO机构,一般情况下只能确保目标关键词进入到首页或者前几页,如果您有相关问题,欢迎咨询!