简单游戏中的可怕FPS

时间:2015-07-26 22:50:41

标签: performance unity3d frame-rate

所以我做了一个简单的2D游戏,玩家在x轴上移动并拾取掉落的物体。我有一个脚本来生成播放器上方的对象,这里是:

using UnityEngine;
using System.Collections;

public class Spawner : MonoBehaviour
{
    private GameObject[] locationsToSpawn;
    private float counter = 0;
    [SerializeField]
    string[] listOfPossibleTags;
    [SerializeField]
    GameObject[] objectToSpawn;
    [SerializeField]
    float timeBetweenSpawns = 3.0f;

    void Start()
    {
        locationsToSpawn = GameObject.FindGameObjectsWithTag("SpawnLocation");
    }
    void Update()
    {
        counter += Time.deltaTime;
        if (counter > timeBetweenSpawns)
        {
            GameObject spawnedObject;
            spawnedObject = Instantiate(objectToSpawn[Random.Range(0,objectToSpawn.Length)], locationsToSpawn[Random.Range(0, locationsToSpawn.Length)].transform.position, Quaternion.identity) as GameObject;
            spawnedObject.gameObject.tag = listOfPossibleTags[Random.Range(0, listOfPossibleTags.Length)];
            counter = 0;
        }
    }
}

然而,在拿起一些物体后,游戏变得如此迟钝,最终导致Unity崩溃!我有英特尔i7,8GB内存,Nvidia 550m,所以我的笔记本电脑可能不是问题。另外值得一提的是,我的点计数器对我生成的对象感到疯狂,但计算我手动完美放置的对象(换句话说,生成的对象使得我的点计数器计数太多点)。关于为什么我的游戏导致低FPS的任何想法?谢谢!

4 个答案:

答案 0 :(得分:1)

使用探查器测试游戏并查找游戏中的峰值。这将帮助您轻松识别代码的哪一部分正在创建问题,因为对象生成脚本不一定会导致问题。

在我的一个项目中,我遇到了一个问题,即我的字体导致FPS下降。

正如你提到你的"积分计数器"然后我会问你是否使用自定义字体?如果是,那么它是否设置为动态?如果是,那么这可能是问题,因为Unity在运行时和每次更新文本时呈现动态字体,因此建议使用动态字体用于静态菜单,但不能用于不断更改文本。

有关分析器的更多详细信息请查看以下链接:

  1. Introduction to Profiler - Unity Official Tutorial
  2. Unity Manual - Profiler
  3. Unity Manual - Profiler Window

答案 1 :(得分:0)

你是否从记忆中释放了“拾取”物品?当你创建每一个时,它使用内存来处理位置,移动等。如果你不释放那个内存,那么最终你就会用尽它。

我只看过Unity的视频但从未​​在其中编码,所以我无法解释如何释放内存,但我知道在所有计算机程序中,必须释放内存。因此语言和软件会自动释放内存......其他语言必须手动完成。

答案 2 :(得分:0)

问题似乎是你在"更新"中实例化了很多游戏对象。在运行时而不是破坏它们。理想情况下,您应该做的只是实例化所需的游戏对象一次,将其存储在对象池中并在运行时重用它。有很多例子可以做到这一点,你只需要google。

答案 3 :(得分:0)

首先,所有游戏都会因实例化方法而导致滞后。如果您需要使用它,请在void Start() {...}void Awake() {...}中使用它并缓存所有创建的对象。使用这些缓存的对象可以创建对象池并保存性能。

不要使用Unitys创建实例的转换,请确保创建缓存对象

private Transform _transform;
void Start() {
    _transform = transform;
}

不要自己计算counter > timebetweenSpawn,而是确保使用InvokeRepeating来保存效果。

确保编辑器中创建的对象(如果不是移动对象)静态。如果不移动它们,则不必重绘它们。

Unity Profiler将成为你最好的朋友。基准测试一切。

不要在Transform对象的Scale上进行更改,最好更改正在使用的图像的大小。规模取决于绩效。

FixedUpdate = physics

更新=游戏逻辑

密切注意 Tris Verts ,您希望尽可能保持它们。