将更多参数传递给Action Efficient?

时间:2017-04-26 10:29:37

标签: c# unity3d

我有一个名为Action<GameObject,GameState,GameObject,Vector3> onCutCB;的Action回调 我有5个脚本引用了一个名为

的函数
void OnCut(GameObject survivalObj,GameState state,GameObject 
    destroyObj,Vector3 startPos){
    ////
} 

但问题是,在这5个脚本中,第一个脚本需要3个参数,第二个脚本需要所有参数,其余脚本需要一个参数
所以问题是 1)我应该使用回调或手动调用函数来使用各个类的引用
2)因为我传递了4个参数,其中一些参数在某些脚本中有用会有更多垃圾收集吗?比手动调用脚本方法? 我传递的四个参数中有2个是参考类型,2个是值类型。

1 个答案:

答案 0 :(得分:1)

  

1)我应该使用回调还是手动调用函数   相应类别的参考

直接调用函数更快,但这根本不是问题。它没有那么大的差别。

  

2)因为我传递了4个参数,其中一些参数是   在一些脚本中有用会有更多垃圾收集吗?比   手动调用脚本方法?在四个参数中我   传递2是引用类型,2是值类型。

不,当您将更多参数传递给委托时,将没有内存分配。分配内存的唯一时间是初始化onCutCB变量。例如,onCutCB = OnCut;。这就是onCutCB必须在StartAwake函数中初始化一次的原因。调用onCutCB时,不会发生内存分配。

阅读以下代码中的注释,了解内存的分配位置:

Action<GameObject, GameState, GameObject, Vector3> onCutCB;

void OnCut(GameObject survivalObj, GameState state, GameObject
destroyObj, Vector3 startPos = default(Vector3))
{

}

void Start()
{
    //MEMORY IS ALLOCATION
    onCutCB = OnCut;
}

void Update()
{
    //NO MEMORY ALLOCATION HERE
    onCutCB(objToUse, gameState, anotherObj, thePos);
}
  

虽然当我在移动设备上玩我的游戏时,直到迷你吧   工作得很好,但在那之后它有点滞后我使用对象   当我重新开始游戏时,我的场景也不会加载我只是使用   汇集,因为需要实例化的游戏对象。

您描述的此问题与游戏逐渐减慢无关。您可以不间断地实例化多个对象,从Update函数开始每个帧的协同程序,并且协同程序不会结束/停止或者累计执行时间。

如果没有所有脚本,则无法确定导致问题的原因。请用您的所有代码编辑您的问题。自己查找并解决问题。

使用Profiler!

转到 Windows - &gt; Profiler 然后启用 Deep Profiler 并点击&#34;记录&#34;并点击播放按钮。您将看到哪个脚本正在分配内存以及每个函数完成所需的时间。看看这些并修复它。

Here是关于如何使用Profiler的完整Unity教程。