发布时间:2016-06-30责任编辑:朱明 浏览:1615
做cocos2d开发,一直使用cocostudio摆放部件,方便快捷,并且直观,给工作带来了极高的效率。但是一直对其加载速度表示怀疑,今天做了一个测试,就是在滚动层上加载多个部件,看其效率如何。实验如下:
分别用两种方法在滚动层上加载部件,第一种,循环复制克隆已经读取的部件,第二种,循环读取 .csb文件创建一个部件加载到滚动层上,暂将两种方法命名为:方法一,方法二。
1、首先摆放部件,做了两个studio界面,如下:
方法一:
方法二:
方法一:第一个界面中包含一个ScrollView控件,ScrollView控件中包含了一个item;
方法二:第二个是单独的把item控件拿了出来;加载时使用第一个界面的ScrollView;
2、代码实现在ScrollView中加载300个控件
方法一:克隆ScrollView控件中的item,加载到ScrollView中;
代码如下:
方法二:直接创建item控件,加载到ScrollView中;
代码如下:
运行后效果如下:
方法一:
方法二:
对比可以看出 Text控件的描边效果,和颜色都没有了,因为clone()函数是针对Widget类克隆的,子类中的一些元素固然没法克隆,于是在方法一种添加如下代码:
3、运行后效果完全一致,接下来只是简单的用秒表计时测试加载时间的长短:
方法一:2.14s;
方法二:6.21s;
结果显而易见了,虽然只是在win32下进行的测试,但加载效率相差近3倍,所以后期在使用滑动层加载多个部件时,尽量使用第一种方法,将部件直接摆在滚动层上,更直观,克隆更方便。
另外:还有一个极易遇到的问题,就是克隆的部件必须都是基于Widget类或子类,否则会报错,或者无法克隆;(小编在使用时item部件中的图片使用了不少的Sprite类,结果无法显示)
代码如下:
方法一:
auto ScrollView_1= static_cast
for (int i=0;i<100;i++)
{
auto item = (Widget*)ScrollView_1->getChildByName("item");
if (i>0)
{
auto item_clone = item->clone();
ScrollView_1->addChild(item_clone);
item = item_clone;
}
item->setPosition(Vec2(0, ScrollView_1->getInnerContainerSize().height-120-(i*120)));
auto Text_3 = (Text*)item->getChildByName("Text_3");
Text_3->enableOutline(Color4B(0,0,0,255),2);//黑色描边
Text_3->setTextColor(Color4B(255,255,0,255));
auto Text_4 = (Text*)item->getChildByName("Text_4");
Text_4->enableOutline(Color4B(0,0,0,255),2);//黑色描边
Text_4->setTextColor(Color4B(255,222,0,255));
auto Text_10 = (Text*)item->getChildByName("Text_10");
Text_10->enableOutline(Color4B(0,0,0,255),2);//黑色描边
Text_10->setTextColor(Color4B(255,222,0,255));
auto Text_10_0 = (Text*)item->getChildByName("Text_10_0");
Text_10_0->enableOutline(Color4B(0,0,0,255),2);//黑色描边
//Text_10_0->setTextColor(Color4B(255,222,0,255));
auto Text_7 = (Text*)item->getChildByName("Text_7");
Text_7->enableOutline(Color4B(0,0,0,255),2);//黑色描边
Text_7->setTextColor(Color4B(255,222,0,255));
}
方法二:
auto ScrollView_1= static_cast
for (int i=0;i<100;i++)
{
Node* naode = CSLoader::createNode("res/csb/GongHuiPaiMingNode_0.csb");
ScrollView_1->addChild(naode);
naode->setPosition(Vec2(0, ScrollView_1->getInnerContainerSize().height-120-(i*120)));
}
同舟工作室