如何降低抛射速度变量的计算成本?

时间:2016-04-06 18:33:07

标签: javascript performance unity3d

我目前正与我的一位朋友合作开发视频游戏项目,该项目目前正在Unity 3D中开发。 游戏涉及特定的生成点,实际上以确定的速率生成物体作为射弹。它们的速度由与此生成点相关的脚本(javascript)中编码的公共变量控制。 产生的物体在它们被扔到世界之前产生了搜索速度,然后它们以确定的速度行进,这可能并且将在游戏期间变化(因为这是与人类玩家和工作相关的主要特征之一)在游戏中)。

我们目前正在使用此方法来查找射弹必须行进的速度:

var script: spawn = findObjectOfType(spawn);
myspeed = script.speed;

现在,在每次更新时执行此操作在计算成本方面可能非常痛苦,因为更新每秒会发生数千次。有没有机会实现更好的方法来执行此操作?

我不知道自己是否足够清楚,如果您还需要其他任何内容,请告诉我,谢谢您的耐心等待!

2 个答案:

答案 0 :(得分:1)

快速注意:我使用C#进行统一工作,因此代码可能略有不同,但概念仍然适用。

由于性能低下,应该在Update中不惜一切代价避免使用FindObjectOfType,GetComponent等。您可以尝试许多替代方案,具体取决于对象的实例化方式。既然你没有在你的问题中说,我会介绍一些。

如果“衍生的”GameObject已经在编辑器的场景中
在这种情况下,您只需在生成点脚本类型的衍生对象上向脚本添加属性即可。然后,在编辑器中,将生成点拖到该对象上

如果您正在使用Instantiate在运行时实例化预制件
如果你要实例化很多对象,这实际上不是一个好主意。对象实例化是一项非常昂贵的操作。如果可能,您应该存储实例化的对象并重用它们。无论哪种方式,如果这是您的方法,您可以在实例化的预制件上使用GetComponent来获取对生成对象的脚本的引用,然后从那里设置所需的值。这仍然涉及在Update中使用GetComponent,但这仍然比使用FindObjectOfType

更好一些

完全不同的方法:粒子系统
所有这些脚本无意义的替代方法是仅使用附加到生成点的粒子系统。粒子系统旨在快速有效地创建大量对象。创建粒子系统后,您只需在编辑器中设置起始速度

即可

其他一些可能有帮助的说明:
你在你的问题中说,更新发生在“每秒数千次”。更新运行(如非常有用的默认注释所示)每一帧。这意味着更新之间的时间可能因计算机而异,甚至时刻都有很大差异。这也意味着默认情况下,使用Update编写的代码取决于帧速率。如果由于游戏原因而产生这些对象,则需要确保它们的生成率不依赖于帧速率。您可以使用Time.DeltaTime获取自上次更新以来的秒数。例如(抱歉C#,但你应该能够轻松翻译):

public float TimeBetweenActions = 1f;
private float elapsed = 0f;

void Update() {
    elapsed += Time.DeltaTime;
    if(elapsed >= TimeBetweenActions){
        DoTheThing();
        elapsed-=TimeBetweenActions;
}

答案 1 :(得分:0)

您必须保存'脚本'在Start方法中。

然后您在更新中处理它。另外:最好为“生成”设置一个标签。并使用' gameObject.FindGameObjectWithTag(字符串标记);'

最后一件事:如果你真的担心速度......不要使用JavaScript