为什么这会导致我的Unity游戏的帧速率直线下降?

时间:2015-03-27 02:46:33

标签: c# unity3d

我正在制作基本的Unity 3D FPS游戏。今晚我试图添加功能来拍摄东西,以便当我击中它们时它们溶解成火并被摧毁。我使用光线投射功能实现了这一点,当我去添加火焰和破坏(使用显示的代码)时,它就像我想要的那样工作:目标溶解成火(muhaha)。 我继续拍摄了几个目标,而在第四个目标上,我的帧速率从每秒71帧突然下降到10 。我做了一些相同结果的测试:无论我在拍摄前等待多久,FPS仍然在第3或第4次下降。我以不同的顺序射击目标。结果相同。

目标上没有任何代码,基本上只是盒子。我正在使用的火是用Unity作为资产的火(这是灯的问题吗?)。

我提前感谢您的帮助,并随时提出其他问题的评论。

变量声明:

public LineRenderer bulletTracer;
public float fireSpeed = 4.0f;
float fireTimer = 0.0f;
bool bulletShot = false;
Ray ray;
RaycastHit hitObject;
public GameObject gun;
public GameObject scope;
public GameObject fire;

代码:

ray = Camera.main.ViewportPointToRay(new Vector3(0.5F, 0.5F, 0));

if (fireTimer > fireSpeed && 1 == Input.GetAxis("Fire1") && Physics.Raycast(ray, out hitObject)){

    fireTimer = 0;

    //Makes a really nice line from the gun to the position that I hit.
    bulletTracer.SetPosition(0, gun.transform.position);
    bulletTracer.SetPosition(1, hitObject.point);

    bulletShot = true;

    //if you hit a target or a pickup....
    if(hitObject.collider.attachedRigidbody.gameObject.tag == "target" & hitObject.collider.attachedRigidbody.gameObject.tag == "Pickup")
    {
        Instantiate(fire, hitObject.transform.position, new Quaternion(0, 0, 0, 1)); //spawns fire at the hit object
        Object.Destroy(hitObject.collider.attachedRigidbody.gameObject); //destroys that object
    }       
}

编辑:我发现我的问题涉及print语句。谢谢所有帮助过我的人。

3 个答案:

答案 0 :(得分:1)

您没有使用对象池。实例化和销毁是昂贵的。现在不要实例化这些东西,而是已经加载它们,只是适当地启用/禁用和重新定位。

如果它仍然滞后,可能是因为火和具有相同效果的物体数量。

另外,使用Qusternion.identity。不要创建一个新的。

祝你好运!

答案 1 :(得分:0)

有一个组件未正确分配,并且一直向控制台返回错误,每次我拍摄对象时错误都会更快。我快速删除了一个修复滞后的组件。

答案 2 :(得分:0)

如果您没有分析器,则可以看到统计信息("统计信息"按钮)面板。它还告诉你计算(" CPU")和渲染图形("渲染线程")花了多少毫秒。如果"渲染线程"时间太长,你可能需要减少你的特殊效果(减少火焰粒子?)。如果CPU需要很长时间,请优化代码:例如,使用对象池为@TheNoob说。 enter image description here