吐槽这个自动裁剪,关于性能优化方面,没有哪种策略能做到在任何情景下皆最优,希望能把裁剪策略做为一个可拆卸(自定义)的方式,提供给开发者选择裁剪策略的权利!
目前的裁剪算法是基于图素树遍历裁剪每一个,这种最简单的遍历裁剪算法对于一般的休闲游戏来说没有问题,但对于规模大点并每贞移动的场景来说,简直是灾难,就举个极端点的例子吧,假设做的是赛车游戏,游戏地图很大,是多种titile拼接的,假设1屏幕的小快数量是20*10,上面还会有很多物件,如果什么都不做,使用引擎自带的自动裁剪,贞速率会成为一个灾难。 所以必须使用更高效的裁剪算法,如四叉树、基于视口矩形的快速裁剪算法,现在问题来了,在做好裁剪后,最终已经经过新算法的确认在视口画出的元素,还要经过这个函数再检测一遍
bool Renderer::checkVisibility(const Mat4 &transform, const Size &size)
{
auto scene = Director::getInstance()->getRunningScene();
// only cull the default camera. The culling algorithm is valid for default camera.
if (scene && scene->_defaultCamera != Camera::getVisitingCamera())
return true;
// half size of the screen
Size screen_half = Director::getInstance()->getWinSize();
screen_half.width /= 2;
screen_half.height /= 2;
float hSizeX = size.width/2;
float hSizeY = size.height/2;
Vec4 v4world, v4local;
v4local.set(hSizeX, hSizeY, 0, 1);
transform.transformVector(v4local, &v4world);
// center of screen is (0,0)
v4world.x -= screen_half.width;
v4world.y -= screen_half.height;
// convert content size to world coordinates
float wshw = std::max(fabsf(hSizeX * transform.m + hSizeY * transform.m), fabsf(hSizeX * transform.m - hSizeY * transform.m));
float wshh = std::max(fabsf(hSizeX * transform.m + hSizeY * transform.m), fabsf(hSizeX * transform.m - hSizeY * transform.m));
// compare if it in the positive quadrant of the screen
float tmpx = (fabsf(v4world.x)-wshw);
float tmpy = (fabsf(v4world.y)-wshh);
bool ret = (tmpx < screen_half.width && tmpy < screen_half.height);
return ret;
}
200遍啊200遍!