简单游戏中的可怕 FPS
Terrible FPS in simple game
所以我正在制作一个简单的 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 崩溃!我有 Intel i7、8GB RAM、Nvidia 550m,所以我的笔记本电脑可能不是问题。还值得一提的是,我的点数计数器对我生成的对象很疯狂,但对我手动放置的对象进行了完美计数(换句话说,生成的对象使我的点数计数器计数太多点)。关于为什么我的游戏导致低 FPS 的任何想法?谢谢!
您要从内存中释放 "picked up" 项吗?当您创建每一个时,它都会使用内存来处理位置、移动等。如果您不释放该内存,那么最终您 运行 会用完它。
我只看过Unity的视频,没写过代码,所以我无法解释如何释放内存,但我知道所有的计算机程序都必须释放内存。所以语言和软件会自动释放内存……其他的必须手动完成。
问题似乎是您在 "Update" 中在运行时实例化了很多游戏对象而不是销毁它们。理想情况下,您应该做的是仅实例化一次所需的游戏对象,将其存储在对象池中并在运行时重复使用。有很多例子可以做到这一点,你只需要 google.
使用分析器测试您的游戏并查找游戏中的峰值。这将帮助您轻松识别您的代码的哪一部分正在产生问题,因为您的对象生成脚本不一定会导致问题。
在我的一个项目中,我遇到了一个问题,我的字体导致 FPS 下降。
正如您提到的 "points counter" 那么我想问一下您是否使用自定义字体?如果是,那么它是否设置为动态?如果是,那么这可能是问题所在,因为 Unity 在运行时和每次更新文本时都会呈现动态字体,因此建议对静态菜单使用动态字体,但不要对不断变化的文本使用动态字体。
有关分析器的更多详细信息,请查看以下链接:
首先,所有游戏都会因实例化方法而延迟。如果您需要使用它,请在 void Start() {...}
或 void Awake() {...}
中使用它并缓存所有创建的对象。使用这些缓存对象创建对象池并节省性能。
不要使用 Unity 创建的实例的转换,确保创建缓存对象
private Transform _transform;
void Start() {
_transform = transform;
}
与其自己计算 counter > timebetweenSpawn
,不如确保使用 InvokeRepeating 来节省性能。
确保在编辑器中创建的对象(如果不是移动对象)是静态。如果不移动它们,则不必重新绘制它们。
团结Profiler将是你最好的朋友。对一切进行基准测试。
不要更改 Transform
对象的比例,最好更改您正在使用的图像的大小。规模需要性能。
FixedUpdate = 物理学
更新=游戏逻辑
留意 Tris 和 Verts,您希望它们尽可能低。
所以我正在制作一个简单的 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 崩溃!我有 Intel i7、8GB RAM、Nvidia 550m,所以我的笔记本电脑可能不是问题。还值得一提的是,我的点数计数器对我生成的对象很疯狂,但对我手动放置的对象进行了完美计数(换句话说,生成的对象使我的点数计数器计数太多点)。关于为什么我的游戏导致低 FPS 的任何想法?谢谢!
您要从内存中释放 "picked up" 项吗?当您创建每一个时,它都会使用内存来处理位置、移动等。如果您不释放该内存,那么最终您 运行 会用完它。
我只看过Unity的视频,没写过代码,所以我无法解释如何释放内存,但我知道所有的计算机程序都必须释放内存。所以语言和软件会自动释放内存……其他的必须手动完成。
问题似乎是您在 "Update" 中在运行时实例化了很多游戏对象而不是销毁它们。理想情况下,您应该做的是仅实例化一次所需的游戏对象,将其存储在对象池中并在运行时重复使用。有很多例子可以做到这一点,你只需要 google.
使用分析器测试您的游戏并查找游戏中的峰值。这将帮助您轻松识别您的代码的哪一部分正在产生问题,因为您的对象生成脚本不一定会导致问题。
在我的一个项目中,我遇到了一个问题,我的字体导致 FPS 下降。
正如您提到的 "points counter" 那么我想问一下您是否使用自定义字体?如果是,那么它是否设置为动态?如果是,那么这可能是问题所在,因为 Unity 在运行时和每次更新文本时都会呈现动态字体,因此建议对静态菜单使用动态字体,但不要对不断变化的文本使用动态字体。
有关分析器的更多详细信息,请查看以下链接:
首先,所有游戏都会因实例化方法而延迟。如果您需要使用它,请在 void Start() {...}
或 void Awake() {...}
中使用它并缓存所有创建的对象。使用这些缓存对象创建对象池并节省性能。
不要使用 Unity 创建的实例的转换,确保创建缓存对象
private Transform _transform;
void Start() {
_transform = transform;
}
与其自己计算 counter > timebetweenSpawn
,不如确保使用 InvokeRepeating 来节省性能。
确保在编辑器中创建的对象(如果不是移动对象)是静态。如果不移动它们,则不必重新绘制它们。
团结Profiler将是你最好的朋友。对一切进行基准测试。
不要更改 Transform
对象的比例,最好更改您正在使用的图像的大小。规模需要性能。
FixedUpdate = 物理学
更新=游戏逻辑
留意 Tris 和 Verts,您希望它们尽可能低。