【发布时间】:2013-12-16 22:24:13
【问题描述】:
我正在制作 XNA 游戏,我想知道是否有办法优化某些循环。例如:
我有一个 Map 类,其中包含一组图块,因此,在 Map Update() 中,我只调用每个图块 Update()
// Update method in Map Class
public void Update()
{
for (int index = 0; index < tiles.Count; index++)
{
tiles[index].Update();
}
}
这很好用,但是对于一些较大的填充对象可能会变得更糟,例如 Particle 类,其中每个粒子都由 ParticleManager 类(包含粒子集合)管理,因此:
// Update method in ParticleManager class
public void Update()
{
for (int index = 0; index < particle.Count; index++)
{
particle[index].Update();
}
}
//Update Method in Particle class
public void Update()
{
for (int index = 0; index < Map.tiles.Count; index++)
{
CheckCollitions(Map.tile[index], this);
}
}
ParticleManager 为每个粒子循环,每个粒子检查每个 Tile 的碰撞。 所以,如果你有 20 个粒子和 100 个 Tiles,它将进行大量计算:
20 loops cycles * 100 loops cycles
这就是为什么我在考虑一些优化,比如循环展开,但是,我不知道它是否适用于未定义长度的循环(我认为不是)(因为编译器在编译时不知道这些循环的长度)
总结一下:
- 是否可以使用循环展开来优化这些循环?
- 您能建议我进行其他类型的优化吗?
谢谢
【问题讨论】:
-
你会从四叉树中受益吗?使用某种过滤器可能可以避免许多此类完整的碰撞检查。
-
google 空间分区和 Magus 提到的四叉树
标签: c# performance optimization monogame loop-unrolling