所以我做了一个简单的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的任何想法?谢谢!
答案 0 :(得分:1)
使用探查器测试游戏并查找游戏中的峰值。这将帮助您轻松识别代码的哪一部分正在创建问题,因为对象生成脚本不一定会导致问题。
在我的一个项目中,我遇到了一个问题,即我的字体导致FPS下降。
正如你提到你的"积分计数器"然后我会问你是否使用自定义字体?如果是,那么它是否设置为动态?如果是,那么这可能是问题,因为Unity在运行时和每次更新文本时呈现动态字体,因此建议使用动态字体用于静态菜单,但不能用于不断更改文本。
有关分析器的更多详细信息请查看以下链接:
答案 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 ,您希望尽可能保持它们。