个人认为存在这样一个缺陷,求官方确认/证否/解决。
设spriteX使用customCommand进行了自定义绘制
class CspriteX:public Sprite{
public:
float m_XXX;
void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags){
_customCommand.init(_globalZOrder);
_customCommand.func = CC_CALLBACK_0(Cc3dSubMesh::onDraw,this, transform, flags);
renderer->addCommand(&_customCommand);
}
void onDraw(const Mat4& modelMat, uint32_t flags){
//依赖m_XXX属性的绘制代码
}
};
假设有下面一段代码:
CspriteX*spriteX=CspriteX::create();
spriteX->init(…);
spriteX->m_XXX=0;
scene->addChild(spriteX);
…
float oldXXX=spriteX->m_XXX;//备份m_XXX
spriteX->m_XXX=100;//修改m_XXX
renderTexture->begin();
scene->visit();
renderTexture->end();
spriteX->m_XXX=oldXXX;//恢复m_XXX
问:最后渲染到renderTexture的是spriteX(m_XXX==0)还是spriteX(m_XXX==100)?
显然,写上面代码的人希望的结果是spriteX(m_XXX==100),但是在3.x的command机制下得到的结果却是spriteX(m_XXX==0)。
一般性地说就是:
在当前3.x的command渲染机制下,如果用户scene中含有使用customCommand自定义绘图的节点,则用户就没办法在render to texture时临改变和恢复节点的属性。
这相对于2.x的立即模式是一个很大的缺陷。
补充:
造成这个问题有的根源是:3.x使用的command机制是一种延迟渲染,但是延迟渲染基本要求是一定要把渲染数据完整地保存到渲染队列里,这样才能保证最后执行command的时候的数据与当初添加command的时候的数据是完全一致的。但是customCommand没有做到“完整保存数据”这一条,它只保存了一个onDraw函数指针,而等到执行customCommand时onDraw函数里的数据可能已经改变了(比如用户主动修改),于是就产生customCommand执行结果非用户预期的问题。

僵尸贴