cocos2dX 3.x获取渲染Image

来源:互联网 发布:淘宝卖家开店时间查询 编辑:程序博客网 时间:2024/06/05 20:16

cocos2dx 3.x开始采用了异步渲染机制,以前在2.x版本采用重绘获取图片Image对象的放法会出现一点小bug,最近查找资料解决了这个问题,有一点思考:

bool ControllerLayer::getNewImg(Sprite* img){    img->retain();    RenderTexture* pRender = RenderTexture::create(img->getContentSize().width, img->getContentSize().height, Texture2D::PixelFormat::RGBA8888);    //插入render队列    pRender->beginWithClear(0.0f, 0.0f, 0.0f, 0.0f);    img->visit();    pRender->end();    pRender->retain();    //执行渲染    Director::getInstance()->getRenderer()->render();    auto imgPixel = pRender->newImage();    _imgPixelData = imgPixel->getData();    pRender->clear(0, 0, 0, 0);    if (pRender)    {        delete pRender;        pRender = NULL;    }    return true;}

对异步渲染一点粗浅的了解,现在需要手动执行render()进行当前对象的单独渲染,不然的话会将RenderTexture对象加入render队列,不同时执行绘制,你得到的RenderTexture指针会指向一个空对象,这个空对象会在下一帧进行渲染。

cocos2dx对gl绘图做了很大程度上的封装,使用重绘获取纹理不宜大量使用,这会大量增加绘制次数,降低绘制效率,不过用来判断不规则图形边缘还是一个不错的方法。

还有一种解决方案是采用Image对象来初始化Texture2D对象,但是这样在处理缓存的时候效率会大大降低,cocos并没有封装对于Image的缓存(这一点不确定,没见过有人这样使用),需要大量使用的话就得自己写Image缓存管理的类以及对plist文件的解析器,并不现实,所以只对于按钮这一类资源很少的还能适用,但是对于其他(例如笔主曾经想用像素检测实现碰撞检测)就不合适了。

0 0
原创粉丝点击