cocos2d-x 2.2.3 ccArray简单分析

原创 2014年09月02日 14:17:22

本来想分析CCArray的,结果发现实现部分基本都在ccArray里面,CCArray几乎只是将ccArray封装成了类,所以索性就直接分析ccArray了。

头文件

//- ccArray 实现里包含了retain和release操作
//- ccCArray 没有包含retain和release操作

typedef struct _ccArray {
	unsigned int num, max;
	CCObject** arr;
} ccArray;

// 分配指定大小的空间
ccArray* ccArrayNew(unsigned int capacity);

// 释放空间
void ccArrayFree(ccArray*& arr);

// 分配空间翻倍 一般不需要调用 只需调用ccArrayEnsureExtraCapacity即可
// 每次分配2倍空间的好处是:一次性分配空间 下次插入时 可更快的插入 免去空间分配的时间 思想有点像线程池
void ccArrayDoubleCapacity(ccArray *arr);

// 确保空间足够 如果不够 翻倍
void ccArrayEnsureExtraCapacity(ccArray *arr, unsigned int extra);

// 收缩 使空间与实际item数相同
void ccArrayShrink(ccArray *arr);

// 获取指定元素的索引
unsigned int ccArrayGetIndexOfObject(ccArray *arr, CCObject* object);

// 检查元素是否在array内
bool ccArrayContainsObject(ccArray *arr, CCObject* object);

// 在末尾添加元素 不检查空间是否足够 所以在空间不足时 会出现无法预测的行为
void ccArrayAppendObject(ccArray *arr, CCObject* object);

// 在末尾添加元素 空间不足时重新分配
void ccArrayAppendObjectWithResize(ccArray *arr, CCObject* object);

// 在末尾添加一组元素 不检查空间是否足够 所以在空间不足时 会出现无法预测的行为
void ccArrayAppendArray(ccArray *arr, ccArray *plusArr);

// 在末尾添加一组元素 空间不足时重新分配
void ccArrayAppendArrayWithResize(ccArray *arr, ccArray *plusArr);

// 在指定位置插入元素 所有元素向后移动
void ccArrayInsertObjectAtIndex(ccArray *arr, CCObject* object, unsigned int index);

// 交换位置
void ccArraySwapObjectsAtIndexes(ccArray *arr, unsigned int index1, unsigned int index2);

// 移除所有元素 只移除 不收缩
void ccArrayRemoveAllObjects(ccArray *arr);

// 移除指定元素 所有元素向前移动补空 不检查空间是否足够 所以在空间不足时 会出现无法预测的行为
void ccArrayRemoveObjectAtIndex(ccArray *arr, unsigned int index, bool bReleaseObj = true);

// 移除指定元素 用最后一个元素补空 不检查空间是否足够 所以在空间不足时 会出现无法预测的行为
void ccArrayFastRemoveObjectAtIndex(ccArray *arr, unsigned int index);

void ccArrayFastRemoveObject(ccArray *arr, CCObject* object);

// 查找到指定的元素 并移除 只移除第一个匹配的
void ccArrayRemoveObject(ccArray *arr, CCObject* object, bool bReleaseObj = true);

// 移除指定元素组 只移除第一个匹配的
void ccArrayRemoveArray(ccArray *arr, ccArray *minusArr);

// 移除指定元素组 所有相同的都会被移除
void ccArrayFullRemoveArray(ccArray *arr, ccArray *minusArr);



实现

挑了一部分简单分析。

void ccArrayEnsureExtraCapacity(ccArray *arr, unsigned int extra)
{
	// 空间不足 直接翻倍
	while (arr->max < arr->num + extra)
    {
		ccArrayDoubleCapacity(arr);
    }
}

void ccArrayShrink(ccArray *arr)
{
    unsigned int newSize = 0;
	
	// 仅在需要重新分配时 重新分配空间
	if (arr->max > arr->num && !(arr->num==0 && arr->max==1))
	{
		if (arr->num!=0)
		{
			newSize=arr->num;
			arr->max=arr->num;
		}
		else
		{//保持空间最小为1
			newSize=1;
			arr->max=1;
		}
		
		arr->arr = (CCObject**)realloc(arr->arr,newSize * sizeof(CCObject*) );
		CCAssert(arr->arr!=NULL,"could not reallocate the memory");
	}
}

void ccArrayAppendObject(ccArray *arr, CCObject* object)
{
    CCAssert(object != NULL, "Invalid parameter!");
    // 直接操作 不检查空间是否足够
    object->retain();
	arr->arr[arr->num] = object;
	arr->num++;
}

void ccArrayAppendObjectWithResize(ccArray *arr, CCObject* object)
{
	// 先确保空间足够 再操作
	ccArrayEnsureExtraCapacity(arr, 1);
	ccArrayAppendObject(arr, object);
}

void ccArrayInsertObjectAtIndex(ccArray *arr, CCObject* object, unsigned int index)
{
	CCAssert(index<=arr->num, "Invalid index. Out of bounds");
	CCAssert(object != NULL, "Invalid parameter!");
	// 保证充足空间
	ccArrayEnsureExtraCapacity(arr, 1);
	// 向后移位 让出足够空间
	unsigned int remaining = arr->num - index;
	if( remaining > 0)
    {
		memmove((void *)&arr->arr[index+1], (void *)&arr->arr[index], sizeof(CCObject*) * remaining );
    }
    // 插入
    object->retain();
	arr->arr[index] = object;
	arr->num++;
}

void ccArrayRemoveAllObjects(ccArray *arr)
{
	while( arr->num > 0 )
    {// 简单明了的release 附带--arr->num
		(arr->arr[--arr->num])->release();
    }
}

void ccArrayFastRemoveObjectAtIndex(ccArray *arr, unsigned int index)
{
	CC_SAFE_RELEASE(arr->arr[index]);
	// 用最后一个元素填补空缺
	unsigned int last = --arr->num;
	arr->arr[index] = arr->arr[last];
}



总结

CCArray内部使用了ccArray,也就是自带了retain及release操作的array。

顺带一提,有个ccCArray,是使用C方式的malloc和free操作的,这个只在引擎内部使用,我们自己一般是不会使用到这个的。

有趣的部分是分配空间时的操作,每次直接翻倍分配,一定程度上提高了效率。



【玩转cocos2d-x之二十五】数据结构CCArray

CCArray是从cocos2d中移植过来的,类似于Apple的NSMutableArray,但是比NSMutableArray更为的好用。要注意的是虽然CCArray和CCDictionary可以管...
  • jackyvincefu
  • jackyvincefu
  • 2013年11月25日 08:58
  • 8886

cocos2d-x的CCArray用法

一.基本用法 1.声明初始化变量 C++ 123cocos2d::CCArray* pArray;pArray=CCA...
  • yuyueliuliu
  • yuyueliuliu
  • 2013年12月04日 14:55
  • 4339

cocos2d-x 中的数据结构集合(容器)(CCArray,Map,Vector)使用笔记

第1部分、CCArray cocos2d::CCArray(在3.0中已经过时,将被vector替代)是一个可变数组集合容器,放在其中的元素是有序的,并且可以重复,可以通过索引来获得元素,可以对容器内...
  • windvally
  • windvally
  • 2015年08月11日 16:14
  • 826

cocos2d-x 2.2.3 CCKeypadDispatcher简单分析

头文件 // 支持的2种按键消息 typedef enum { // the back key clicked msg kTypeBackClicked = 1, kTypeM...
  • a102111
  • a102111
  • 2015年04月22日 22:45
  • 432

cocos2d-x学习日志(10) --射击游戏(喵星战争)

一、纵版射击游戏的特点 纵版射击游戏是一种比较传统的游戏,在各种游戏平台都有非常经典的游戏作品。对于游戏开发者来说,这种游戏题材非常适合加入特效和创新的玩法。但是无论怎样改变,该类游戏都具备以下特点:...
  • my183100521
  • my183100521
  • 2013年08月29日 21:11
  • 4440

【玩转cocos2d-x之十九】从CCObject看cocos2d-x的拷贝机制

CCObject在之前的文章中出现了N次,它扮演了一个老祖宗的角色,但是它到底是做什么的?先从它看看cocos2d-x的拷贝机制吧。 1.CCCopying CCObject从CCCopying继...
  • jackyvincefu
  • jackyvincefu
  • 2013年10月30日 08:13
  • 7022

cocos2d-x-2.2.3和vs2012环境配置

cocos2d-x真是个好东西,以前一直想学,总觉得C++自己搞不来,真后悔最近才开始。一平台编译,多平台运行,是在是诱惑人,如果学习好,就不用羡慕别人华丽的游戏了。既然是新手,一定要从最基本的环境开...
  • eyu8874521
  • eyu8874521
  • 2014年03月28日 10:43
  • 13715

cocos2d-x 2.2.3 CCTextureCache的addImage简单分析

CCTextureCache是用于缓存纹理的类,最常用的就是addImage了,下面简单分析下这部分的daiam...
  • a102111
  • a102111
  • 2014年08月28日 10:57
  • 2764

cocos2d-x 2.2.3 CCLabelBMFont CCLabelAtals简单分析

CCLabelBMFont和CCLabelAtals都是用于显示自定义zi
  • a102111
  • a102111
  • 2014年10月11日 16:04
  • 1440

cocos2d-x 2.2.3 CCDictionary类简单分析

头文件 实现部分 zo
  • a102111
  • a102111
  • 2014年09月01日 17:01
  • 1444
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2d-x 2.2.3 ccArray简单分析
举报原因:
原因补充:

(最多只允许输入30个字)