UnityPhysics.NonAlloc的幾個函數(shù)有時候生效有時候不生效問題

一、官網(wǎng)的Physics文檔

https://docs.unity.cn/cn/2019.4/ScriptReference/Physics.html

1、Physics下帶NonAlloc都是無GC的,項目中必須使用NonAlloc相關(guān)的函數(shù)來進(jìn)行物理檢測;

Physics.OverlapBox有GC,Physics.OverlapBoxNonAlloc無GC

GC對比.png

二、Physics.NonAlloc的幾個函數(shù)有時候生效有時候不生效問題

1、先看一下下面的測試代碼

public class ColliderTest : MonoBehaviour
{
    private Collider[] m_Colliders;

    void Update()
    {
        m_Colliders = Physics.OverlapBox(Vector3.zero, new Vector3(2, 2, 2));
        Debug.Log("OverlapBox:" + m_Colliders.Length);

        var count = Physics.OverlapBoxNonAlloc(Vector3.zero, new Vector3(2, 2, 2), m_Colliders);
        Debug.Log("OverlapBoxNonAlloc:" + count);
    }
}

結(jié)果都可以

成功.png

2、現(xiàn)在我們切換到項目中的無GC寫法的代碼中去

public class ColliderTest : MonoBehaviour
{
    private Collider[] m_Colliders;

   void Update()
    {
        var count = Physics.OverlapBoxNonAlloc(Vector3.zero, new Vector3(2, 2, 2), m_Colliders);
        Debug.Log("OverlapBoxNonAlloc:" + count);
    }
}

結(jié)果沒有任何輸出,失敗了,為什么?

失敗.png

三、問題探究解決

1、我們看下兩次代碼都有哪些變化

(1)成功:測試代碼的Physics.OverlapBox接收的Collider數(shù)組用的是m_Colliders
(2)成功:測試代碼的Physics.OverlapBoxNonAlloc參數(shù)也是用的m_Colliders
(3)失敗:測試代碼的Physics.OverlapBoxNonAlloc參數(shù)是用的m_Colliders

2、發(fā)現(xiàn)問題所在

(1)成功:m_Colliders數(shù)組默認(rèn)沒有初始化,Physics.OverlapBox接收的數(shù)組賦值給了m_Colliders,此時m_Colliders就被初始化了,當(dāng)Physics.OverlapBoxNonAlloc傳遞進(jìn)去的數(shù)組就已經(jīng)是初始化后的了,所以成功了;
(2)失?。簃_Colliders數(shù)組沒有被初始化,直接傳遞給了Physics.OverlapBoxNonAlloc的參數(shù),Physics.OverlapBoxNonAlloc內(nèi)部并不會對一個沒有初始化的Collider[]進(jìn)行初始化,因為Collider[]初始化的長度由外部使用者決定的,所以使用Physics.NonAlloc相關(guān)的函數(shù)外部傳遞進(jìn)去的緩存數(shù)組必須先初始化

private Collider[] m_Colliders = new Collider[1];

2、問題解決

public class ColliderTest : MonoBehaviour
{
    private Collider[] m_Colliders = new Collider[1];

    void Update()
    {
        var count = Physics.OverlapBoxNonAlloc(Vector3.zero, new Vector3(2, 2, 2), m_Colliders);
        Debug.Log("OverlapBoxNonAlloc:" + count);
    }
}
成功.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 參考Unity - 射線檢測[https://www.cnblogs.com/SouthBegonia/p/117...
    合肥黑閱讀 3,270評論 0 1
  • URP屏幕后處理 由于Unity對URP的屏幕后處理需集成要到2019.4版本后才穩(wěn)定,所以升級Unity版本到2...
    BacteriumFox閱讀 14,186評論 1 9
  • 主模塊屬性功能 Duration系統(tǒng)運行的時間長度。 Looping如果啟用此屬性,系統(tǒng)將在其持續(xù)時間結(jié)束時再次啟...
    Cheney_閱讀 3,798評論 0 10
  • 一:什么是協(xié)同程序?答:在主線程運行時同時開啟另一段邏輯處理,來協(xié)助當(dāng)前程序的執(zhí)行。換句話說,開啟協(xié)程就是開啟一個...
    CrixalisAs閱讀 2,241評論 1 7
  • This article is a record of my journey to learn Game Deve...
    蔡子聰閱讀 4,129評論 0 9

友情鏈接更多精彩內(nèi)容