2012-04-07 4 views
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  } 

私は多分これの結果をキャッシュし、その両親のいずれかが移動またはサイズ変更が、最初のIときにそれを無効にすると思いました明らかな最適化があるかどうかを知りたい。

ありがとうございました

答えて

1

あなたの問題は、毎回親の位置を再計算していることです。あなたがする必要があるのは、すべてを一度に計算するための再帰的なアルゴリズムです。

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

関連する問題