2013-03-09 38 views
1

我用Cocos2D编写了一个简单的游戏,在这里我有一个在简单的绿色领域中散步的动画精灵。Cocos2D - 为什么我的FPS如此之低?带地图的单场景

行走精灵是64x64px,游戏杆来自Sneakyjoystick类,绿色字段由5-6个32x32像素组成,使用Tiled制作成tilemap。使用平铺,我创建了一个50 x 50的瓷砖地图。

我得到20-30 FPS,我不知道为什么。我将地图尺寸减小到10x10个瓦片,并且达到50-60 FPS。我不知道该怎么办?

编辑:我已经添加了游戏层的初始化块。我正在模拟器上测试。

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

     self.tileMap = [CCTMXTiledMap tiledMapWithTMXFile:@"TileMap.tmx"]; 
     self.background = [_tileMap layerNamed:@"Background"]; 
     self.meta = [_tileMap layerNamed:@"Meta"]; 
     self.topLayer = [_tileMap layerNamed:@"TopLayer"]; 

     _topLayer.visible = YES; 
     _background.visible = YES; 
     _meta.visible = YES; 

     [self addChild:_tileMap z:-1]; 

     [[CCSpriteFrameCache sharedSpriteFrameCache]addSpriteFramesWithFile:@"male_walkcycle.plist"]; 

     sceneSpriteBatchNode = [CCSpriteBatchNode batchNodeWithFile:@"male_walkcycle.png"]; 
     [self addChild:sceneSpriteBatchNode z:0]; 

     CCTMXObjectGroup *objects = [_tileMap objectGroupNamed:@"Objects"]; 
     NSAssert(objects != nil, @"'Objects' object group not found"); 

     NSMutableDictionary *spawnPoint = [objects objectNamed:@"SpawnPoint"]; 
     NSAssert(spawnPoint != nil, @"SpawnPoint object not found"); 

     int x = [[spawnPoint valueForKey:@"x"] intValue]; 
     int y = [[spawnPoint valueForKey:@"y"] intValue]; 

     Caster *casterPlayer = [[[Caster alloc] init] initWithSpriteFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"male_walkcycle_19.png"]]; 
     casterPlayer.position = ccp(x, y); 
     casterPlayer.joystick = nil; 
     [sceneSpriteBatchNode addChild:casterPlayer z:1000 tag:kCasterTagValue]; 
     [casterPlayer release]; 

     CCSprite *sprite = [CCSprite node]; 
     CGSize size = CGSizeMake(50,50); 
     GLubyte *buffer = malloc(sizeof(GLubyte)*4); 
     for (int i=0;i<4;i++) {buffer[i]=255;} 
     CCTexture2D *tex = [[CCTexture2D alloc] initWithData:buffer pixelFormat:kCCTexture2DPixelFormat_RGB5A1 pixelsWide:1 pixelsHigh:1 contentSize:size]; 
     [sprite setTexture:tex]; 
     [sprite setTextureRect:CGRectMake(0, 0, size.width, size.height)]; 
     free(buffer); 
     sprite.position = ccp(x, y); 
     sprite.visible = NO; 
     [self addChild:sprite z:5 tag:debugBoxTagValue]; 

     [self setViewpointCenter:casterPlayer.position]; 
     [self scheduleUpdate]; 
    } 
    return self; 
} 
+0

你能发表一些你的代码吗?很难说明你的问题是什么。你是否也在模拟器或实际设备上测试了这个? – 2013-03-09 20:17:54

+0

我添加了我的游戏层的init代码。我的其他代码只是一个更新循环,它通过场景spritebatchnote的子节点并运行其更新方法。目前,唯一的更新方法是针对单个精灵,该精灵获取虚拟手柄的速度并更新其位置,然后进行边界检查。 – trianta2 2013-03-09 21:15:00

回答

7

我测试的模拟器。

我不能相信我需要多长时间重复此:

忽略模拟器!

模拟器不是真正的iOS设备。它在你的Mac上运行。它具有更多的内存和CPU功率。同时它的渲染性能受到严重限制,因为它不是硬件加速渲染,而是一种软件渲染器。

即使是最快的2012 iMac也无法在iPad或iPhone Retina模拟器上以60 fps的速度运行场景。在iPad视网膜模拟器上,您将很幸运能够获得20 fps。

此外,开发人员是有史以来在模拟器上运行其应用程序的唯一人员。您的用户,甚至您的测试人员都将使用模拟器来运行您的应用程序。他们将使用实际的设备。

在模拟器上优化性能的任何时间都不过是完全浪费时间。这通常适用于只发生在模拟器上的任何问题。

在设备上测试!仅在iOS模拟器上观察到的每个问题都是没有意义的,无效的,无效的,并且完全不相关的,尤其是性能。