• [Cocos2DX官方文档:解读CCArray类]


     

    分享到:--

    CCArray

    简介

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

    CCArray是一个面向对象包装类

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

    创建

    1. /** 创建一个数组 */
    2.   staticCCArray* create();
    3.  /** 使用一些对象创建数组 */
    4. staticCCArray* create(CCObject* pObject,…);     
    5. /** 使用一个对象创建数组 */   
    6.    staticCCArray* createWithObject(CCObject* pObject);     
    7. /** 创建一个指定大小的数组 */   
    8.    staticCCArray* createWithCapacity(unsignedint capacity);     
    9. /** 使用一个现有的CCArray数组来新建一个数组 */
    10. staticCCArray* createWithArray(CCArray* otherArray);

    插入

    1. /** 插入一个对象 */
    2.     void addObject(CCObject*object);
    3.     /** 插入别外一个数组里面的全部对象 */
    4.     void addObjectsFromArray(CCArray* otherArray);
    5.     /** 在一个确定的索引位置插入一个对象 */
    6.     void insertObject(CCObject*object,unsignedint index);

    删除

    1.  
    2.  /** 移除最后的一个对象 */
    3.      void removeLastObject(bool bReleaseObj =true);
    4.      /**移除一个确定的对象 */
    5.      void removeObject(CCObject*object,bool bReleaseObj =true);
    6.      /** 移除一个确定索引位置的元素 */
    7.      void removeObjectAtIndex(unsignedint index,bool bReleaseObj =true);
    8.      /** 移除全部元素 */
    9.      void removeObjectsInArray(CCArray* otherArray);
    10.  
    11.   /** 移除所有对象 */
    12.     void removeAllObjects();
    13.     /** 快速移除一个对象 */
    14.     void fastRemoveObject(CCObject*object);
    15.     /** 快速移除一个确定索引位置的对象 */
    16.     void fastRemoveObjectAtIndex(unsignedint index);

    - See more at: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/CCArray#sthash.kc1dtGXI.dpuf

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

    1. unsignedint remaining = arr->num - index;
    2. if(remaining>0)
    3. {
    4. memmove((void*)&arr->arr[index],(void*)&arr->arr[index+1], remaining *sizeof(CCObject*));
    5. }

    遍历

    CCArray

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

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

    1. voidHelloWorld::update(ccTime dt)
    2. {
    3. CCArray*projectilesToDelete =newCCArray;
    4. CCObject* it = NULL;
    5. CCObject* jt = NULL;
    6.  
    7. CCARRAY_FOREACH(_projectiles, it)
    8. {
    9. CCSprite*projectile =dynamic_cast(it);
    10. CCRect projectileRect =CCRectMake(
    11. projectile->getPosition().x -(projectile->getContentSize().width/2),
    12. projectile->getPosition().y -(projectile->getContentSize().height/2),
    13. projectile->getContentSize().width,
    14. projectile->getContentSize().height);
    15.  
    16. CCArray* targetsToDelete =newCCArray;
    17.  
    18. CCARRAY_FOREACH(_targets, jt)
    19. {
    20. CCSprite*target =dynamic_cast(jt);
    21. CCRect targetRect =CCRectMake(
    22. target->getPosition().x -(target->getContentSize().width/2),
    23. target->getPosition().y -(target->getContentSize().height/2),
    24. target->getContentSize().width,
    25. target->getContentSize().height);
    26.  
    27. // if (CCRect::CCRectIntersectsRect(projectileRect, targetRect))
    28. if(projectileRect.intersectsRect(targetRect))
    29. {
    30. targetsToDelete->addObject(target);
    31. }
    32. }
    33.  
    34. CCARRAY_FOREACH(targetsToDelete, jt)
    35. {
    36. CCSprite*target =dynamic_cast(jt);
    37. _targets->removeObject(target);
    38. this->removeChild(target,true);
    39. }
    40.  
    41. if(targetsToDelete->count()>0)
    42. {
    43. projectilesToDelete->addObject(projectile);
    44. }
    45. targetsToDelete->release();
    46. }
    47.  
    48. CCARRAY_FOREACH(projectilesToDelete, it)
    49. {
    50. CCSprite* projectile =dynamic_cast(it);
    51. _projectiles->removeObject(projectile);
    52. this->removeChild(projectile,true);
    53. }
    54. projectilesToDelete->release();
    55. }

    - See more at: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/CCArray#sthash.hQf6ATw7.dpuf

    CCArray  NSArray

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

    速度测试

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

    测试A(NSArray)

    1.  
    2. for(int w =0; w<100; w++){
    3. for(id objectin arrayNS){
    4. //Do something
    5. }
    6. }

    - See more at: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/CCArray#sthash.hQf6ATw7.dpuf

    测试B(CCArray)

    1.  
    2. ccArray *arrayData = array->data;
    3. id object;
    4. int nu = arrayData->num;
    5. for(int w =0; w<100; w++){
    6. CCARRAY_FOREACH(arrayData,object){
    7. object= arrayData->arr[i];
    8. //Do something
    9. }
    10. }

    - See more at: http://www.cocos2d-x.org/projects/cocos2d-x/wiki/CCArray#sthash.hQf6ATw7.dpuf

    结果

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

    使用注意事项

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

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

  • 相关阅读:
    Pandas包对多个数据表(DataFrame)的常用整合功能。
    pandas numpy 简单应用 loandata
    榛果 美团 登录 爬虫 requests session
    python 日期循环
    opencv 验证码 识别
    运行MapReduce任务
    CenOS安装MySQL服务
    leetcode 67. 二进制求和
    最近对一些领域比较感兴趣,这里列举出来供以后查阅
    leet code 1014. 最佳观光组合
  • 原文地址:https://www.cnblogs.com/alsky/p/3040350.html
Copyright © 2020-2023  润新知