首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cocos2d效果以绘图方式降低FPS的速度,以及如何正确初始化EAGLView

Cocos2d效果以绘图方式降低FPS的速度,以及如何正确初始化EAGLView
EN

Stack Overflow用户
提问于 2012-05-16 11:05:17
回答 2查看 862关注 0票数 0

EDIT2:作为对下面答案的回应,我创建了一个不同的GameScene来测试框架的性能,其中有4个由CCShaky3D效应驱动的精灵。这个问题仍然存在,因为fps仍然在15 fps左右。我把代码粘贴在这个问题的末尾,以便于阅读。我的假设是,这是因为我同时运行多个CCShaky3D。是否有人能够在不降低帧率的情况下同时运行多个CCShaky3D效果?

在我的游戏中,我引入了来自(cocos2d编程指南)的效果,并注意到FPS戏剧性地慢下来了。当我应用这个效果的精灵出现时,从60 From到10 From。。

我一开始就在我的游戏中介绍了他们,并遇到了黑背景问题(如在所以贴后)。我遵循解决方案,问题就解决了。

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

编辑:当我不对那些精灵应用效果时,帧速率不会改变(停留到60 don).

我想这是由于我如何管理我的内存,但在戏剧性地更改代码之前,我想收集一些关于这方面的意见。你能用eg拍一场戏吗?2-3个具有效果的精灵和4-5个其他精灵(如敌人和玩家)四处走动?

正确初始化EAGLView:

为了获得运行的效果,我不得不修改EAGLView初始化,我在这里发布了它,因为我认为它可能会被重新计算。我对UIViewController和EAGLView初始化非常陌生,我想知道我是否做错了什么,这是否会影响框架。

我从学习iPhone和iPad cocos2d第8章源代码中修改了学习iPhone和iPad cocos2d第8章源代码示例,并注意到在示例的AppDelegate中没有RootViewController实例。相反,在Coco2d食谱中,RootViewController用于AppDelegate以及我使用Cocos2d创建的任何模板中。在我的代码中,我修改了CC_DIRECTOR_INIT()宏,按照post 2中的建议添加了EAGLView的初始化。

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

编辑2-我用来测试CCShaky3D效应对fps性能的影响的源代码:

代码语言:javascript
复制
// 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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-16 12:12:28

在一个真正的设备上运行时,你获得了什么FPS?您应该知道,与实际设备相比,模拟器的性能有重要的影响因素。目前,我在一个战斗场景中运行了一个16+动画精灵应用程序,在设备上以非常好的帧速率.但在模拟器上低于10 FPS。是的,注意那个记忆警告。你可能有一些精灵,它们在某个地方得不到适当的分配。为了确认这一点,您应该在代码中的适当位置添加这一行:

代码语言:javascript
复制
    [[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
    [[CCDirector sharedDirector] purgeCachedData];
    [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];

并验证您在纹理缓存中拥有的内容是否与您期望的内容相对应。如果它没有,追逐‘惊喜’纹理,并确保他们被适当地移除。

票数 1
EN

Stack Overflow用户

发布于 2013-01-24 09:20:14

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

我刚刚解决了这个问题,用CCShaky3D和CCStopGrid创建了一个动作序列。最后是负责帧速率的恢复。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10617219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档