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中主要代码如下

bool HelloWorld::init()
{
	if ( !Layer::init() )
	{
		return false;
	}

	Size visibleSize = Director::getInstance()->getVisibleSize();
	Vec2 origin = Director::getInstance()->getVisibleOrigin();
	auto closeItem = MenuItemImage::create(
		"CloseNormal.png",
		"CloseSelected.png",
		CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));

	closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
		origin.y + closeItem->getContentSize().height/2));
	auto menu = Menu::create(closeItem, NULL);
	menu->setPosition(Vec2::ZERO);
	this->addChild(menu, 1);

	_labelLoading = Label::createWithTTF ("loading...", "fonts/Marker Felt.ttf", 35);
	_labelPercent = Label::createWithTTF ("0%%", "fonts/Marker Felt.ttf", 35);

	_labelLoading->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2 - 20));
	_labelPercent->setPosition(Vec2(visibleSize.width / 2, visibleSize.height / 2 + 20));

	this->addChild(_labelLoading);
	this->addChild(_labelPercent);

	_numberOfLoadedSprites = 0;
	_imageOffset = 0;

	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, this));					⑤
	}
	return true;
}

void HelloWorld::loadingCallBack(Texture2D *texture)								⑥
{
	++_numberOfLoadedSprites;
	__String* str = __String::createWithFormat("%d%%",
						(int)(((float)_numberOfLoadedSprites / _numberOfSprites) * 100)); 		⑦
	_labelPercent->setString(str->getCString());									⑧

	Size visibleSize = Director::getInstance()->getVisibleSize();
	int i = ++_imageOffset * 60;

	auto sprite = Sprite::createWithTexture(texture);								⑨
	sprite->setAnchorPoint(Vec2(0,0));
	addChild(sprite, -1);
	sprite->setPosition(Vec2( i % (int)visibleSize.width, (i / (int)visibleSize.width) * 60));

	if (_numberOfLoadedSprites == _numberOfSprites)								⑩
	{
		_numberOfLoadedSprites = 0;
	}
}

上述代码第①行代码是获得资源目录下ImageMetaData.plist 文件全路径ImageMetaData.plist 文件是我们定义用来描述要加载图标文件名文件内容如下

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
				"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <array>
    <dict>
      <key>filename</key>
      <string>01-refresh.png</string>
    </dict>
    <dict>
      <key>filename</key>
      <string>02-redo.png</string>
    </dict>
    <dict>
      <key>filename</key>
      <string>03-loopback.png</string>
    </dict>
    <dict>
      <key>filename</key>
      <string>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是要加装的全部图片数。

更多内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》‍

本书交流讨论网站http://www.cocoagame.net

更多精彩视频课程请关注智捷课堂Cocos课程http://v.51work6.com

欢迎加入Cocos2d-x技术讨论群257760386

《Cocos2d-x实战 C++卷》现已上线各大商店均已开售‍

京东http://item.jd.com/11584534.html

亚马逊http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

当当http://product.dangdang.com/23606265.html

互动出版网http://product.china-pub.com/3770734

《Cocos2d-x实战 C++卷》源码及样章下载地址

源码下载地址http://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1 

样章下载地址http://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

欢迎关注智捷iOS课堂微信公共平台

时间: 2024-10-05 00:41:43

Cocos2d-x优化中纹理优化的相关文章

Cocos2d-x优化中图片优化

在2D游戏中图片无疑是最为重要的资源文件它会被加载到内存中转换为纹理由GPU贴在精灵之上渲染出来.它能够优化的方面很多包括图片格式.拼图和纹理格式等下面我们从这几个方面介绍一下图片和纹理的优化.1.选择图片格式要回答这个问题我们需要先了解一下目前在移动平台所使用的图片文件格式以及这些图片格式Cocos2d-x是否支持.图片格式有很多但是在移动平台主要推荐使用的PNGJPG也可以考虑而其它的文件格式最好转化成为PNG格式.我们先了解一下它们的特点.1.PNG文件PNG文件格式设计目的是替代GIF和

seo优化中不容忽视的页面优化

seo优化中页面的优化是很重要的,合理的对网站页面进行优化,使网站更加适合搜索引擎的检索.但是还是有很多的企业在网站建设完成后对于页面的优化并不重视,title没有写,要么关键词布局不合理,要么网页代码过于复杂,这些问题都会直接影响网站的优化效率.其实对于页面的优化并不是很难,只需要注意网站页面优化的几个要点几个: 1.mate标签的优化 对于Meta标签,主要有title.description.keywords三个地方,页面的tittle在页面的优化中是占比较重要的部分,通常设置为20-25

HTML标签图片alt在优化中的谨慎使用

图片中故意充斥大量ALT关键词文本不仅无助于网页的搜索引擎排名,反而会因为有ALT关键词垃圾(ALT Text Spam)嫌疑而影响排名成效 在网页设计中,图片的属性ALT标签用于对图片进行命名等描述说明.ALT标签众多关键词信息在搜索引擎优化中曾发挥了一定作用,常被用于增加网页关键词密度,因此在ALT中合理添加与主题有关的关键词属于搜索引擎优化中考虑的一个因素.不过,最近美国SEO研究网站WebMarketingNow和Search Engine Academy根据长期测试研究认为,目前,三大

关键词堆砌在网站优化中的表现形式和影响

根据流量客的了解,很多新手SEOER或者企业内部非专业网站优化的人员,通常对于网站关键词布局最经常用的一种方法就是,大量堆集目标关键词,一般是在文章的标题title.文章正文.友情链接等这些地方,这种优化方法用之不当,就犯了关键词堆砌的错误,很容易引起搜索引擎的惩罚. 关键词堆砌的含义 关键词堆砌,英文Keword Stuffing,就是通过非正常的手段,人为地大量增加关键词在网页中的出现次数和数量,属于黑帽SEO技术常见的一种方法,因为网页充斥着大量的关键词,能显著关键词密度,最终达到提高网站

TAG标签在SEO优化中的作用

1.TAG标签是什么 很多人还不了解沈阳SEO优化中TAG标签具体是什么东西,对网站沈阳SEO优化又会带来什么样的影响,首先我网站用的CMS里面已经有了添加TAG标签的功能,但是沈阳SEO优化一直以来应用的并不是十分充分,有的时候是空着,有的时候就直接写关键词,这对于一个健康的网站沈阳SEO优化来说也许是不会带来什么fu/mian的影响的,那么这个TAG标签究竟有什么作用呢? TAG标签与关键词有着同样的重要的地位,我认为关键词是写给搜索引擎看的,而TAG标签针对的却是用户,是直接的浏览者.很多

网站优化中如何写出满足用户需求的文章

笔者一直从事的资讯类小企业网站的运维和优化过程,尤其随着百度算法的升级,越发感觉到优质的站内文章对于seo的重要性,作为一个seoer笔者认为文章的撰写一定是和用户需求和体验挂钩的,你的内容能获得多少客户的关注,就能提升网站多大的粘度,这两者是成正比的,一个资讯类网站,如何让文章质量更有价值和说服力,笔者认为以下几个方面值得我们任何一个站长的思考,好了下面笔者以自己网站为案例进行详细分析. 第一,撰写之前如何有效挖掘用户需求.笔者非常喜欢进行数据统计工作,我们先来看图, 以上图示内容展示的是百度

浅谈在网站优化中如何提升外链质量

在网站优化过程中,影响因素除了内链和原创内容外,外链也是影响站外SEO成功与否的关键.外链优化不是指要无限的增加外链数量,而是要比较注重它的品质.只有这类外链才会对网站优化权重会起一定的辅助性作用,下面就由星梦网络来谈下在网站优化中如何提升外链质量. 网站外链需要多样性 在进行站外优化中,增长外链不要知道它的数量外而忽略了它的多样性.在网站优化中,我们要不断收集各行各业的网站外链资源,也可以在这些不同的外链资源中留下文本链接,而且最好是文本超链接.虽然现在有许多可以带外链的网站,但是在有些网站中

浅谈在网站优化中获取高质量外链有哪些渠道

在网站优化过程过,有一个是比较让一些站长头疼的事,那就是寻找网站外链的渠道.有的网站可以让我们带外链但是JS形式,有的网站可以带超链接的但里面却加了nofollow标签,这些外链资源加了也等于没有加.那么我们在网站优化中,到底获取高质量外链有哪些渠道呢? 新闻源媒体 其实现在在网上有许多可以投稿的高权重新闻媒体,这些网站除了有比较高的人气和流量外,而且你所投的稿子被第三方网站转载的频率是相当高的,前提是你的稿子质量和相关性都比较好,这样带来的效果也是比较不错的. 如果是比较有实力的站长,你也可以

URL优化中6个需要注意的事项

在网站的优化中,URL的优化是大家经常的忽视的一个方面,但是URL的优化也同样是非常重要的,这里就和大家谈谈我是怎么处理这些问题的,希望这些经验对大家有所帮助! 1:域名的选择 不要为了让域名中出现关键词而全拼域名,这样我们的域名就显得非常的长了,也不要为了放关键词,注册带有连词符的域名. 2:文件夹命名 整个URL包括域名,文件名,用网站合适的关键词,尤其是文件名.让浏览者一看到看到URL,就可以大致了解这个网页是什么内容,Z-BLOG在这一点就做的非常的好,我搜索我自己博客的关键词,发现在U