1

我使用 Cocos2D 编写了一个简单的游戏,其中我有一个动画精灵在纯绿色的田野中行走。

行走精灵为 64x64px,操纵杆来自 Sneakyjoystick 类,绿色区域由 5-6 个 32x32 像素组成,使用 Tiled 制作成 tilemap。使用 Tiled,我创建了一个 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;
}
4

1 回答 1

7

我在模拟器上测试。

我不敢相信我需要多久重复一次:

忽略模拟器!

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

即使是最快的 2012 iMac 也无法在 iPad 或 iPhone Retina Simulator 上以 60 fps 运行场景。在 iPad Retina Simulator 上,你会很幸运地获得 20 fps。

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

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

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

于 2013-03-09T23:33:10.080 回答