zoukankan      html  css  js  c++  java
  • cocos2d CCSpriteBatchNode提高渲染效率

    本文介绍下CCSpriteBatchNode,以及利用它优化游戏渲染效率。

    在cocos2d-x 2.x 之后,大家都看到了左下角的FPS变成3行,多了两行数据。

    最上面一行是指的当前场景的渲染批次。(简单理解为需要渲染多少个贴图出来)

    中间一行是渲染每一帧需要的时间。

    最下行就是大家熟悉的FPS。

    CCSpriteBatchNode介绍:

    1、先说下渲染批次:这是游戏引擎中一个比较重要的优化指标,指的是一次渲染凋用。也就是说,渲染的次数越少,游戏的运行效率越高。

    2、CCSpriteBatchNode就是cocos2d-x为了降低渲染批次而建立的一个专门管理精灵的类。

    举例介绍:

    1、使用CCSprite创建1000个Icon.png到场景中,这样渲染批次就是1000(暂且不考虑其他的精灵)

    for(int i = 0;i < 1000;++i){
      int x = arc4random()%960;
      int y = arc4random()%640;
      CCSprite* testIcon = CCSprite::create("Icon.png");
      testIcon->setPosition( ccp(x, y) );
       this->addChild(testIcon);
    }

    效果图如下:

    上面的效果图可以看到,创建了1000个Icon到场景中,这是的FPS是22,渲染批次是1000次。

    2、使用CCSpriteBatchNode批量渲染,一次渲染就把所有的CCSprite绘制出来。大大降低渲染批次。

    举例介绍:

    1、使用CCSprite创建1000个Icon.png到场景中,但是这里利用了CCSpriteBatchNode批量渲染。这时的渲染批次、FPS如何呢?

    CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create("Icon.png", 1000);
    batchNode->setPosition(CCPointZero);
    this->addChild(batchNode);
    for(int i = 0;i < 1000;++i)
    { 
      int x = arc4random()%960;   int y = arc4random()%640;   CCSprite* testIcon = CCSprite::createWithTexture(batchNode->getTexture());   testIcon->setPosition( ccp(x, y) );   batchNode->addChild(testIcon);
    }

    效果图如下:

    上面的效果图可以看到,创建了1000个Icon到场景中,这是的FPS是39.9,渲染批次是1次。

    注:

    1、CCSpriteBatchNode::create(const char *fileImage);//利用贴图创建,默认子节点数量29.(数量不够时,系统会自己增加)CCSpriteBatchNode* batchNode = CCSpriteBatchNode::create(const char *fileImage, unsigned int capacity);//利用贴图创建,并指定子节点数量

    2、使用CCSpriteBatchNode时,所使用的贴图必须是同一张图片,也不能指定精灵的深度。所有的精灵都必须在同一渲染层。

    3、但是项目中总不可能局限于一张贴图上,所以你可以把多张贴图合并成一张大贴图(合并的工具很多,我不介绍了)。所以利用合成后的大贴图创建一个CCSpriteBatchNode。然后创建CCSprite的时候,设置贴图的区域就可以了。

  • 相关阅读:
    架构设计:负载均衡层设计方案(4)——LVS原理
    架构设计:负载均衡层设计方案(3)——Nginx进阶
    架构设计:负载均衡层设计方案(2)——Nginx安装
    架构设计:负载均衡层设计方案(1)——负载场景和解决方式
    oracle 触发器number判断空值,:NEW赋值,for each row,sql变量引号,to_date,to_char
    oracle触发器调试
    if elsif;报错;new赋值
    求一行的和
    oracle如何获取当年第一月,如今年是2015年,则需获取 201501
    在其他对象上同步
  • 原文地址:https://www.cnblogs.com/yufenghou/p/3624126.html
Copyright © 2011-2022 走看看