如果固定更新中太多,请避免使用 else

问题描述 投票:0回答:3

我是新来的

Unity

由于多个 else if(大约 40),它降低了我游戏的 fps。
像这个脚本这样的 else if 条件太多,如何优化?

private void FixedUpdate()
{
    Vector3 desiredPosition = target.position + offset;
    Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
    transform.position = smoothedPosition;
    if (PisauScript.nonaktifkamera.manjat == true)
    {
        offset.x = -5;
        offset.y = 14;
        offset.z = 6;
    }
    else if (PisauScript.nonaktifkamera.manjat2 == true)
    {
        offset.x = -14;
        offset.y = 25.5f;
        offset.z = 6;
    }
    else if (PisauScript.nonaktifkamera.manjat4 == true)
    {
        offset.x = -46;
    }
    else if (PisauScript.nonaktifkamera.manjat5 == true)
    {
        offset.x = -62.7f;
        offset.y = 17.5f;
    }
    //else if { }
    //...
    //else if { }
    
c# unity-game-engine if-statement optimization frame-rate
3个回答
1
投票

避免大量 if/else 测试的一个想法,

按照您的示例,您只有一个(if/else if)true

所以改变你的逻辑来使用索引:

假设你有:

PisauScript.nonaktifkamera.manjat = 0 for PisauScript.nonaktifkamera.manjat  = true
PisauScript.nonaktifkamera.manjat = 1 for PisauScript.nonaktifkamera.manjat1 = true
PisauScript.nonaktifkamera.manjat = 2 for PisauScript.nonaktifkamera.manjat2 = true

等等.. 我的第一个想法是使用字典,但你可以在这里使用数组

您创建了一个向量3的数组:

public Vector3[] vector = new Vector3[50];

然后加载所有值(遵循 if/else if 测试):

vector[0] = new Vector3(-5f, 14f, 6f));
vector[1] = new Vector3(-14f, 25.5f, 6f));
vector[2] = new Vector3(-14f, float.NegativeInfinity, float.NegativeInfinity));
  :
  :

我使用 float.NegativeInfinity 来表示我不想更改该值。

最后你只需要用通用方法测试一个值即可

private void FixedUpdate()
{
    :
    :
    var v = vector[PisauScript.nonaktifkamera.manjat];
    
    if(!float.IsNegativeInfinity(v.x)) offset.x = v.x;
    if(!float.IsNegativeInfinity(v.y)) offset.y = v.y;
    if(!float.IsNegativeInfinity(v.z)) offset.z = v.z;
}

我没有测试过错误..

我建议你使用unity分析器...来看看你在哪里消耗了cpu

因为你确定使用大量

if/else if
的性能真的很差吗?


0
投票

有一个博客可能对您有用。

博客链接:https://medium.com/@janalmazora/how-to-prevent-using-if-else-statements-in-your-code-7e05e43afde#:~:text=Avoid%20using%20nested% 20if%2Delse,get%20this%20(代码%201.4).

此外,如果您确实想避免 if-else 语句,则可以尝试无分支编程。这肯定会增加 fps。

无分支编程链接:https://www.youtube.com/watch?v=bVJ-mWWL7cE


0
投票

如果您仅使用

else if
而不是
if
,那么您只有一个 true 布尔值。因此,您可以列出
Vector3
(或
floats
,这是您的选择)和一个
int
,而不是
bools
。 像这样的东西:

List<Vector3> vectors=new List<Vector3>(){new Vector3(-5f,14,6)};
int selectedvector=0;
private void FixedUpdate()
{
    Vector3 desiredPosition = target.position + offset;
    Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
    transform.position = smoothedPosition;
    offset=vectors[selectedvector];
}
© www.soinside.com 2019 - 2024. All rights reserved.