我有一个名为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个是值类型。
答案 0 :(得分:1)
1)我应该使用回调还是手动调用函数 相应类别的参考
直接调用函数更快,但这根本不是问题。它没有那么大的差别。
2)因为我传递了4个参数,其中一些参数是 在一些脚本中有用会有更多垃圾收集吗?比 手动调用脚本方法?在四个参数中我 传递2是引用类型,2是值类型。
不,当您将更多参数传递给委托时,将没有内存分配。分配内存的唯一时间是初始化onCutCB
变量。例如,onCutCB = OnCut;
。这就是onCutCB
必须在Start
或Awake
函数中初始化一次的原因。调用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教程。