【问题标题】:Variable setting code efficiency变量设置代码效率
【发布时间】:2014-05-10 21:22:22
【问题描述】:

在 Unity 3D 中工作时,我遇到了一个 8 毫秒的自我时间,该方法实际上只是运行了一些其他方法。 (所以说整个方法用了 10ms,self 时间是 8ms,只有 2ms 进入了“其他方法”。所以这 8ms,必须来自 profiler 中显示的方法)

注释掉东西后,我注意到问题可以追溯到几行代码。 以下方法,当运行 2200 次时。自我 ms 为 8。

private bool checkPiece (GameObject targetPiece,int side){
    if(targetPiece == null) return false;
    Transform targetTransform = targetPiece.transform;
    Vector3 origin = myTransform.position;
        Vector3 target = targetTransform.position;
    /*
    ...
    */
    return false;
}

我试图测试每一个,只是在做:

变换 targetTransform = targetPiece.transform;

已经进行了 2 毫秒的自拍时间。如果您想以不错的帧速率运行,那真是太糟糕了。 除了不那么频繁地运行这种方法之外。如何改善这种行为?

我从未见过仅在设置变换和位置时统一程度如此之高。

我已经尝试将变量放在方法之外,因此每次更新它们都会被覆盖。然而,这根本没有区别。 (我想这在构建代码时已经优化了?)

任何帮助将不胜感激。

【问题讨论】:

  • 您似乎已将其范围缩小到转换属性调用,因此除了不经常调用它之外,它不受您的控制。您真的不知道这些属性的底层发生了什么,例如,转换可以存储在一个集合中,而不是存储在对象上以优化迭代转换,这取决于集合可能导致更长的查找时间.您可以通过查看运行时如何随着转换数量的增加而变化来测试这一点。
  • 您在 8 毫秒内运行了 2200 个方法调用?每次调用 3.63 微秒,看起来还不错。
  • 所有事情都考虑到了。我设法减少了检查频率,只需放入一个每 50 毫秒检查一次的微型计时器,如果失败,则确保在下一次检查之前需要 100 毫秒。结果,调用分散得更多(因为每个脚本都调用了 2 次转换,覆盖了该脚本的几百个副本)并给它所有时间来呼吸:)

标签: c# variables unity3d variable-assignment profiler


【解决方案1】:

当抓取对象的变换或大多数组件时,您需要在计算上付出代价。在将它们传递给函数之前,看看你是否可以使用缓存来存储你的游戏对象的变换。

你可以改变这一行

private bool checkPiece (GameObject targetPiece, int side)

private bool checkPiece (Transform targetPiece, int side)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-29
    • 2017-04-16
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    相关资源
    最近更新 更多