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