2017-04-26 45 views
0

我有一个动作回调称为​​ 我有5个脚本,它引用了一个名为将更多参数传递给Action高效?

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

功能,但问题是,这些5个脚本,首先脚本需要3个参数,第二个脚本需要的所有参数,休息的脚本需要一个参数
所以,问题是
1)我应该使用回调或通过使用各自的类
2)由于我传递4个参数出其中的一些参数是参考从手动调用的功能在某些脚本中很有用,会有更多的垃圾回收ection?比手动调用脚本方法?
在我传递的四个参数中,2是参考类型,2是值类型。

+0

衡量它并决定你的具体情况。无论如何,在99%的情况下,微观优化是邪恶的。尤其是当你决定一个OnGameOver函数时,它最有可能只发生一次,而不是每秒1000次... – walther

+0

OnGameOver回调被称为每分钟5次,实际上我只是将名称更换为OnGameOver – sagar

+0

一个会话在你的游戏持续12秒?为什么每分钟拨打5次OnGameOver?无论如何,为什么你想优化这个?你有什么问题吗?如果是的话,那么专注于它们而不是微观优化会更有益处。 – walther

回答

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

虽然当我玩我的游戏在移动设备上直到它 工作正常minitues但之后一些次滞后有点我使用的对象 pooling也当我重新启动游戏我的场景不加载我只使用 池,因为被实例化的gameobject是必需的。

您描述的这个问题与您的游戏的逐渐减速无关。您要么不间断地实例化许多对象,从Update函数的每一帧开始一个协程,并且协程不会结束/停止或者合计执行时间的内容。

没有你的全部脚本,不可能告诉你是什么原因导致你的问题。请,不是用你的所有代码编辑你的问题。自己查找并解决问题。

使用Profiler!

转到的Windows - >探查然后启用深剖面并点击 “记录” 和clicl播放按钮。您将看到哪个脚本正在分配内存以及每个功能需要多少时间才能完成。看看这些并修复它。

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

+0

是的,我已经使用过探查器,但在探查器中,我的cpu时间永远不会超过30%,玩像10-15分钟的游戏可以正常工作,但稍后在移动设备上也会出现几秒钟的问题。在Unity编辑器上,它甚至在20分钟内都不会落后(我使用的手机是Nexus 5)。并感谢回忆的记忆分配,我不知道这一点 – sagar