0

EDIT2:为了响应下面的答案,我确实创建了一个不同的 GameScene 来测试由 CCShaky3D 效果动画的 4 个精灵的帧率性能。这个问题仍然存在,因为 fps 仍然在 ~15fps 左右。为了方便阅读,我把代码贴在这个问题的最后。我的假设是因为我同时运行多个 CCShaky3D。是否有人能够同时运行多个 CCShaky3D 效果而不会降低帧率?

我在我的游戏中引入了来自 cocos2d 的效果(cocos2d 编程指南),并注意到 FPS 显着变慢。一旦我应用效果的精灵出现,从 60fps 到 ~10fps。

我一开始在我的游戏中引入了它们并且遇到了黑色背景问题(如 post so post)。我按照解决方案解决了问题。

我在调试器中注意到,一旦我应用动画的第四个精灵出现,应用程序就会收到内存警告。一旦我应用效果的第二个精灵变得可见,帧速率就会下降。在场景中,我同时在屏幕上还有其他 2-3 个敌人精灵加上玩家精灵,我想这可能是内存问题。然后我尝试只添加一个带有动画的精灵,剩下的 2-3 个敌人精灵仍然存在,并且帧速率“仅”下降到 ~45 fps。

编辑:当我不对这些精灵应用效果时,帧速率不会改变(保持~60fps)。

我想这是由于我如何管理我的记忆,但在大幅更改代码之前,我想就此收集一些意见。您是否设法使用例如运行场景。2-3 个具有效果的精灵和 4-5 个其他精灵(例如敌人和玩家)四处移动?

正确初始化 EAGLView:

为了让效果运行,我必须修改EAGLView初始化,我将其发布在这里,因为我认为可能会受到影响。我对 UIViewController 和 EAGLView 初始化非常不熟悉,我想知道我是否做错了什么以及这是否会影响帧速率。

我修改了Learn iPhone and iPad cocos2d 第 8 章源代码中的 ShootEmUp 示例,并注意到示例的 AppDelegate 中没有 RootViewController实例。相反,在Coco2d Cookbook中,在 AppDelegate 以及我使用 Cocos2d 创建的任何模板中都使用了 RootViewController。在我的代码中,我修改了 CC_DIRECTOR_INIT() 宏,按照帖子2中的建议添加了 EAGLView 的初始化。

我找到了这个cocos2d 官方指南,它说不需要在 cocos2d 应用程序中创建 UIViewController,这证实了 ShootEmUp 示例(3)中的方法。由于我仍然不熟悉 CCDirector、EAGLView 和 UIViewController 的角色,我想请社区澄清它们如何相互交互,以及它们的初始化是否会影响帧速率。非常感谢。

编辑 2 - 我用于测试 CCShaky3D 效果对 fps 性能速率的影响的源代码:

// Element.h
#import <Foundation/Foundation.h>
#import "cocos2d.h"

@interface Element : CCSprite {

}
+(id) elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:(enum ElementsType)type:  (int)time  :(NSString*)frameName :(CGPoint) spawnPosition;
@end


//Implementation of elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos method.. 
+(id) elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:(enum ElementsType)type:  (int)time  :(NSString*)frameName :(CGPoint) spawnPosition;
{
    return [[[self alloc] initWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:type :time :frameName :spawnPosition] autorelease];
}

//TestLayer.h
#import <Foundation/Foundation.h>
#import "cocos2d.h"
@interface TestLayer : CCLayer {

}
+(CCScene *) scene;
@end


//TestLayer.m

#import "TestLayer.h"
#import "Element.h"

@implementation TestLayer


+(CCScene *) scene
{
    // 'scene' is an autorelease object.
    CCScene *scene = [CCScene node];

    // 'layer' is an autorelease object.
    TestLayer *layer = [TestLayer node];

    // add layer as a child to scene
    [scene addChild: layer];

    // return the scene
    return scene;
}

/ on "init" you need to initialize your instance
-(id) init
{
    // always call "super" init
    // Apple recommends to re-assign "self" with the "super" return value
    if( (self=[super init])) {
        CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
        [frameCache addSpriteFramesWithFile:@"game-art-hd.plist"];

        // ask director the the window size
        CGSize size = [[CCDirector sharedDirector] winSize];

        CCSprite *background = [CCSprite spriteWithFile:@"bg1.png"];
        background.anchorPoint = CGPointMake(0.5f, 0);
        background.position = CGPointMake(size.width/2, 0);
        [self addChild:background];

        Element * element = [Element elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:HEARTH :3 :@"star-anim1.png" :CGPointMake(100.0f, 20.0f)];
        element.visible=TRUE;
        id shaky = [CCShaky3D actionWithRange:4 shakeZ:NO grid:ccg(15,10) duration:5];
        [element runAction:shaky ];
        [self addChild:element ];

        element = [Element elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:HEARTH :3 :@"star-anim1.png" :CGPointMake(140.0f, 20.0f)];
        id shaky2 = [CCShaky3D actionWithRange:4 shakeZ:NO grid:ccg(15,10) duration:5];

        element.visible=TRUE;
        [element runAction:shaky2 ];
        [self addChild:element ];

        element = [Element elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:HEARTH :3 :@"star-anim1.png" :CGPointMake(240.0f, 20.0f)];
        element.visible=TRUE;
        id shaky3 = [CCShaky3D actionWithRange:4 shakeZ:NO grid:ccg(15,10) duration:5];

        [element runAction:shaky3 ];
        [self addChild:element ];


        element = [Element elementWithTypeAndSpawnTimeAndFrameNameAndSpawnPos:HEARTH :3 :@"star-anim1.png" :CGPointMake(340.0f, 20.0f)];
        element.visible=TRUE;
        id shaky4 = [CCShaky3D actionWithRange:4 shakeZ:NO grid:ccg(15,10) duration:5];

        [element runAction:shaky4 ];
        [self addChild:element ];

    }
    return self;
}
4

2 回答 2

1

在真实设备上运行时,您获得了多少 FPS?您应该知道,与真实设备相比,模拟器在很多方面表现不佳。我目前在打斗场景中运行一个包含 16 个以上动画精灵的应用程序,在设备上以非常不错的帧速率......但在模拟器上低于 10 FPS。是的,请注意那个内存警告。您可能有没有在某处正确释放的精灵。为了确认这一点,您应该在代码中的适当位置添加此行:

    [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
    [[CCDirector sharedDirector] purgeCachedData];
    [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];

并验证纹理缓存中的内容是否符合您的预期。如果没有,请追踪“惊喜”纹理并确保它们被正确移除。

于 2012-05-16T12:12:28.810 回答
1

我不确定是不是同样的问题,但是在运行 CCShaky3D 动作之后,我的帧速率从 60-50fps 下降到 30-20fps。

我刚刚设法用 CCShaky3D 和 CCStopGrid 创建了一个动作序列来解决它。最后一个负责恢复帧率。

于 2013-01-24T09:20:14.763 回答