欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Unity中Instantiate實(shí)例化物體卡頓問題的解決

 更新時(shí)間:2020年10月28日 17:05:05   作者:LLLLL__  
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)離線計(jì)時(shí)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Unity中Instantiate實(shí)例化物體卡頓問題的解決方法,供大家參考,具體內(nèi)容如下

一、前言

當(dāng)在執(zhí)行多次Instantiate實(shí)例化物體時(shí),會(huì)卡頓嚴(yán)重甚至在移動(dòng)端會(huì)導(dǎo)致程序崩潰
因?yàn)镮nstantiate會(huì)產(chǎn)生大量的GC,使CPU過高,導(dǎo)致崩潰

下面是一段測(cè)試代碼:當(dāng)我們按下按鍵時(shí)實(shí)例化100000個(gè)預(yù)制體

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);
  }
 }
}

運(yùn)行后通過profiler查看性能

發(fā)現(xiàn)在實(shí)例化物體的那一幀產(chǎn)生了3.8MB的GC,而正常來說每幀的GC不能超過2KB,產(chǎn)生如此高的GC在移動(dòng)端會(huì)導(dǎo)致內(nèi)存溢出從而崩潰閃退。更可怕的是這一幀用時(shí)1519.24毫秒也就是1.5秒所以程序在此幀會(huì)出現(xiàn)卡頓現(xiàn)象

二、解決方法

卡頓或程序崩潰的原因就是在某一幀中產(chǎn)生了大量的GC
所以可以把一幀的操作分幀進(jìn)行

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);
   }
  }
 }
}

三、協(xié)程中幾種yield reutrn的執(zhí)行順序

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");
 }
}

經(jīng)過測(cè)試,得出以下結(jié)論

  • WaitForFixedUpdate在一幀的FixedUpdate后Update前調(diào)用
  • WaitForNull和Wait0在一幀的Update后LateUpdate前調(diào)用
  • WaitForEndFrame在會(huì)在一幀的LateUpdate后調(diào)用

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#實(shí)現(xiàn)自定義圓角按鈕的方法

    C#實(shí)現(xiàn)自定義圓角按鈕的方法

    Winform中自帶的button沒有圓角屬性,所以我們繼承Button類,重寫OnPaint事件來繪制圓角按鈕。下面通過實(shí)例代碼給大家介紹下C#實(shí)現(xiàn)自定義圓角按鈕的方法,需要的朋友參考下吧
    2021-11-11
  • C#雙緩沖實(shí)現(xiàn)方法(可防止閃屏)

    C#雙緩沖實(shí)現(xiàn)方法(可防止閃屏)

    這篇文章主要介紹了C#雙緩沖實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了C#雙緩沖的具體步驟與相關(guān)技巧,可實(shí)現(xiàn)防止閃屏的功能,需要的朋友可以參考下
    2016-02-02
  • C#中Equals和GetHashCode使用及區(qū)別

    C#中Equals和GetHashCode使用及區(qū)別

    這篇文章主要介紹了C#中Equals和GetHashCode使用及區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C#編程自學(xué)之類和對(duì)象

    C#編程自學(xué)之類和對(duì)象

    C#一種面向?qū)ο蟮木幊陶Z言,是專門為.NET應(yīng)用而開發(fā)出的語言。在.NET運(yùn)行庫的支持下,.NET框架的各種優(yōu)點(diǎn)在C#中表現(xiàn)得淋漓盡致。所以學(xué)習(xí)類和對(duì)象以及如何運(yùn)用它們是非常重要!
    2015-10-10
  • C#中GraphicsPath的Warp方法用法實(shí)例

    C#中GraphicsPath的Warp方法用法實(shí)例

    這篇文章主要介紹了C#中GraphicsPath的Warp方法用法,實(shí)例分析了Warp方法的相關(guān)使用技巧,需要的朋友可以參考下
    2015-06-06
  • C#圖像線性變換的方法

    C#圖像線性變換的方法

    這篇文章主要介紹了C#圖像線性變換的方法,涉及C#操作圖像線性變換的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • C# SendMail發(fā)送郵件功能實(shí)現(xiàn)

    C# SendMail發(fā)送郵件功能實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了C# SendMail發(fā)送郵件功能實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 字符串內(nèi)存駐留機(jī)制詳解示例

    字符串內(nèi)存駐留機(jī)制詳解示例

    字符串內(nèi)存駐留機(jī)制詳解示例,大家參考使用吧
    2013-12-12
  • C# RSA分段加解密實(shí)現(xiàn)方法詳解

    C# RSA分段加解密實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了C# RSA分段加解密實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了C# RSA加密解密的原理與具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-04-04
  • Unity編輯器資源導(dǎo)入處理函數(shù)OnPostprocessAudio使用案例

    Unity編輯器資源導(dǎo)入處理函數(shù)OnPostprocessAudio使用案例

    這篇文章主要為大家介紹了Unity編輯器資源導(dǎo)入處理函數(shù)OnPostprocessAudio使用案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評(píng)論