0

在我尝试在没有物理引擎的情况下制作游戏时,我的 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];
}
}

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

4

2 回答 2

1
  1. 使用更有意义的变量名,它们是免费的。
  2. 简介,简介,简介。
  3. 将便宜的测试移到昂贵的测试之前,例如,在您的第一个 if 中,您在检查 b != b1 之前检查 rect 中的点
  4. 尽可能在最外层的测试中进行测试,例如,在最内层的测试中,您从测试 b!= b2 开始。您为每个 b3 执行此操作。这不会是一个很大的胜利,但它是免费的。

  5. 不要担心 NSMutableArray 分配,它位于外部循环中,所以不是一个因素,当您添加一个新值时,担心数组内部存储的重新分配,这发生在内部级别。通过首先分配一个足够大的 NSMutableArray 来解决这个问题。[NSMutableArray arrayWithCapacity:_blocks.count];

  6. 我怀疑您多次向删除数组添加块,因为它们可能与多个其他块重叠,为什么不使用可变集。如果您多次添加块,即使您正确调整了可变数组的大小,您也可能会获得可变数组存储分配。6个人资料更多:)
于 2012-10-10T08:55:21.947 回答
1

这是 obj-c,有一个运行时代码可以在您的代码之外工作(不像 c 或 c++)。每次向对象传递消息时,都会在后台进行大量函数调用检查。

顺便说一句,您每次调用都在循环中创建一个 NSMutableArray,这真的很耗时。

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

于 2012-10-10T07:56:15.193 回答