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       }

親の1つが移動またはサイズ変更されたときに、この結果をキャッシュして無効にすることを考えましたが、最初に明らかな最適化があるかどうかを知りたいです。

ありがとう

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);
        });
    }
};

このメソッドを使用すると、各ウィジェットの位置が正確に 1 回だけ計算され、現在の絶対位置が既にキャッシュされています。さらに、各反復は独立しているため、必要に応じて簡単にループを並列化できます。ComputePositions最後に、毎回ルートで呼び出すのではなく、呼び出されるレベルを簡単に制御できます。

于 2012-04-07T12:23:24.743 に答える