0

cocos2d 2.0 と Xcode 4.5 を使用しています。線の引き方を勉強中です。線を引くことはできますが、いくつかの線を引いた後、シミュレーターで重大なパフォーマンスの問題が発生します。

シミュレーターがフリーズし始め、線の描画が非常に遅くなり、最悪の場合、-(void)drawフレームごとに呼び出されるため、画面上のラベルが太字になると思います

行の前:

ここに画像の説明を入力

行の後;

ここに画像の説明を入力

次のコードを使用します:.m

-(id) init
{
    if( (self=[super init])) {


        CCLabelTTF *label = [CCLabelTTF labelWithString:@"Simple Line Demo" fontName:@"Marker Felt" fontSize:32];
        label.position =  ccp( 240, 300 );
        [self addChild: label];

        _naughtytoucharray =[[NSMutableArray alloc ] init];

         self.isTouchEnabled = YES;


    }
    return self;
}

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    BOOL isTouching;
    // determine if it's a touch you want, then return the result
    return isTouching;
}


-(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event  {
    UITouch *touch = [ touches anyObject];
    CGPoint new_location = [touch locationInView: [touch view]];
    new_location = [[CCDirector sharedDirector] convertToGL:new_location];

    CGPoint oldTouchLocation = [touch previousLocationInView:touch.view];
    oldTouchLocation = [[CCDirector sharedDirector] convertToGL:oldTouchLocation];
    oldTouchLocation = [self convertToNodeSpace:oldTouchLocation];
    // add my touches to the naughty touch array
    [_naughtytoucharray addObject:NSStringFromCGPoint(new_location)];
    [_naughtytoucharray addObject:NSStringFromCGPoint(oldTouchLocation)];
}
-(void)draw
{
    [super draw];
    ccDrawColor4F(1.0f, 0.0f, 0.0f, 100.0f);
    for(int i = 0; i < [_naughtytoucharray count]; i+=2)
    {
        CGPoint start = CGPointFromString([_naughtytoucharray objectAtIndex:i]);
        CGPoint end = CGPointFromString([_naughtytoucharray objectAtIndex:i+1]);
        ccDrawLine(start, end);

    }
}
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    ManageTraffic *line = [ManageTraffic node];
    [self addChild: line z:99 tag:999];
}

Flight Controlなどの Air Traffic Control ゲームはほとんど見たことがありませんが、ATC Maniaは非常にうまく機能します。

このパフォーマンスの問題CCDrawLine/UITouch *touchは、一般的な問題が原因で発生しますか? ATC Maniaが線画に使用しているかもしれないFlight Control は何ですか?

前もって感謝します。

編集::::

OK問題はccDrawLineではないと思います。問題は、ManageTraffic *line = [ManageTraffic node];タッチが終了するたびinitにノードを呼び出すため、シーンをオーバーライドすることです

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    ManageTraffic *line = [ManageTraffic node];
    [self addChild: line z:99 tag:999];
}
4

1 に答える 1

1

次の 3 つのことが行われています。

  1. シミュレーターでパフォーマンスを評価します。ベンが言うように、デバイスでテストします。
  2. ポイントを文字列として保存し、文字列を CGPoint に変換します。それはひどく非効率的です。
  3. ccDrawLine は正確には効率的ではありません。数十の線分については問題ありません。あなたの場合、そうではないかもしれません(以下を参照)。

#2 では、CGPoint プロパティのみを持つポイント クラスを作成し、それを使用してポイントを配列に格納します。NSData への文字列変換またはパッキングを削除します。

#3 では、新しいポイントが前のポイントから少なくとも n ポイント離れている場合にのみ、新しいポイントが追加されるようにします。たとえば、距離を 10 にすると、比較的細かい線の詳細を可能にしながら、ポイントの数を減らす必要があります。

#3 についても、配列に現在のポイントと前のポイントの両方を追加していることに気付きました。なんで?新しいポイントを追加するだけで、インデックス 0 から 1、1 から 2 などのようにポイントを描画できます。点が 1 つしかない場合のみテストする必要があります。前のタッチ イベントの位置は、常に次のタッチ イベントの previousLocation です。したがって、必要なポイントの 2 倍を保存することになります。

于 2012-11-27T13:04:59.007 に答える