我开始制作一个简单的2D游戏而不是使用C ++和SFML库在LAN上运行。游戏使用每帧的典型更新功能及其循环来改变对象的状态。游戏类存储一个玩家和怪物的矢量/列表和两个地图(一个用于图块集 - 只有图形,第二个用于控制地形力学 - 墙壁,地面等)。
在循环中,我在每个怪物上调用Think()
函数(它会移动/跳跃/攻击等)(不同的怪物表现不同但所有都是从抽象类Monster
继承的,并且具有适当的覆盖)。
问题是:
我很害怕这个游戏会有多少循环/嵌套循环。
我已经看到一些游戏实现了基于小实例的地图世界,所以循环总是通过少量数据,因为每个地图都是分开的,所以很容易找到任何东西/向玩家发送更新。
我可以轻松地将这种方法应用到每个楼层,但是地板0仍然非常大(阵列大约5000x5000个瓷砖可以走路)。
我现在正在考虑将世界地图数组更改为通过其坐标存储对每个对象的引用的类。我想出了一个想法,即通过它们的坐标对物体进行分类可以提高环路的性能,甚至可以替换它们。
这是正确的设计吗?或者确实存在更好的想法?
答案 0 :(得分:1)
你不应该担心很多循环。一旦遇到问题,您可以随时进行优化。
然而,对于碰撞,您应该避免检查每个对象与其他对象,因为这将需要n ^ 2个检查。但是,这仅适用于您遇到性能问题的情况。如果发生这种情况,默认方法是使用网格,每帧(或更少)更新一次,以计算每个对象在网格中的位置。这意味着您的每个单元格都将知道其中的所有对象。 然后,如果要查找单个对象的碰撞,只需检查它,同一单元格和相邻单元格中的对象。
如果您有大量对象,您可以考虑动态调整网格,例如可以通过四叉树实现。但在大多数情况下,一个简单的静态定义网格就足够了。