我应该尽可能地合并静态物体吗?

时间:2013-02-12 12:53:08

标签: c# xna farseer 2d-games

我正在制作一个roguelike游戏,使用XNA和farseer物理。 有些房间会有一个程序生成的洞穴,就像街区一样。 "caves" with farseer debug mode on

目前每个街区都是一个单独的尸体。如此创造:

 _floor = BodyFactory.CreateRectangle(_world,   ConvertUnits.ToSimUnits(Globals.SmallGridSize.X), ConvertUnits.ToSimUnits(Globals.SmallGridSize.Y), 30f);
        _floor.Position = ConvertUnits.ToSimUnits(_position.X + _centerVect.X, _position.Y + _centerVect.Y);
        _floor.IsStatic = true;
        _floor.Restitution = 0.2f;
        _floor.Friction = 0.2f;

我应该每个房间只有一个身体,并将每个块的所有矩形形状添加到身体? 这会给我带来性能提升吗?也可以在这个体上添加和删除块形状(为了能够破坏一个块,然后“添加”它后面的暴露块)?

1 个答案:

答案 0 :(得分:2)

您很可能希望每个块保留1个Body,因为在销毁块时管理冲突会更容易。考虑在块被破坏后必须重新计算1 Body的形状。这将非常费力。

这与我放弃的游戏非常相似。我最初为每个区块都有一个Body,这非常慢:

http://www.jgallant.com/images/uranus/land2.png

我的第一个优化只是在生成的世界的边缘设置Bodies:

http://www.jgallant.com/images/uranus/chunk.png

这导致了更快的代码,但是屏幕上有太多的主体仍然存在问题。我后来的优化根据玩家在世界上的位置将Bodies添加到了边缘。从可用物体池中取出尸体,并移动到适当的位置。机体从未被销毁,只是在不使用时移动到Vector2(Int.Min,Int.Min)。当他们需要使用时,他们被移到了位置:

http://www.jgallant.com/images/collision2.jpg

这提供了三种方法中最快的代码。如果你想在飞行中摧毁/创造身体,这是一个非常糟糕的主意。最好将可用实体存储在池中,然后重新使用它们。

这也有一些复杂性。我目前没有方便的代码,但如果您有其他问题,我可以发布一些代码来帮助您。