CCArray的用法

CCArray的用法,第1张

概述CCArray 简介 CCArray是cocos2d鼎力支持的数据结构类。它对游戏存储数组型数据做了优化。你可以在cocos2d-x源文件目录cocos2d/support/ data_support里面找到CCArray的实现。CCArray在cocos2d内被使用广泛,它模拟了苹果NSMutableArray的功能,但是执行效率更高。   CCArray是一个面向对象包装类 CCArray继承

CCArray

简介

CCArray是cocos2d鼎力支持的数据结构类。它对游戏存储数组型数据做了优化。你可以在cocos2d-x源文件目录cocos2d/support/ data_support里面找到CCArray的实现。CCArray在cocos2d内被使用广泛,它模拟了苹果NSMutableArray的功能,但是执行效率更高。

CCArray是一个面向对象包装类

CCArray继承至CCObject(CCObject主要是为了自动内存管理而创建的),并且提供了一系列接口,包括

创建

/** 创建一个数组 */ static CCArray* create();/** 使用一些对象创建数组 */(CCObject pObject, …);  /** 使用一个对象创建数组 */   createWithObject);/** 创建一个指定大小的数组 */ createWithCapacity(unsigned int capacity/** 使用一个现有的CCArray数组来新建一个数组 */  createWithArray otherArray);

插入

/** 插入一个对象 */voID addobjectobject /** 插入别外一个数组里面的全部对象 */ addobjectsFromArray/** 在一个确定的索引位置插入一个对象 */ insertObject index 删除

/** 移除最后的一个对象 */ removeLastObjectbool bReleaSEObj =true/**移除一个确定的对象 */ removeObject/** 移除一个确定索引位置的元素 */ removeObjectAtIndex/** 移除全部元素 */ removeObjectsInArray /** 移除所有对象 */ removeAllObjects/** 快速移除一个对象 */ fastRemoveObject/** 快速移除一个确定索引位置的对象 */ fastRemoveObjectAtIndex – See more at:http://www.cocos2d-x.org/projects/cocos2d-x/wiki/CCArray#sthash.kc1dtGXI.dpuf

remove和fastRemove有什么区别,可以看看源代码,remove是从CCArray中完全的移除,fastRemove只是将CCArray中对应的对象释放掉了,没够改变整个CCArray的结构。从代码上来看,区别在于删除元素之后,是否把数组之后的元素向前移动覆盖掉之前位置的元素。
代码上的差别如下所示:

 remaining  arr->num -;if(remaining>0){    memmove((*)&arr[index],255)">+1sizeof*));}

遍历

在教程第五章 “怎么样去侦测碰撞”中,在update()函数下面调用了CCARRAY_FOREACH(arr,obj)方法,这个方法就是用来遍历CCArray(_targets和_projectiles),用来在每一帧中检测碰撞。

在HelloWorldScene.h中申明,并且在HelloWorldScene.cpp中定义

HelloWorld::updateccTime dt    CCArrayprojectilesToDelete new it  NulL jt  CCARRAY_FOREACH_projectiles it   CCSpriteprojectile dynamic_castitCCRect projectileRect CCRectMake   projectilegetposition().x projectilegetContentSizewIDth/2),255)">y height   targetsToDelete =        CCARRAY_FOREACH_targets jt     target jt targetRect     targettarget   // if (CCRect::CCRectIntersectsRect(projectileRect,targetRect))            ifprojectileRect.intersectsRecttargetRect))       targetsToDeleteaddobject}targetsToDelete   _targetsremoveObject   thisremoveChild        count()      projectilesToDeleterelease    CCARRAY_FOREACHprojectilesToDeleteCCSprite projectile   _projectiles   projectilesToDelete – See more at:http://www.cocos2d-x.org/projects/cocos2d-x/wiki/CCArray#sthash.hQf6ATw7.dpuf

CCArrayNSArray

CCArray效率很高,但是CCArray中的对象也是有对应位置的,假如你的代码依赖于这些对象的位置,你就不应该使用fastRemoveObject方法。

速度测试

以下代码是测试CCArray和NSArray分别遍历200个对象:

测试A(NSArray)

for w   w<100++){ID objectin arrayNS){       //Do something

测试B(CCArray)

ccArray arrayData  arraydataID  nu  arrayDatanum    CCARRAY_FOREACHarrayData       i];       结果

以上测试表明在遍历数组的时候,CCArray比NSArray在性能上提升了大概10%。在使用CCARRAY_FOREACH和NSArray快速枚举来迭代整个数组也是有些微的性能改善。当使用快速枚举的时候,这两种方式的数组和相同领域中的C数组基本上有相同的性能表现,而且CCArray相比纯C数组有极其细微的性能提升。

使用注意事项

CCArray一般不会被增加到其他类中,所以他的引用计数是1,并且设置为autorelease对象。创建CCArray对象并且retain,然后在这个类中的析构函数中调用release方法来释放内存。

如果CCObject对象添加到CCArray中,那么CCObject对象的引用计数将会加1.

总结

以上是内存溢出为你收集整理的CCArray的用法全部内容,希望文章能够帮你解决CCArray的用法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1013059.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存