优化获取Widget的绝对矩形

Optimizing getting absolute rectangle of Widget?

本文关键字:获取 Widget 优化      更新时间:2023-10-16

我正在分析我的游戏,似乎我在这里花了很多时间:

    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的级别,而不必每次都在根目录下调用它。