2012-10-10 73 views
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]; 
} 
} 

什麼代碼的作用是它消除了由側或上具有相同的圖像「塊」的頂部有一個「壁」或「塊」,並且也側的UIImageViews。換句話說刪除的圖像,如果他們是感人,具有相同的形象,如果他們仍然(低於塊)

+0

你分析代碼? –

+0

分析是做什麼的? – Jason

+0

http://en.wikipedia.org/wiki/Profiling_%28computer_programming%29 –

回答

1

這OBJ-C,有一個運行時代碼誰的作品超越你的代碼(不喜歡c或C++)。每次將消息傳遞給objet時,都會在後臺進行大量的函數調用檢查。

通過你在一個循環中的NSMutableArray每次調用是創作的方式,至極真的很耗時。

如果你想有一個非常快的發動機,例如使用了cocos2d lib中。

1
  1. 使用更有意義的變量名,他們已經免費。
  2. 個人資料,個人資料,個人資料。
  3. 提前便宜的測試,例如昂貴的測試。在你第一次如果您檢查矩形點你檢查B之前!= B1
  4. 在最外面的測試可能,做測試例如,在你內心的測試,你通過測試b啓動!= B2。你爲每個b3做這個。這不會是一個巨大的勝利,但它是免費的。

  5. 不要擔心NSMutableArray的分配問題,它在外部循環,所以不是一個因素,當你添加一個新的值時會擔心數組內部存儲的重新分配,這種情況發生在內層。通過首先分配一個足夠大的NSMutableArray來解決這個問題。 [NSMutableArray arrayWithCapacity:_blocks.count];

  6. 我懷疑你要添加塊到刪除陣列多次,因爲它們可能會重疊其他多個塊,爲什麼不使用可變集來代替。如果多次添加塊,即使正確調整了可變陣列大小,也可能會獲得可變數組存儲分配。 6個人多一些:)
+0

所有添加更多一些到列表戈登已經開始: 7.移動循環不變走出循環(表達式循環,其價值不會改變內)。例如。你有三次調用'CGPointMake'的內部循環,所有這些都會移出1或2個循環。 8.如果在嘗試了所有簡單的東西之後,算法仍然太慢,請更改算法。在這種情況下,以某種方式排列/排列這些塊,以便更快地在一定距離內發現鄰居可能值得研究。 – CRD

相關問題