有人可以帮助我改进我的代码,以便它可以更快地工作吗?

时间:2012-10-10 06:03:00

标签: objective-c ios xcode performance game-physics

在我尝试制作没有物理引擎的游戏时,我的iPod 4g运行代码非常慢。代码工作,但它真的很慢。我想知道是否有人可以帮助我让它跑得更快。

-(void)Loop {
NSMutableArray *_remove = [NSMutableArray array];
for (UIImageView *b in _blocks) {
    int i = 0;
    for (UIImageView *b2 in _blocks) {
        if (!CGRectContainsPoint(b2.frame, CGPointMake(b.center.x, b.center.y + b.frame.size.height/2)) && b != b2) {
            i++;
        }
    }
    if (i == [_blocks count] - 1 && b.image != wall) {
        b.center = CGPointMake(b.center.x, b.center.y + 1);
    } else if (b.image != wall) {
        for (UIImageView *b2 in _blocks) {
            for (UIImageView *b3 in _blocks) {
            //Check for collitions
            if (b !=b2 && ((CGRectContainsPoint(b2.frame, CGPointMake(b.center.x + b.frame.size.width/2, b.center.y)) && b.image == b2.image && b.image !=wall && b2.image != wall && CGRectContainsPoint(b3.frame, CGPointMake(b2.center.x, b2.center.y + b2.frame.size.height/2))) || (CGRectContainsPoint(b2.frame, CGPointMake(b.center.x, b.center.y + b.frame.size.height/2)) && b.image == b2.image && b.image !=wall && b2.image != wall) )) {
                    [_remove addObject:b];
                    [_remove addObject:b2];
            }
            }}
    }
}
for (UIImageView *b in _remove) {
    [b removeFromSuperview];
    [_blocks removeObject:b];
}
}

代码的作用是删除具有“墙”或“块”的UIImageViews,并且也是并排或具有相同图像的“块”顶部。换句话说,删除图像,如果它们正在触摸,具有相同的图像,如果它们仍然是(下面有一个块)

2 个答案:

答案 0 :(得分:1)

这是obj-c,有一个超出代码的运行时代码(不像c或c ++)。每次将消息传递给对象时,都会在后台进行大量的函数调用检查。

顺便说一句,你在一个循环中创建一个NSMutableArray,每次调用都非常耗时。

如果你想要一个非常快的引擎,请使用cocos2d lib作为例子..

答案 1 :(得分:1)

  1. 使用更有意义的变量名称,它们是免费的。
  2. 个人资料,个人资料,个人资料。
  3. 在昂贵的测试之前移动廉价测试,例如在你的第一个if中,你在检查b!= b1
  4. 之前检查了一下
  5. 可以在最外层的测试中进行测试,例如,在最里面的测试中,首先测试b!= b2。你为每一个b3​​做到这一点。这不是一场大胜利,但它是免费的。

  6. 不要担心NSMutableArray分配,它处于外部循环,所以不是一个因素,担心在添加新值时在阵列内重新分配存储,这发生在内在的水平。通过首先分配一个足够大的NSMutableArray来解决这个问题。 [NSMutableArray arrayWithCapacity:_blocks.count];

  7. 我怀疑你多次向删除数组添加块,因为它们可能会与多个其他块重叠,为什么不使用可变集。如果您多次添加块,即使您正确调整了可变阵列的大小,也可能会获得可变数组存储分配。 6个人简介:)