cocos2d 会自动裁剪掉屏幕外的图片吗

cocos2d 会自动裁剪掉屏幕外的图片以节省资源吗

1、因为我的游戏里的地图有些地方精灵少有的地方精灵多,只要我将屏幕移动到地图精灵少的地方帧数就高,所以又这个疑问

2、还有我的地图里的所有精灵都是用CCSpriteBatchNode添加的,但还是会产生上面的问题,为什么呢,CCSpriteBatchNode不是能让所有的精灵变成一张图片来渲染吗

3.x 之后版本都会自动剪裁,任何节点都会剪裁

3.x实现了自动剔除功能。

目前,自动剔除功能只在 Sprite 对象中实现。

当 Sprite::draw() 被调用的时候,它将会检查 Sprite 是否超出屏幕,如果是的话,它将不会发送 QuadCommand 命令给 渲染器,因此可以获得一些性能上的提升。

可是我的版本是2.2.2的啊,,,怎么解释这个现象呢

(1)3.x才有的auto-culling,2.x应该不存在这个问题,能提供一个测试例给我么?可以私信我。

(2)CCSpriteBatchNode是要求精灵要在同一张纹理上的。这方面的介绍论坛资源还是比较多的。3.x实现了auto-batch功能,但是使用上会有一定的限制,这个请参考官方的release note。

测试用例是公司的东东,不敢外泄啊,不然就诛九族了,但确实是精灵多的地方就卡,精灵少的地方就不卡,比如我这个用例是横版地图,用手指从左往右滑动这个地图就会从精灵少的地方到精灵多的地方,然后就会发现左下角那个帧数慢慢变低,,,这些精灵都是CCSpriteBatchNode来add上去的,有没有可能是普通精灵不会auto-culling但CCSpriteBatchNode精灵会呢

不是的,你可以看下这个函数的实现:

void Sprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)

auto-culling只是判断了一下Sprite大小和位置,然后确认是否在screen内,以确定是否进行渲染。

上面那个函数是3.0版本才有的吧,我这个版本的是void CCSprite::draw(void),且不说3.0的版本,就目前我这个2.2.2的版本为啥会出这个问题呢,,,

正常是不会,所以我也很好奇,希望能提供个测试例以便分析。

你可以自己写一个小的东西测测啊,我当时就是写战争迷雾发现到雾多的地方就卡了,这些雾就是很多个小精灵集成的的CCSpriteBatchNode

我认为这个是OpenGL的裁剪的作用,虽然你的地图都提交到OpenGL中去渲染的了,但是屏幕外的外的东西会被摄像机的锥体给裁剪掉,最终会写进帧缓存中像素就是你屏幕中看到的那些精灵,超出屏幕外的精灵像素被丢弃,可能精灵少的地方可能就是这一步提高了帧率。