2011-07-05 14 views
1

これはおそらく、割り当てようとしているオブジェクトの大きさによって決まりますが、私がこのようなやり方をしているかどうかを知りたければ、後で問題に遭遇します。今はすべてがうまく見えます。私はCocos2Dを使用しています。私は割り当てとforループ内のすべてのforループcheckDistanceの割り当てを解除していますかObjective Cでの割り当てと割り当て解除の速さはどれくらいですか?

-(void) checkCGPointDistances{ 

    CCSprite *tempSp; 

    CCLabelTTF *tempLabel; 

    for(int i=0; i<hummingBirdsMax; ++i){ 

     tempSp = [hummingBirds objectAtIndex:i]; 

     checkDistance = [[CheckDistance alloc] init]; 

     if([checkDistance checkDistanceWithLimit:tempSp.position withPoint2:hero.heroSprite.position withLimit:150] == YES){ 

      if(hero.heroSprite.position.x > tempSp.position.x){ 
       tempSp.flipX = YES; 
      }else{ 
       tempSp.flipX = NO; 
      } 

      tempLabel = [hummingLabels.labelsArr objectAtIndex:i]; 


      [tempLabel setString:@"Hello!"]; 

      [hummingLabels.deactivateLabelToggle replaceObjectAtIndex:i withObject:[NSNumber numberWithInt:1]]; 
     } 

     [checkDistance release]; 

    } 

    if(abilityRushH == 0){ 
     checkDistance = [[CheckDistance alloc] init]; 

     if([checkDistance checkDistanceWithLimit:rushH.rushHSprite.position withPoint2:hero.heroSprite.position withLimit:32] == YES){ 
      [rushH.rushHSprite removeFromParentAndCleanup:NO]; 

      abilityRushH = 1; 
      NSLog(@"horizontal rush activated"); 
     } 

     [checkDistance release]; 
    } 

    if(abilityRushV == 0){ 
     checkDistance = [[CheckDistance alloc] init]; 

     if([checkDistance checkDistanceWithLimit:rushV.rushVSprite.position withPoint2:hero.heroSprite.position withLimit:32] == YES){ 
      [rushV.rushVSprite removeFromParentAndCleanup:NO]; 

      abilityRushV = 1; 
      NSLog(@"vertical rush activated"); 
     } 

     [checkDistance release]; 
    } 
} 

お知らせ:

は、例えば、この方法を取りますか?このメソッドは非常に迅速にタイマーで呼び出されています。私がループの中に何度も何度も割り当てをすることを決めたのは、hummingBirdsMaxの数が0になる可能性があるからです。割り当てを一切する必要がないからです。私はちょうどhummingBirdsMax> 0かどうかを調べることができると思うが、それは私がそれを行う方法が大きな違いを生むのだろうか?

割り当てるクラスは、CGPointとの間の距離をチェックしてboolを返します。

+0

あなたは 'CheckDistance'の実装を投稿できますか?特に 'init'メソッドは? – Yuji

答えて

3

何をしているのか本質的に間違っていることはありません。プロファイラ(SharkまたはInstruments)で何らかの作業をせずに、オブジェクトの割り当てや割り当て解除がコード内のパフォーマンスのボトルネックであるかどうかを判断する方法はありません。すべてのパフォーマンス最適化の決定と同様に、データなしで推測する理由もありません。

つまり、すべてのCheckDistanceクラスが計算を実行する場合、それは実際にはオブジェクトではありません(つまり、状態をカプセル化して動作を公開します)。 C関数として計算を実装するだけではどうですか?多くの人々が現在慣れ親しんでいる管理Java/C#の世界とは異なり、すべてがクラスでなければならないわけではありません。

+0

バリーに感謝します。それがクラス外の通常のC関数であれば、別のクラスに入れる必要はありませんか?私が別のクラスの中に入れたメソッドの中には、そうするのに十分な大きさがあるものもあれば、あるクラスにあまりにも多くのコードを持っているものもあります。 – VagueExplanation

+0

@ VagueExplanationでは、コードは*任意の*クラスにある必要はありません。ヘッダファイルに関数を宣言して他のコードで呼び出せるようにする必要がありますが、定義を '.m'ファイルに入れることができます。 CoreFoundation API(と他の多くのOS X/iOS API)はCの関数であることに注意してください。 –

+0

これは素晴らしいですが、定義が別の.mファイルにある場合、メソッドを呼び出す方法はありますか?今私はhero.vel = [velocity getVel:hero.heroSprite.position withEndPoint:heroControl.moveEndLoc withSpeed:hero.speed]のようなことをします。 – VagueExplanation

関連する問題