我使用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疯狂非常适合。
由于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];
}
答案 0 :(得分:1)
有三件事情发生了:
对于#2,创建一个只有CGPoint属性的点类,并使用它来存储数组中的点。删除字符串转换或打包到NSData。
对于#3,请确保仅在新点与前一点相距至少n个点时才添加新点。例如,距离10应该减少点数,同时仍然允许相对精细的线细节。
同样关于#3,我注意到你在数组中添加当前和之前的点。为什么?您只需要添加新点,然后从索引0到1,从1到2绘制点,依此类推。您只需要测试只有1点的情况。上一个触摸事件的位置始终是下一个触摸事件的previousLocation。因此,您需要存储两倍的点数。