首页 > 代码库 > cocos2d-x ios游戏开发初认识(六) 渲染的优化

cocos2d-x ios游戏开发初认识(六) 渲染的优化

做程序开发肯定要考虑到内存的优化,毕竟iphone本身的内存就不是很大,这一节主要说这个cocos2d开发对内存的优化,具体表现在,既可以对相同的精灵(图片)只渲染一次,也可以对不能的精灵只渲染一次。

下面是程序的做法,先屏蔽前面的代码。

先简单介绍一下 CCSpriteBatchNode类,它是用来优化游戏渲染效率的,CCSpriteBatchNode 中的所有CCSprite只会被渲染1次,因此可以提高游戏的FPS。限制:加入到CCSpriteBatchNode 中的CCSprite必须使用同一张纹理图。

具体代码

    CCSpriteBatchNode *node =CCSpriteBatchNode::create("Peashooter1.tiff");//先渲染文件

   this->addChild(node);

   CCSprite *plant = CCSprite::create("Peashooter1.tiff"); //创建精灵

    plant->setPosition(ccp(300,300));

    node->addChild(plant);                                  //添加到 node

运行:


可以看到 添加一个精灵 此时的FPS为1。下面再添加一个文件相同精灵:

    CCSpriteBatchNode *node =CCSpriteBatchNode::create("Peashooter1.tiff");//先渲染文件

    this->addChild(node);

    CCSprite *plant = CCSprite::create("Peashooter1.tiff"); //创建精灵

    plant->setPosition(ccp(300,300));

    node->addChild(plant);                                  //添加到 node

    

    //再创建一个精灵

    CCSprite *plant1 = CCSprite::create("Peashooter1.tiff"); //创建精灵

    plant1->setPosition(ccp(400,400));

    node->addChild(plant1);

    return true;

运行:


可以看到两个精灵都被创建出来了,但是FPS还是为1,这就是CCSpriteBatchNode的作用,它保证添加到类里面所有相同文件的精灵只被渲染一次。


既然相同的精灵可以只渲染,那么不同的文件的精灵可不可以只被渲染一次,答案是可以的,看下面的做法。

这时要用到第(五)篇文章讲的内容,具体做法是我们可以先把很多种不同的图片合成一张大图,然后将这张大图添加到CCSpriteBatchNode中,这时渲染大图里面的小图都会只被渲染一次,看具体程序做法:

    ///*如果想让不同图片只渲染一次得要用到帧缓存机制渲染多个不同的图片 */

    CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("Person.plist"); //先缓存大图

    CCSpriteBatchNode *node1 =CCSpriteBatchNode::create("Person.png");//渲染到一个大图片

   this->addChild(node1);

    

    CCSpriteFrame *frame =CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(".png");

   CCSprite *plant3 =CCSprite::createWithSpriteFrame(frame);

    plant3->setPosition(ccp(200,200));

    node1->addChild(plant3);

    

    CCSpriteFrame *frame1 =CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(".png");

   CCSprite *plant4 =CCSprite::createWithSpriteFrame(frame1);

    plant4->setPosition(ccp(500,500));

    node1->addChild(plant4);

这个大图 所有小图片的名字:


运行:


我们可以看到又增加了两张图片,而且这两张图片不是一样的,但是FPS还是为2只加了1,表示新增加的两个精灵只被渲染了一次,现在我们发现帧缓存机制 是非常强大的,在游戏开发中经常用到。