2012-11-26 7 views
0

저는 cocos2d 2.0 및 Xcode 4.5를 사용합니다. 나는 선을 그리는 법을 배우려고 노력하고있다. 나는 선을 그릴 수는 있지만 몇 줄을 그린 후에는 Simulator에서 심각한 성능 문제가 발생합니다.Cocos2d ccDrawLine 성능 문제

시뮬레이터, 동결하기 시작 아주 아주 천천히 라인을 그리고 -(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 Mania가 선 그리기에 사용 중일 수 있습니까?

미리 감사드립니다.

편집 :::: 나는 문제가 ccDrawLine없는 것 같다

OK, 문제는 내가이 장면을가는

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

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

시뮬레이터에서 성능을 실제로 판단 할 수 없습니다. 장치에서 테스트해야합니다. –

답변

1

있어 세 가지를 무시 있도록 터치를 종료 할 때마다 노드의 init 호출 ManageTraffic *line = [ManageTraffic node]; 전화입니다 on :

  1. 시뮬레이터 성능을 평가합니다. Ben이 말한대로 장치에서 테스트 해보십시오.
  2. 점을 문자열로 저장하고 문자열을 CGPoint로 다시 변환합니다. 그것은 대단히 비효율적입니다.
  3. ccDrawLine은 정확하지 않습니다. 몇 십여 개의 선분은 괜찮습니다. 귀하의 경우에는 그렇지 않을 수도 있습니다 (아래 참조).

# 2의 경우 CGPoint 속성 만있는 포인트 클래스를 만들고이 포인트를 사용하여 배열에 포인트를 저장합니다. NSData에 문자열 변환 또는 패킹을 제거합니다.

# 3의 경우 새 점이 이전 점에서 적어도 n 점 떨어져 있으면 새 점만 추가해야합니다. 예를 들어 거리가 10이면 점 수를 줄이면서 상대적으로 미세한 선 세부 사항을 허용해야합니다.

# 3과 관련하여 현재 배열과 이전 포인트를 모두 배열에 추가합니다. 왜? 새 점을 추가 한 다음 인덱스 0에서 1, 1에서 2로 점을 그려야합니다. 오직 1 점이있는 경우를 테스트하면됩니다. 이전 터치 이벤트의 위치는 항상 다음 터치 이벤트의 이전 위치입니다. 따라서 필요한만큼 포인트를 두 배 저장하고 있습니다.

+0

CGPoint가 싱글 톤일 필요가 있습니까? –