美文网首页unity3D技术分享
UnityPhysics.NonAlloc的几个函数有时候生效有

UnityPhysics.NonAlloc的几个函数有时候生效有

作者: 好怕怕 | 来源:发表于2023-07-23 11:44 被阅读0次

一、官网的Physics文档

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

1、Physics下带NonAlloc都是无GC的,项目中必须使用NonAlloc相关的函数来进行物理检测;

Physics.OverlapBox有GC,Physics.OverlapBoxNonAlloc无GC

GC对比.png

二、Physics.NonAlloc的几个函数有时候生效有时候不生效问题

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

结果都可以

成功.png

2、现在我们切换到项目中的无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);
    }
}

结果没有任何输出,失败了,为什么?

失败.png

三、问题探究解决

1、我们看下两次代码都有哪些变化

(1)成功:测试代码的Physics.OverlapBox接收的Collider数组用的是m_Colliders
(2)成功:测试代码的Physics.OverlapBoxNonAlloc参数也是用的m_Colliders
(3)失败:测试代码的Physics.OverlapBoxNonAlloc参数是用的m_Colliders

2、发现问题所在

(1)成功:m_Colliders数组默认没有初始化,Physics.OverlapBox接收的数组赋值给了m_Colliders,此时m_Colliders就被初始化了,当Physics.OverlapBoxNonAlloc传递进去的数组就已经是初始化后的了,所以成功了;
(2)失败:m_Colliders数组没有被初始化,直接传递给了Physics.OverlapBoxNonAlloc的参数,Physics.OverlapBoxNonAlloc内部并不会对一个没有初始化的Collider[]进行初始化,因为Collider[]初始化的长度由外部使用者决定的,所以使用Physics.NonAlloc相关的函数外部传递进去的缓存数组必须先初始化

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

相关文章

  • 解决ant-design里Table组件width不生效的问题

    直接写上width: 100不生效,写到render函数里maxwidth生效

  • es6箭头函数注意点

    箭头函数中的this总是指向函数定义生效时(而不是使用时)所指向的对象,而普通函数中的this指的是运行生效时所指...

  • 听欢哥讲PHP之cookie问题

    PHP中的cookie必须刷新才能生效的问题,``` 这里输入代码 // php COOKIE设置函数立即生效,...

  • 添加辅助函数时不生效

    添加辅助函数是运行:composer dumpautoload 生效

  • 2019-03-04

    python函数,传递列表可以修改,普通变量只在函数内生效

  • window添加事件监听的小问题(echarts 的onresi

    呐,在项目中希望添加onresize的事件监听,两种写法,有时候第一种生效,有时候第二种才会生效,不明白有什么区别...

  • JavaScript 胖箭头函数中的this

    在非箭头函数下, this 指向调用其所在函数的对象箭头函数导致this总是指向函数定义生效时所在的对象 以前这种...

  • golang panic&recover

    触发panic 捕获 panic recover 的使用,有一个条件,就是它必须在 defer 函数中才能生效,其...

  • 7.16

    函数三 作用域 作用域定义:变量和函数生效(能被访问)的区域 var a = 123;function test(...

  • 函数三

    作用域 作用域定义:变量和函数生效(能被访问)的区域 函数里边可以访问函数外边的东西,函数外不可以访问函数里的东西...

网友评论

    本文标题:UnityPhysics.NonAlloc的几个函数有时候生效有

    本文链接:https://www.haomeiwen.com/subject/pvmfpdtx.html