Cocos2d-x   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Cocos2d-x优化中纹理优化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
1.纹理像素格式
纹理优化工作的另一重要的指标是纹理像素格式,能够最大程度满足用户对保真度要求的情况下,选择合适的像素格式,可以大幅提高纹理的处理速度。而且纹理像素格式有与硬件有这密切的关系。
下面我们先了解一下纹理像素的格式,主要的格式有:
RGBA8888。32位色,它是默认的像素格式,每个通道8位(比特),每个像素4个字节。
BGRA8888。32位色,每个通道8位(比特),每个像素4个字节。
RGBA4444。16位色,每个通道4位(比特),每个像素2个字节。
RGB888。24位色,没有Alpha通道,所以没有透明度。每个通道8位(比特),每个像素3个字节。
RGB565。16位色,没有Alpha通道,所以没有透明度。R和B通道是各5位,G通道是6。
RGB5A1(或RGBA5551)。16位色,每个通道各4位,Alpha通道只用1位表示。
PVRTC4。4位PVR压缩纹理格式,PVR格式是专门为iOS设备上面的PowerVR图形芯片而设计的。它们在iOS设备上非常好用,因为可以直接加载到显卡上面,而不需要经过中间的计算转化。
PVRTC4A。具有Alpha通道的,4位PVR压缩纹理格式。
PVRTC2。2位PVR压缩纹理格式。
PVRTC2A。具有Alpha通道的,2位PVR压缩纹理格式。

此外,PVR格式在保存的时候还可以采用Gzip和zlib压缩格式进行压缩,对应的保存文件为pvr.gz和pvr.ccz。经过压缩文件会更小,加载的时候使用更少的内存!然是转化为纹理的时候,需要解压,但对于CPU影响很小。
2.纹理缓存异步加载
我们在启动游戏和进入场景时候,由于需要加载的资源过多就会比较“卡”,用户体验不好。我们可以采用纹理缓存(TextureCache)异步加载纹理图片,TextureCache类异步加载函数如下:
virtual void addImageAsync(const std::string & filepath,
std::function< void(Texture2D *)> callBACk
)
其中第一个参数文件路径,第二参数是回调函数。下面我们通过一个实例介绍一下纹理缓存异步加载使用,有200张小图片,加载到纹理缓存,加载过程会有一个进度显式在界面上,如图20-25所示。
纹理缓存异步加载实例HelloWorldScene.cpp中主要代码如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false ;
}
Size visibleSize = Director::geTinstance()->getVisibleSize();
Vec2 origin = Director::geTinstance()->getVisibLeorigin();
auto closeItem = MenuItemImage::create(
"CloseNormal.png" ,
@H_674_278@"CloseSELEcted.png" :1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
CC_CALLBACK_1(HelloWorld::menuCloseCallBACk, this ));
closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/ 2 :1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
origin.y + closeItem->getContentSize().height/ ));
auto menu = Menu::create(closeItem,null);
@H_479_228@menu->setPosition(Vec2::ZERO);
->addChild(menu, 1 );
_labelLoading = Label::createWithTTF ( "loading..." :1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas, "fonts/Marker Felt.ttf" 35 );
_labelPercent = Label::createWithTTF ( "0%%" );
_labelLoading->setPosition(Vec2(visibleSize.width / :1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,visibleSize.height / - 20 ));
_labelPercent->setPosition(Vec2(visibleSize.width / + ));
->addChild(_labelLoading);
@H_450_379@ ->addChild(_labelPercent);
_numberOfLoadedSprites = 0 ;
_imageOffset = ;
auto sharedFileUtils = FileUtils::geTinstance();
std::string fullPathForFilename
= sharedFileUtils->fullPathForFilename( "ImageMetaData.plist" );
ValueVector vec = FileUtils::geTinstance()->getValueVectorFromFile(fullPathForFileName); ②
_numberOfSprites = vec.size();
//加载纹理
for ( auto& e : veC)
{
auto row = e.asValueMap();
auto filename = "icons/" + row.at( "filename" ).asString();
Director::geTinstance()->getTextureCache()->addImageAsync(filename,
CC_CALLBACK_1(HelloWorld::loadingCallBACk,monospace!important; font-size:1em!important; min-height:inherit!important; BACkground:none!important">));
}
true ;
}
@H_261_489@
void HelloWorld::loadingCallBACk(Texture2D *texturE)
{
++_numberOfLoadedSprites;
__String* str = __String::createWithFormat( "%d%%" :1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-family:Consolas,
( int )((( float )_numberOfLoadedSprites / _numberOfSprites) * 100 ));
_labelPercent->setString(str->getCString());
Size visibleSize = Director::geTinstance()->getVisibleSize();
i = ++_imageOffset * 60 ;
@H_616_548@
auto sprite = Sprite::createWithTexture(texturE); ⑨
sprite->setAnchorPoint(Vec2( ));
addChild(sprite,- );
sprite->setPosition(Vec2( i % ( )visibleSize.width,(i / ( )visibleSize.width) * ));
(_numberOfLoadedSprites == _numberOfSprites) ⑩
{
;
}
}

上述代码第①行代码是获得资源目录下ImageMetaData.plist 文件全路径,ImageMetaData.plist 文件是我们定义用来描述要加载图标文件名,文件内容如下:
?
@H_924_616@ 23
<!--?xml version= "1.0" encoding= "utf-8" ?-->
<plist version= >
<Dict>
<key>filename</key>
<String> 01 -@R_944_7017@h.png</String>
</Dict>
<Dict>
<key>filename</key>
02 -redo.png</String>
</Dict>
<Dict>
<key>filename</key>
03 -loopBACk.png</String>
</Dict>
<Dict>
<key>filename</key>
04 -squiggle.png</String>
</Dict>
… …
</array>
</plist>

ImageMetaData.plist 文件是属性列表文件,内部结构是数组类型,我们可以通过第②行代码FileUtils 的getValueVectorFromFile函数读入到ValueVector类型变量vec中。第③行代码_numberOfSprites = vec.size()是获得数组的长度,然后赋值给成员变量_numberOfSprites为了能够计算加载进度。
第④行代码是循环遍历数组,数组结构中的每一个元素是键值对结构,取的键值对结构语句是auto row = e.asValueMap()。然后通过语句row.at("filename").asString()从键值对对象row中取出键为filename对应的值。
第⑤行代码是调用TextureCache的addImageAsync函数实现异步加载图片缓存,HelloWorld::loadingCallBACk是回调函数,this参数表示回调函数的目标对象。
第⑥行是我们定义的回调函数实现。第⑦行代码在的表达式(int)(((float)_numberOfLoadedSprites / _numberOfSprites) * 100)可以计数出加装进度,"%d%%"可以显示百分号,其中的%d是格式化输出数字。%%是输出%,前面%起到转义作用。第⑧行代码_labelPercent->setString(str->getCString())是设置进度标签_labelPercent的内容。

第⑨行代码auto sprite = Sprite::createWithTexture(texturE)是通过纹理对象texture创建精灵对象。第⑩行代码if (_numberOfLoadedSprites == _numberOfSprites)是判断是否完成任务,_numberOfLoadedSprites是已经加装的图片数,_numberOfSprites是要加装的全部图片数


@R_489_10107@://www.2cto.com/kf/201411/351657.html

大佬总结

以上是大佬教程为你收集整理的Cocos2d-x优化中纹理优化全部内容,希望文章能够帮你解决Cocos2d-x优化中纹理优化所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:cocoscocos2ddx优化纹理
猜你在找的Cocos2d-x相关文章
其他相关热搜词更多
phpJavaPython程序员load如何string使用参数jquery开发安装listlinuxiosandroid工具javascriptcap