在cocos3.x版本
void Director::pushMatrix(MATRIX_STACK_TYPE type)和void Director::popMatrix(MATRIX_STACK_TYPE type)显得多余
修改如下:
void Director::popMatrix(MATRIX_STACK_TYPE type)
{
return;
//if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type)
//{
// _modelViewMatrixStack.pop();
//}
//else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type)
//{
// _projectionMatrixStack.pop();
//}
//else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type)
//{
// _textureMatrixStack.pop();
//}
//else
//{
// CCASSERT(false, "unknow matrix stack type");
//}
}
void Director::pushMatrix(MATRIX_STACK_TYPE type)
{
return;
//if(type == MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW)
//{
// _modelViewMatrixStack.push(_modelViewMatrixStack.top());
//}
//else if(type == MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION)
//{
// _projectionMatrixStack.push(_projectionMatrixStack.top());
//}
//else if(type == MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE)
//{
// _textureMatrixStack.push(_textureMatrixStack.top());
//}
//else
//{
// CCASSERT(false, "unknow matrix stack type");
//}
}
在Camera.h
添加受保护变量mutable bool _viewDirty;
并初始化, _viewDirty(true)
修改const Mat4& Camera::getViewMatrix() const
{
/*Mat4 viewInv(getNodeToWorldTransform());
static int count = sizeof(float) * 16;
if (memcmp(viewInv.m, _viewInv.m, count) != 0)
{
_viewProjectionDirty = true;
_frustumDirty = true;
_viewInv = viewInv;
_view = viewInv.getInversed();
}
return _view;*/
if (_viewDirty)
{
Mat4 viewInv(getNodeToWorldTransform());
static int count = sizeof(float) * 16;
if (memcmp(viewInv.m, _viewInv.m, count) != 0)
{
_viewProjectionDirty = true;
_frustumDirty = true;
_viewInv = viewInv;
_view = viewInv.getInversed();
}
_viewDirty = false;
}
return _view;
并在void Camera::lookAt(const Vec3& lookAtPos, const Vec3& up)和void Camera::setAdditionalProjection(const Mat4& mat) 和
bool Camera::initPerspective(float fieldOfView, float aspectRatio, float nearPlane, float farPlane)和
bool Camera::initOrthographic(float zoomX, float zoomY, float nearPlane, float farPlane)函数下均添加以下语句
_viewDirty = true;
此优化可减少降帧