Cocos2d ccDrawLine性能问题

时间:2012-11-26 17:41:31

标签: ios performance cocos2d-iphone drawing

我使用cocos2d 2.0和Xcode 4.5。我正在努力学习画线。我可以绘制一条线但是在我画了几行后,模拟器上出现了严重的性能问题。

模拟器开始冻结,绘制线非常慢,最糟糕的是,我猜因为-(void)draw每帧被调用,屏幕上的标签变为粗体

行之前:

enter image description here

行后

;

enter image description here

我使用以下代码: .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疯狂非常适合。

由于CCDrawLine/UITouch *touch是否会出现此性能问题,或者这是一个常见问题? 什么飞行控制,ATC狂热可能用于画线?

提前致谢。

EDIT ::::

好吧我猜问题不是ccDrawLine,问题是每次触摸结束时都调用ManageTraffic *line = [ManageTraffic node];调用节点init以便它覆盖场景

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

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

1 个答案:

答案 0 :(得分:1)

有三件事情发生了:

  1. 您评估模拟器上的性能。如Ben所说,在设备上进行测试。
  2. 您将点存储为字符串并将字符串转换回CGPoint。这非常低效。
  3. ccDrawLine效率不高。对于几十个线段,没关系。在你的情况下可能没有(见下文)。
  4. 对于#2,创建一个只有CGPoint属性的点类,并使用它来存储数组中的点。删除字符串转换或打包到NSData。

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

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