首页 > 解决方案 > 更改为随机背景导致 android 滞后

问题描述

我正在尝试更改游戏的背景并且它正在工作,但也会导致 android 滞后。

我绑定了两种不同的解决方案,但结果相同。首先,背景变化由一个 int 变量管理,该变量具有两个数字之间的随机值和一个每秒增加 10f 的浮点数,用作分数。

这里还有一些其他代码,但我已经单独删除了它们,似乎是导致滞后的背景代码。

这是当前代码:

        rand1 = Random.Range(0, 4);
        rand2 = Random.Range(4, 8);
        rand3 = Random.Range(8, 12);


        //start off with a random blue background
        BGlist[rand1].SetActive(true);
        // BGmesh.material = BGmat[rand];  //OTHER SOLUTION - change material of mesh renderer

    }


    void Update()
    {
        //Set starttext to false if the character move
        if (lvlmang.left || lvlmang.right)
        {
            startText.SetActive(false);

            //every second score and speed increases
            aliveTime += Time.deltaTime;
            if (aliveTime >= 1)
            {
                scores += 10f;
                scores2 += 10f;
                speedManager += 10f;

                speedManager2 += 10f;

                speedManager3 += 10f;




                scoreText.text = scores.ToString();
                scoreText2.text = scores2.ToString();
                aliveTime -= (int)aliveTime; //reset
            }

        }
        //Increase speed after 8 seconds
        if (speedManager == 80f)
        {
            pControl.speed += 0.25f;
            speedManager = 0f;
        }

        //start screen fade every 30 seconds (preparing for background change)
        if (speedManager2 == 300f)
        {
           fadingBG.StartFading();
            speedManager2 = 0f;
        }

        if (speedManager3 == 310f || speedManager3 == 1213)
        {
            //Random yellow background


            //Set the previous backgrounds game object to false
                BGlist[0].SetActive(false);
                BGlist[1].SetActive(false);
                BGlist[2].SetActive(false);
                BGlist[3].SetActive(false);



            BGlist[rand2].SetActive(true);  //Random yellow background
            //BGmesh.material = BGmat[rand]; // OTHER SOLUTION - change material of mesh renderer
            fadingBG.StopFading();
            speedManager3 += 1f;

        }


        if (speedManager3 == 611f || speedManager3 == 1514)
        {
            //Random red background


            //Set the previous backgrounds game object to false
            BGlist[4].SetActive(false);
            BGlist[5].SetActive(false);
            BGlist[6].SetActive(false);
            BGlist[7].SetActive(false);


            BGlist[rand3].SetActive(true); //Random red background
            // BGmesh.material = BGmat[rand];
            fadingBG.StopFading();
            speedManager3 += 1f;

        }


        if (speedManager3 == 912f || speedManager3 == 1815)
        {
            //Random blue background

            //Set the previous backgrounds game object to false
            BGlist[8].SetActive(false);
            BGlist[9].SetActive(false);
            BGlist[10].SetActive(false);
            BGlist[11].SetActive(false);

            BGlist[rand1].SetActive(true); //Random blue background
            // BGmesh.material = BGmat[rand];
            fadingBG.StopFading();
            speedManager3 += 1f;

        }
    }

因此,我尝试更改网格渲染器的材质,并为我设置为活动和虚假的每个背景制作单独的游戏对象。

我正在使用网格渲染器来制作跟随相机的无限滚动背景。

标签: c#unity3d

解决方案


主要问题是您在更新中调用 Random 并且会破坏性能(我知道,因为几年前我犯了同样的错误)。当您知道要生成多个随机值时,您应该只执行一次(例如在开始中)将它们存储在一个数组中并稍后使用它们。如果您的数组为空,您可以再次调用该方法以生成多个随机值 1 次。记住永远不要在更新中调用 Random,避免在每一帧都进行任何硬计算(这不仅包括 Random,还尽可能避免)。


推荐阅读