iphone游戏开发之cocos2d( 十一 )使用CCSpriteBatchNode和纹理图册,提高精灵动画效率;

过冲与振铃仿真:使用Python/SPICE 5步复现传输线反射全过程 本文详细介绍了如何使用Python和SPICE工具进行传输线反射仿真,通过5个步骤复现过冲与振铃现象。文章深入解析了信号完整性中的阻抗匹配问题,并提供了实用的仿真代码和LTspice对比验证方法,帮助工程师优化高速电路设计。 阅读详情

holydancer原创,如需转载,请在显要位置注明:

转自holydancer的优快云专栏,专栏地址:http://blog.youkuaiyun.com/holydancer


之前我们简单地介绍了一下自定义一个精灵,使其在初始化的时候即实现动画,并利用了纹理图册精简代码,今天我们着重介绍一下CCSpriteBatchNode,这是一个相当重要的概念,游戏开发不像应用,大量的动画图片,高速的计算,大量的图形占用,所以我们不得不将图形优化放到一个很高的位置,好在cocos2d在这一块儿上封装得很好,我们只需要了解一下一些类的基本用法,就可以很简单地优化代码;

CCSpriteBatchNode是对绘制精灵进行优化的一个辅助类,看类名我们就可以知道其是一个Node,生成精灵的时候我们需要将其放到层上,如果用CCSpriteBatchNode的话,我们只需要将一个CCspriteBatchNode对象放到该层上,其后将一个一个精灵放到该对象上即可;这样说有些笼统,看一个简单的例子:

有一张png图片"fish.png“,我们需要通过其创建一个精灵添加到层上,那么传统的方式就是:

CCSprite *fishSprite = [CCSprite spriteWithFile:@"fish.png"];

[layer addChild:fishSprite];

如果该层上有10个精灵呢?那就加个for循环,代码上我们感觉效率不低,但在硬件底层,openGL在绘制的时候每次绘制一个精灵,都要有一个准备的过程,形象的说,就像一个画家要画十只鱼,画一只鱼的时候,需要准备调色盘,画笔,画完一只,收起来;画第二只的时候,再准备调色盘,再画,画完再收好;如此十次,画得越多,耽误的越多;这样说的话你就会觉得这个画家有点二,但是传统的绘制精灵还真就是这样,机器不是人,他是不知道自己变通的;所以我们就要用到CCSpriteBatchNode了,上面的代码我们可以这样来改动:

CCSpriteBatchNode *fishBatch = [CCSpriteBatchNode batchNodeWithFile :@"fish.png"];

[layer addChild:fishBatch];

CCSprite *fishSprite = [CCSprite spriteWithFile:@"fish.png"];

[fishBatch addChild:fishSprite];

这样写你可能不觉得有什么优化,但是fishBatch里面添加的精灵越多,其优势就越明显,还是刚才的例子,之前每画一条鱼,都会准备,绘制,收起;现在将精灵添加进fishBatch,就像这个画家知道一次性要画多少条鱼,就不会那么死板的进行一次又一次额外重复的工作了;


如果我们将CCSpriteBatchNode与动画相结合的话,没有关系,假设已生成动画anim;

CCSpriteBatchNode *fishBatch = [CCSpriteBatchNode batchNodeWithFile :@"fish.png"];

[layer addChild:fishBatch];

CCSprite *fishSprite = [CCSprite spriteWithFile:@"fish.png"];

[fishSprite runAction: anim];

[fishBatch addChild:fishSprite];

下面我们来看一个将CCSpriteBatchNode,纹理图册,自定义精灵类(默认初始化运行动作),CCSpriteFrameCache结合起来的例子:

自定义精灵类fishSprite.h:

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

@interface fishSprite : CCSprite {
    
}
+(id)fish;
@end

fishSprite.m

#import "fishSprite.h"


@implementation fishSprite
+(id)fish
{
    return [[self alloc]initWithImage];
}

-(id)initWithImage
{
    if ((self=[super init])) {
             [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"fish.plist"];
        // 将所有fish.plist相关的精灵添加到缓存里;
        
      
        
        self = [CCSprite spriteWithSpriteFrameName:@"fish1.png"];
        //这句很关键,不加这句,CCSproteBatchNode和自定义生成的精灵不会采用同一个纹理,这样强行采用这种技术就会报错;
        
        //下面将纹理图册中的纹理组成动画;使用CCSpriteFrameCache和纹理图册结合会很方便;
        NSMutableArray *frameArray = [NSMutableArray array];
        
        for (int i = 1; i<15; i++) {
            [frameArray addObject:
             [[CCSpriteFrameCache sharedSpriteFrameCache ]spriteFrameByName:
              [NSString stringWithFormat:@"fish%d.png",i]]];
        }
       
        CCAnimation *fishAnimation = [CCAnimation animationWithSpriteFrames:frameArray delay:0.05f];
        CCAnimate *animate = [CCAnimate actionWithAnimation:fishAnimation];
        
       
        
               
             
        [self runAction:[CCRepeatForever actionWithAction:animate]];
        //使该精灵一生成就会运动;
        
     
        
        
        
        
        
        
        


    }
    return self;
}
@end


之后在显示层的init方法中这样添加:

-(id)init
{
    // ask director for the window size
	   
    if (self = [super init]) {
        CGSize size = [[CCDirector sharedDirector] winSize];
        
        CCSprite *background;
        
        
        background = [CCSprite spriteWithFile:@"bg.jpg"];
        
        background.position = ccp(size.width/2, size.height/2);
        
        // add the label as a child to this Layer
        [self addChild: background];
        
        
        //    //在层上添加精灵;
        
        
        CCSpriteBatchNode *fishBatch = [CCSpriteBatchNode batchNodeWithFile:@"fish.png"];
        [self addChild:fishBatch];
        
        CCSprite *fish = [fishSprite fish];
        fish.position = ccp(140, 150);
        
        [self addChild:fish];
        [self scheduleUpdate];
        

    }
   
    return self;
}

这样,代码中的注释很明白,这里再强调一下几点:

1、CCSpriteBatchNode中添加的精灵所依赖的生成纹理必须是一样,包括生成CCSpriteBatchNode对象时所使用的纹理;

2、所有添加进去的精灵,z轴都是一样的,即都依赖于CCSSpriteBatchNode对象的z轴;


从Gitee上部署视觉工程到Linux虚拟机 (使用SVM来识别装甲板的编号,此处手机上的图片中只有灯条没有数字,SVM无法识别出编号。这两行代码的意义是,当SVM识别不出或者识别不到编号时,把装甲板的编号默认为2号。找到自瞄程序中,数字识别类下的这两行代码,把注释去掉。这样,每次打开新的终端时,环境变量都会自动设置。(2)查看虚拟机设置选项,检查虚拟机USB接口是否为3.0及以上的接口。如果不是,要更改好。这样,每次打开新的终端时,环境变量都会自动设置。后,每次打开终端时自动设置这些环境变量,你可以将。打开第一个终端,用来挂ROS的内核启动页面。 阅读详情

相关推荐

MiniMax H3 + ComfyUI 工作流搭建指南:从整合包到视频生成

AI视频生成正成为内容创作的新基础设施,而ComfyUI作为可视化工作流引擎,将复杂的模型推理过程拆解为节点与连线,让本地视频生成变得可复用、可批量。理解这一原理后,用户无需编写代码,只需掌握模型加载、提示词控制、采样与解码的基本链路,即可搭建出稳定的视频生产管线。MiniMax H3作为前沿视频生成模型,在ComfyUI中通过权重文件和自定义节点落地,配合整合包可大幅降低环境配置门槛。从硬件评估、目录结构到节点连接与参数调优,本文系统性梳理了从零跑通一条视频生成工作流的完整路径,帮助用户在批量素材生成、风

weixin_29057065的博客 415

我的Cocos2d-x学习笔记(八)利用CCSpriteBatchNode进行优化

OpenGL是一个基于C语言的三维图形API,是一个开放的、跨平台的图形接口。 OpenGL ES是OpenGL在移动设备上的版本。 Cocos2d-x是一个基于OpenGL的游戏引擎,渲染功能由OpenGL实现。 游戏中会用到许多图片资源,对图片资源渲染进行优化能明显提高效率。 OpenGL中纹理的长和宽像素是2的幂,大小不足的纹理补充到2的幂大小;可以通过把多张小图片合成一张大...

weixin_30608503的博客 237

matlab snr矩阵计算公式_基于MATLAB和Adams的悬置系统解耦计算方法对比

一、概述动力总成悬置系统主要有两个作用:一是固定和支撑动力总成,限制动力总成在各种工况下的位移量,防止与其它部件碰撞;二是隔振作用,将动力总成的振动尽可能少的传递到车身。悬置系统隔振性能的核心就是解决刚体模态的频率分配和振动耦合问题,简言之就是关注动力总成的刚体模态和解耦率。动力总成悬置系统的刚体模态频率和能量解耦分析,行业内的主流计算方法分两种:一是用MATLAB编程进行分析计算,二是...

weixin_33416900的博客 1449

cocos2dx-3.0(13)------SpriteBatchNode与SpriteFrameCache渲染速度

大家都知道一个游戏里面会有大量的图片,每一个图片渲染是须要时间的,以下分析两个类来加快渲染速度,加快游戏执行速度 一、SpriteBatchNode 1、先说下渲染批次:这是游戏引擎中一个比較重要的优化指标,指的是一次渲染凋用。也就是说,渲染的次数越少,游戏的执行效率越高。 2、SpriteBatchNode就是coc...

aofan9566的博客 199

OpenWrt国内镜像源一键切换脚本:清华/阿里/中科大源全搞定

本文介绍了OpenWrt国内镜像源一键切换脚本,支持清华、阿里和中科大三大源,自动识别设备架构和系统版本,显著提升软件包安装速度和成功率。脚本包含架构自动识别、版本适配、多源选择和配置备份等功能,适用于x86_64、ramips/mt7621等常见架构,帮助用户解决海外源访问缓慢的问题。

g5h6i的博客 1176

LD分析实战:基于Plink和R的连锁不平衡计算与可视化全流程

本文详细介绍了基于Plink和R的连锁不平衡(LD)分析全流程,包括基因型数据预处理、LD计算参数设置及结果可视化技巧。通过实战案例解析PLINK文件格式转换、r²值计算关键参数,并展示如何使用ggplot2绘制高质量LD热图,帮助研究人员高效完成基因组关联分析。

weixin_29074295的博客 320

cocos2dx进阶学习之CCSpriteBatchNode

继承关系CCSpriteBatchNode -> CCNode, CCTextureProtocol成员变量inline CCTextureAtlas* getTextureAtlas(void)inline void setTextureAtlas(CCTextureAtlas* textureAtlas)获取/设置纹理图集,纹理图集是管理一张大图纹理和区域信息结构体static C...

weixin_30411819的博客 154

zynq的irq_f2p 如何增加或修改中断引脚个数(宽度)

ZYNQ开发过程中,如果使用PL到PS的中断,会产生一个疑问,设置界面显示可以有[91:84]、[68:61]共16个中断引脚,但是并没有设置中断口的宽度,如果使用多个中断引脚,应该怎么办?如果通过concat连接多个引脚,则自动调整为对应的引脚数。例如连接3个中断信号,则自动调整为:IRQ_F2P[2:0]

FPGA艺术家的博客 837

Cocos2d-x利用CCSpriteBatchNode提高渲染效率

CCSpriteBatchNode介绍: 1、先说下渲染批次:这是游戏引擎中一个比较重要的优化指标,指的是一次渲染凋用。也就是说,渲染的次数越少,游戏的运行效率越高。 2、CCSpriteBatchNode就是cocos2d-x为了降低渲染批次而建立的一个专门管理精灵的类。 举例介绍: 1、使用CCSprite创建1000个Icon.png到场景中,这样

kkk0526的专栏 5143

电机驱动和电源等大电流设计中的并联 MOSFET设计

在电机驱动等应用中,半桥拓扑(通常为 3 相)用于生成在电机中产生正扭矩或负扭矩的交流电源信号。想要更高的输出电流能力,只有通过并联形成每个功能开关的 MOSFET,才能实现高输出电流。当多个功率 MOSFET 并联以增加系统整体电流能力容量时,通常假设电流在并联器件之间均等分配或均等共享。然而,在并联 MOSFET 时,需要考虑并联器件之间的电流分配。PCB 布局的若干特性和特定的MOSFET 参数会影响这种分配,并在参数不匹配或布局不对称时导致均流不平衡。

小幽余生不加糖 2487

对接金蝶云星空调用即时库存信息查询API(附JAVA实现)

这篇文章教你如何对接金蝶API并且使用JAVA调用金蝶云星空的即时库存查询API

实用的博客 2609

cocos2d-x之 CCSpriteBatchNode 用法总结

例子1:     CCSpriteBatchNode* batch = [CCSpriteBatchNode batchNodeWithFile:@"table.png"];         [self addChild:batch]; 创建一个CCSpriteBatchNode对象,通过传递一个包含所有sprite的batch的名字作为参数,并把它加入到当前场景之中。 接下来

tangaowen的专栏 3523

SAP Fiori 会话超时全解析:从 Launchpad 到 Identity Authentication 的统一策略

SAP Fiori会话超时机制解析与配置策略 本文深入探讨SAP Fiori项目中的会话超时机制,分析其对系统安全和用户体验的双重影响。文章系统拆解了SAP Fiori Launchpad与SAP Cloud Identity Services之间的会话超时工作原理,重点介绍了两种超时机制:服务器驱动的超时(通过SESSION_TIMEOUT_STOP_DATA_REFRESH参数控制)和UI驱动的超时(通过SESSION_TIMEOUT_INTERVAL_IN_MINUTES参数控制)。文中结合制造业产线

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 213

iphone游戏开发之cocos2d ( 九 )使用Zwoptex创建纹理图册

holydancer原创,如需转载,请在显要位置注明: 转自holydancer的优快云专栏,专栏地址:http://blog.youkuaiyun.com/holydancer 我们之前文章提到的精灵(会摇尾游动的小鱼),是我们由一张一张的png图片组成帧构建的,但我们在很多项目里都会发现,他们的同类精灵素材都是保存在一张png上,比如这样 这样,如果需要每个精灵,就会从这张png里

holydancer的专栏 6018

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

cocos2dX 番外篇之CCSpriteBatchNode

今天的课程CCSpriteBatchNode

hushuai1992 1730

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

cocos2dx之利用CCSpriteBatchNode创建多个Sprite

相关技术文档,我们在渲染一个图片的时候经常都是一次渲染一个,如果图片资源很多的话,自然降低了效率,这个时候,我们想,要是能一次渲染完毕,以后要再创建的时候,就不需要再渲染就好了,刚好提供了一个类:CCSpriteBatchNode,一次渲染多个,具体看如下代码: void MyBathNodeLayer::initLayer() { CCSize size = CCDirector::sha

专注,努力,勤奋 6879

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

CCSpriteBatchNode和CCTextureAtlas 详解-沈大海cocos2d-x教程21

一般游戏图片资源会打包成一张大图,这样节省空间,又提升速度。打包工具有Zwoptex和texturepacker等等。    CCSpriteBatchNode的初始化只要一张图片,也就是那张大图。然后把所有用到那张大图里面的小图的sprite都加到 CCSpriteBatchNode的child,绘制效率就会提高。下面是TestCpp中的Demo,SpriteTest Spr

Cocos2d-x,Android,IOS,游戏,HTML5开发/交流/学习/资源 沈大海 1万+

cocos2dx 3.x sprite 和spriteBatchNode的认识

转自: Sprite 和 SpriteBatchNode v2.2 2.2版本中推荐的优化游戏方式是将 SpriteBatchNode 对象设置为 Sprite 对象的父节点。 虽然使用 SpriteBatchNode 对象仍然是一个非常好的优化游戏的方式,但是它仍然有一定的限制: Sprite 对象的孩子只能是 Sprite (否则,Cocos2d-x 会触发断言)

lengxue789的专栏 7008

Cocos2d-x(8):CCSpriteBatchNode批处理精灵学习

  一、现在要处理的问题  如果增加多个相同精灵(超多),难道要一个一个渲染??有没有更效率的方法呢?? 答案是有的,使用批处理渲染。使用CCSpriteBatchNode即可实现这个效果。   二、CCSpriteBathNode文档 大概理解下 /** CCSpriteBatchNode is like a batch node: if it contains children,...

爱拼才会赢 973

cocos2d开发学习五:精灵节点CCSpriteBatchNode的渲染和纹理集Texture Atlases内存优化...

本章其实主要是系统的理解下Sprite精灵节点的创建,然后引入精灵节点和纹理集的概念 CCSprite 最简单的生成方式就是用一个纹理贴图。 CCSprite *_firstSp = [CCSprite spriteWithFile:@"icon.png"]; CGSize wins = [[CCDirector sharedDirector] winSize]; _firstS...

mmdev 250

cocos源码分析--SpriteBatchNode绘图原理(转--侵删)

cocos源码分析–SpriteBatchNode绘图原理 https://www.cnblogs.com/xiaonanxia/p/9199737.html

Xxdod的博客 387

Cocos2d-x学习笔记(三)----SpriteBatchNode类

前几天我在写我的飞机时遇到的一个问题我们的子弹会产生多个,如果要使用我们之前常用的方法我们的程序会被渲染多次 。下面看我们的示例: 他要进行准备,渲染,清除,准备,渲染,清除这个过程进行100次。 使用SpriteBatchNode类渲染 他的工作流程是准备 渲染,渲染…,清除就会提升很高的效率 特别适合用于生成我们的子弹。 大致用法: Texture2D *texture = TextureC...

qq_37316639的博客 233

动画 和精灵帧缓存CCSpriteFrameCache 精灵表单CCSpriteBatchNode的使用

CCSpriteBatchNode和CCSpriteFrameCache结合使用; 必须保证CCSpriteFrameCache和CCSpriteBatchNode加载的是同一纹理贴图  //简单帧动画 mainsprite = CCSprite::create("s_1.png"); CCAnimation * animation = CCAnimation::cr

WandingPace 897

游戏性能(掉帧,内存过高)问题

前两个星期恳求一个显示器,好缓解我的眼睛疲劳问题。今天居然直接给我配了个苹果一体机。。。。(因为没有多余的显示器+该MAC无人使用)         近期由于新游刚上线,暴露出来的问题不少,上头在写新需求的同时给我分配了几个性能优化的工作,具体就是争取降低内存占用以及避免掉帧。         网上结合书本研究了下cocos的大致渲染流程和机制,除了默认的“同一层级按先添加先绘制的队列顺序”,

灵溪吴彦祖的博客 3264

CCSpriteBatchNode的特点和使用方法

CCSpriteBatchNode是一个批处理绘制精灵节点,其特点是共享同一个纹理,CCSpriteBatchNode最大的优点就是将所有同属性的纹理进行一次绘制,CCSpriteBatchNode并不能添加CCLabel之类(继承自CCNode的节点),仅处理共享纹理的精灵。另外一点特别要注意的是CCSpriteBatchNode通过addSpriteWithoutQuad增加子节点的方式跟其他

davidsu33的专栏 3470
上一篇: iphone游戏开发之cocos2d ( 十 )使用纹理图册,更方便生成精灵动画
下一篇: 精灵常用操作
holydancer
博客等级 码龄15年 474粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值