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文件的解析器,並不現實,所以只對於按鈕這一類資源很少的還能適用,但是對於其他(例如筆主曾經想用像素檢測實現碰撞檢測)就不合適了。

發佈了34 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章