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性能的影响的源代码:
// 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;
}发布于 2012-05-16 12:12:28
在一个真正的设备上运行时,你获得了什么FPS?您应该知道,与实际设备相比,模拟器的性能有重要的影响因素。目前,我在一个战斗场景中运行了一个16+动画精灵应用程序,在设备上以非常好的帧速率.但在模拟器上低于10 FPS。是的,注意那个记忆警告。你可能有一些精灵,它们在某个地方得不到适当的分配。为了确认这一点,您应该在代码中的适当位置添加这一行:
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];
[[CCDirector sharedDirector] purgeCachedData];
[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];并验证您在纹理缓存中拥有的内容是否与您期望的内容相对应。如果它没有,追逐‘惊喜’纹理,并确保他们被适当地移除。
发布于 2013-01-24 09:20:14
我不确定是否是同样的问题,但是在运行CCShaky3D操作之后,我的帧速率从60-50fps下降到30-20fps。
我刚刚解决了这个问题,用CCShaky3D和CCStopGrid创建了一个动作序列。最后是负责帧速率的恢复。
https://stackoverflow.com/questions/10617219
复制相似问题