【问题标题】:How to fix high speed and lagging on Android build如何修复 Android 构建的高速和滞后问题
【发布时间】:2019-04-30 17:58:44
【问题描述】:

我有一款我一直在开发的游戏。昨晚我构建了它并将其上传到 Google Play。然后我拿起我的安卓手机,去 Play 商店下载我的游戏,当它开始时,它运行得非常糟糕。游戏移动得非常快和滞后,几乎就像我将相机速度设置为一个疯狂的高数字一样。它是完全无法播放的。这将是游戏的主菜单,上面没有 UI 元素:https://youtu.be/Hxih--U8q9g

场景的一点背景:

所有这些建筑物和道具都会在运行时在玩家通过关卡时在更新函数中实例化,但一旦玩家通过它们,它们也会被摧毁。它们都是预制件,并且都使用具有各自纹理的自己的单独材料。玩家实际玩的游戏关卡与主菜单完全相同,只是里面有玩家。我的问题是,这可能仅仅是因为对移动设备的优化不佳吗?

我已经在 Unity 中将质量设置设置为最低,并将所有纹理从 4K 分辨率缩小到 128x128 - 512x512(取决于资产)。即使进行了这些优化,游戏的运行也和以前一样糟糕。

我将改变实例化对象的方式,并改用对象池。我还将使用纹理图集来代替所有这些不同的纹理和材料。

这是我目前实例化预制件的方式:

    void Update()
    {
        if (player.transform.position.z >= spawn.transform.position.z)
        {
            center = transform.position;
            for (int i = 0; i < Random.Range(obstacleDifficulty.x, obstacleDifficulty.y); i++)
            {
                StartCoroutine(Delay());
            }
            Vector3 newPos = transform.position;
            newPos.z += moveSpawner;
            transform.position = newPos;
        }
    }

    public void SpawnObstacles()
    {
        Vector3 pos = center + new Vector3(Random.Range(-size.x / 2, size.x / 2), 0, Random.Range(-size.z / 2, size.z / 2));
        int n = Random.Range(0, obstacles.Length);
        GameObject theObstacle = obstacles[n];
        Instantiate(theObstacle, pos, rotation);
    }

    IEnumerator Delay()
    {
        yield return new WaitForSeconds(0.05f);
        SpawnObstacles();
    }

我想解决这个问题,让游戏运行得非常流畅。我想知道做我上面描述的事情,使用池和图集,是否足以解决这个问题。

编辑: 这是我的相机控制器脚本:

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour
{

    public GameObject player;
    public float cameraHeight;

    private Vector3 offset;

    void Start ()
    {
        offset = transform.position - player.transform.position;
    }

    void LateUpdate ()
    {
        transform.position = player.transform.position + offset;
        transform.position = new Vector3(0, cameraHeight, transform.position.z);
    }
}

我在 Unity 的官方教程中看到了一些关于使用 Time.deltaTime 的内容,但我认为我应该在玩家的移动中使用它,并且将玩家的速度值与 Time.deltaTime 相乘并没有得到我想要的结果。这是我的玩家的动作:

rb.velocity = new Vector3(xVelocity * Input.acceleration.x * 1.75f, 0, 速度);

昨晚我还禁用了相机上的所有图像效果,并从我的场景中删除了大约 25 个批次,我不知道那些会这么贵。我的场景大约有 15 个批次,之前大约是 55-70 批次,我还没有在我的手机上测试它以查看它是如何移动的。

【问题讨论】:

  • 1) 您是否尝试过在统一 3d 中进行分析?这可能很有帮助。 2) 为什么要在 Update 中实例化对象?为什么不在开始时(开始)实例化所有它们并将更新留空,因为它每帧调用一次?
  • @AlexSikilinda 我想在运行时实例化它们的原因是因为我用它来实例化预制件,这些预制件共同构成了我的玩家正在玩的关卡,我不知道他会走多远进入那一轮。我在 Unity 中使用了分析器,但对我来说没有什么奇怪的,除了一些我理解的只发生在编辑器中的事情,所以我不应该担心这些。
  • 你试过完全实例化整个关卡吗?它可能比每次在更新中检查它更快?或者您可以实例化关卡的很大一部分,而不是实例化单独的障碍。
  • 您还可以在设备上配置文件(请参阅 Unity 文档),您将看到最耗时的内容
  • 尽可能避免在运行时实例化。对象池可能会大大提高您的性能,尤其是在移动设备上的 3D 中。

标签: c# unity3d


【解决方案1】:

我刚刚制作了一个测试场景。它与实际的游戏关卡相同,但在这个关卡中,我禁用了所有正在实例化的东西,而是通过手动放置预制件来制作关卡的一小部分。我还在我所有的对象上放了完全相同的材料,一种标准的蓝色材料。所以在运行时没有生成对象,也没有纹理,而且我的构建在我的 android 设备上仍然运行缓慢。没有以前那么卡了,自从我禁用了后期处理效果(雾除外)后就可以玩了,但是游戏还是不流畅。

我还能做些什么来让它顺利运行?

这是我在同一台 Android 设备上玩游戏时的分析器,但在使用 Unity Remote 的编辑器中。 Profiler screenshot

【讨论】:

    【解决方案2】:

    您需要检查您的分析器,然后您将查看是否需要优化游戏并检查批次。 使用 Time.deltatime 就像你想让你的游戏独立于设备类型一样,所以即使在慢速设备上你也会得到 10 的速度(假设你将速度设置为 10),而在更快的高端设备上您仍将获得 10 的速度。如果您不使用 Time.deltatime,您将在高端设备中获得更多帧数,并且速度会变得如此之高,因为您将非常快速地移动播放器,因为高帧率,在低端设备中移动缓慢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2019-07-21
      相关资源
      最近更新 更多