cocos2dX 3.x获取渲染Image

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文件的解析器,并不现实,所以只对于按钮这一类资源很少的还能适用,但是对于其他(例如笔主曾经想用像素检测实现碰撞检测)就不合适了。

你可能感兴趣的:(cocos2dX 3.x获取渲染Image)