Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 有人能帮我改进我的代码,让它工作得更快吗?_Objective C_Ios_Xcode_Performance_Game Physics - Fatal编程技术网

Objective c 有人能帮我改进我的代码,让它工作得更快吗?

Objective c 有人能帮我改进我的代码,让它工作得更快吗?,objective-c,ios,xcode,performance,game-physics,Objective C,Ios,Xcode,Performance,Game Physics,在我尝试制作一款没有物理引擎的游戏时,我的iPod4G运行代码的速度非常慢。代码可以工作,但速度非常慢。我想知道是否有人能帮我让它跑得更快 -(void)Loop { NSMutableArray *_remove = [NSMutableArray array]; for (UIImageView *b in _blocks) { int i = 0; for (UIImageView *b2 in _blocks) { if (!CGRectContainsP

在我尝试制作一款没有物理引擎的游戏时,我的iPod4G运行代码的速度非常慢。代码可以工作,但速度非常慢。我想知道是否有人能帮我让它跑得更快

-(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,并且这些视图也并排或位于具有相同图像的“块”的顶部。换言之,删除那些在触摸时具有相同图像的图像,如果它们仍然存在(下面有一个块)

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

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

如果您想要一个速度非常快的引擎,可以使用cocos2dlib

  • 使用更有意义的变量名,它们是免费的
  • 轮廓,轮廓,轮廓
  • 将便宜的测试移到昂贵的测试之前,例如,在第一个if中,在检查b之前先检查rect中的点!=b1
  • 是否尽可能在最外层测试中进行测试,例如,在最内层测试中,从测试b开始b2。你每做一次b3。这不会是一场大胜利,但它是免费的

  • 不要担心NSMutableArray分配,它是一个外部循环,因此不是一个因素,当您添加一个新值时,需要担心数组内部存储的重新分配,这发生在内部级别。首先分配一个足够大的NSMutableArray来解决这个问题。[NSMutableArray阵列容量:_blocks.count]

  • 我怀疑您多次向remove数组添加块,因为它们可能会重叠多个其他块,为什么不使用可变集来代替呢。如果要多次添加块,则可能会得到可变阵列存储分配,即使您已正确调整可变阵列的大小。 6个人资料更多:)

  • 我分析了它,记忆也很好。问题在于cpu的使用。上面的循环占用了它所能占用的所有cpu。使用时间分析器,它会准确地向您显示它正在减速的位置—调用的频率是多少?如果它只是一个无限循环,那么无论一个迭代执行的速度有多快,它都将占据100%。将循环不变量(值不变的循环中的表达式)移出循环。例如,您有三个对
    CGPointMake
    内部循环的调用,所有这些调用都会移出1或2个循环。8.如果在尝试了所有简单的东西后,算法仍然太慢,请更改算法。在这种情况下,以某种方式对块进行排序/排列,以便更快地发现一定距离内的邻居可能值得研究。