优化获取Widget的绝对矩形
Optimizing getting absolute rectangle of Widget?
我正在分析我的游戏,似乎我在这里花了很多时间:
const Rectangle Widget::getAbsoluteRectangle() const
0.01s {
Point absLocation;
0.00s absLocation = getLocation();
if(!getParent())
{
return Rectangle(absLocation.getX(),absLocation.getY(),
getSize().getWidth(),getSize().getHeight());
}
const Widget* parent = this;
int eX = 0;
int eY = 0;
while(parent->getParent() != NULL)
{
0.02s parent = parent->getParent();
0.01s eX = parent->getMargin(SIDE_LEFT);
0.04s eY = parent->getMargin(SIDE_TOP);
0.03s absLocation.setX(absLocation.getX() + parent->getLocation().getX() + eX);
0.04s absLocation.setY(absLocation.getY() + parent->getLocation().getY() + eY);
}
0.02s return Rectangle(absLocation,getSize());
0.01s }
我想缓存这个结果,并在它的一个父级移动或调整大小时使其无效,但首先我想知道是否有任何明显的优化。
感谢
您的问题是每次都要重新计算父对象的位置。你需要做的是一个递归算法来同时计算它们。例如:
class Widget {
public:
Rectangle AbsolutePosition;
Rectangle RelativePosition;
std::vector<Widget*> children;
void ComputePositions(Rectangle ParentPosition) {
ComputeAbsoluteFromParentAndRelative(ParentPosition);
std::for_each(children.begin(), children.end(), [&](Widget* child) {
child->ComputePositions(AbsolutePosition);
});
}
};
使用这种方法,每个小部件的位置只计算一次,并且当前的绝对位置已经缓存。此外,如果必要的话,循环可以并行化,因为每次迭代都是独立的。最后,您可以轻松地控制调用ComputePositions
的级别,而不必每次都在根目录下调用它。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- 从python中调用C++函数并获取返回值
- 如何获取一个数字的前3位
- 获取字符串的长度并将其分配给数组
- 无法获取菜单选择以运行函数.C++
- 数组长度,为什么从命令行获取时不能使用它?
- Boost Spirit,获取迭代器内部语义动作
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 优化获取Widget的绝对矩形
- QTableWidget项获取Widget类型并访问它
- 从Calendar Widget获取日期到标签