Cocos2d-x优化中关于背景图片优化

2015年03月23日 11:34 0 点赞 0 评论 更新于 2025-11-21 18:14

由于背景图片会在场景中长时间保存,且数量较多,因此有必要对其进行优化。我们可以从以下几个方面来考虑优化:

1. 不要Alpha通道

背景图片通常不需要透明效果,所以纹理格式可采用不带有Alpha通道的格式,RGB565格式就比较适合背景图片。

2. 拼图

背景图片与其他图片的纹理格式有所不同。在创建精灵表时,无法将RGB565格式的背景图片与其他纹理图片(如RGBA4444)合并到一个精灵表中。基于格式的考虑,我们可以将多个背景图片放置在一个精灵表中,但要注意,拼接成的大图文件不能太大,因为一些老设备对单个文件大小有限制。例如,iPod touch 4单个文件不能超过2048 * 2048像素大小。

3. 加载到纹理缓存的时机

何时将背景图片加载到纹理缓存,主要取决于该背景图片所在场景的使用频率。如果使用频率较高,应在游戏初始化时进行加载;对于使用频率较低的场景背景图片,可以考虑在进入场景时加载。由于背景图片通常较大,加载时间较长,在加载时可考虑采用异步加载的方式。

4. 小纹理图片,重复贴图

如果场景的背景采用单色或有规律的图形,可采用小纹理图片重复贴图来实现。在第8章案例中,我们使用了一个128×128的纹理图片(BackgroundTile.png)进行反复贴图,这样可以减少内存消耗。核心代码如下:

// 贴图的纹理图片宽高必须是2的n次幂,128×128
auto bg = Sprite::create("BackgroundTile.png",
Rect(0, 0, visibleSize.width, visibleSize.height));
// 贴图的纹理参数,水平重复平铺,垂直重复平铺
Texture2D::TexParams tp = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT};
bg->getTexture()->setTexParameters(tp);
bg->setPosition(origin + Vec2(visibleSize.width / 2, visibleSize.height / 2));
addChild(bg, 0);

5. 考虑使用瓦片地图

背景可以考虑采用瓦片地图来实现。瓦片地图只需几个小图片就能构建一个很大的游戏背景,其性能表现自然不言而喻。然而,它的缺点是由于采用几个瓦片拼接而成,背景上会有很多重复的区域。如果用户不在乎这些,那么选择瓦片地图构建背景是首选方式。另外,在设计瓦片地图时,地图中的层不要超过4层。

6. 背景z深度的优化

有时为了达到动态视差效果,背景会被分成几个图片。例如,我们可以把云、树木、草地和山分别放置在不同的背景图片中,通过设置z轴顺序(z - order)来实现。以下是相关代码:

bool AppDelegate::applicationDidFinishLaunching() {
// ...
director->setDepthTest(true);
return true;
}

director->setDepthTest(true)用于开启深度测试,其中directorDirector类的对象指针。深度测试默认是关闭的,开启深度测试会消耗更多的电量。

作者信息

menghao

menghao

共发布了 3994 篇文章