【问题标题】:Need code optimization but can't figure out how to do that [closed]需要代码优化,但无法弄清楚如何做到这一点[关闭]
【发布时间】:2019-08-16 19:22:48
【问题描述】:

我开发了洞游戏,玩家必须在地板上吸收一些立方体,一切看起来都很好,只是存在一些优化问题。我认为问题是由于寻找范围内的可吸收物体落入洞中引起的,我有 2 种方法,它们在 FixedUpdate 中被调用。在我在 Cubes 列表上迭代的每一帧上称为 CountNearbyCubes 的方法中,有时它的计数甚至是 500-600 个对象,如果一些对象靠近孔,那么它们被添加到另一个列表中,第二个列表用于名为 AttractCubes 的方法。在这种方法中,我遍历所有对象并查看它们的变换位置并将它们推向孔的变换位置。

这是方法和 FixedUpdate 的代码,我正在添加游戏的屏幕截图以更加清晰。

对不起,如果我的问题令人困惑。提前感谢您的帮助。

 void FixedUpdate() {

    //count real nearbyCubes
    CountNearbyCubes(ref NearbyCubes, CubesContainers, GravityCenterTransform.position);
    //count minor nearbyCubes
    AttractCubes(NearbyCubes);


}

private void AttractCubes(List<GameObject> cubes) {
    foreach (GameObject cube in cubes) {

        if (!cube.GetComponent<AbsorbableObject>().IsAbsorbed) {

            Vector3 force = CentripetalMovement.GetGravitationForce(GravityCenterTransform, cube.transform, Mass, CubeMass);

            if (cube.tag == "Bomb") {
                force /= 5;
            }

            cube.GetComponent<Rigidbody>().AddForce(force, ForceMode.Impulse);

        }

    }

}


private void CountNearbyCubes(ref List<GameObject> nearbyCubes, GameObject cubesContainer, Vector3 gravityCenter) {
    foreach (Transform cube in cubesContainer.transform) {

        if (Vector3.SqrMagnitude(cube.position - gravityCenter) < Mathf.Pow(NearbyDistance, 2)) {
            if (!nearbyCubes.Contains(cube.gameObject)) {
                if (cube.tag == "Cube" && !cube.gameObject.GetComponent<CubeController>().IsAbsorbed)
                    nearbyCubes.Add(cube.gameObject);
                else if (cube.tag == "Bomb")
                    nearbyCubes.Add(cube.gameObject);
            }
        }
        else {
            nearbyCubes.Remove(cube.gameObject);
        }

    }

}

如果你明白我在做什么,只是想知道是否有另一种方法可以更有效地提高运行时的 fps

【问题讨论】:

    标签: c# unity3d optimization game-development


    【解决方案1】:

    使用物理引擎!

    我可以想到两种方法:

    1. 将对撞机附加到洞游戏对象,将其标记为触发器,然后 捕获Collider.OnTriggerEnter(Collider) 上的所有冲突。
    2. 直接使用SphereCast

    【讨论】:

    • 这个替代方案看起来效率更高,感谢您的回复,我将使用其中一个替代当前系统
    • @Chestera 我记得还有Physics.SphereCastNonAlloc,效率更高。
    猜你喜欢
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多