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];
}

我看过一些空中交通管制游戏,例如飞行控制,ATC Mania效果非常好。

出现此性能问题是因为CCDrawLine/UITouch *touch还是常见问题?什么飞行控制,ATC Mania可能用于画线?

提前致谢。

编辑::::

好的我猜问题不是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

发生了三件事:

  1. 您在模拟器上评估性能。正如 Ben 所说,在设备上进行测试。
  2. 您将点存储为字符串并将字符串转换回 CGPoint。这是非常低效的。
  3. ccDrawLine 并不完全有效。对于几十个线段,没关系。在你的情况下可能不是(见下文)。

对于#2,创建一个只有 CGPoint 属性的点类,并使用它来将点存储在数组中。删除字符串转换或打包到 NSData。

对于#3,请确保仅当新点距前一个点至少 n 点时才添加新点。例如,10 的距离应该减少点的数量,同时仍然允许相对精细的线条细节。

同样关于#3,我注意到您将当前点和上一个点都添加到数组中。为什么?您只需添加新点,然后从索引 0 到 1、从 1 到 2 等绘制点。您只需要测试只有 1 分的情况。上一个触摸事件的位置始终是下一个触摸事件的previousLocation。因此,您存储的点数是您需要的两倍。

于 2012-11-27T13:04:59.007 回答