0

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

    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       }

我想可能会缓存这个结果并在它的父母之一移动或调整大小时使其无效,但首先我想知道是否有任何明显的优化。

谢谢

4

1 回答 1

1

您的问题是您每次都在重新计算父母的位置。你需要做的是一个递归算法来一次计算它们。例如:

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

于 2012-04-07T12:23:24.743 回答