2

std::map のパフォーマンスに問題があります。私の C++ プロジェクトには、GUIObjects も含むWindows のリストがあります。for次のように、すべてをループで描画します。

unsigned int guiObjectListSize = m_guiObjectList.size();
for(unsigned int i = 0; i < guiObjectListSize; i++)
{
    GUIObject* obj = m_guiObjectList[i];
    if(obj->getParentId() < 0)
    obj->draw();                                
}

この場合、プロジェクトを実行すると、スムーズに動作します。4 つのウィンドウと、ボタンなどの他のコンポーネントがいくつかあります。

しかし、ウィンドウの描画を個別に処理したいので、変更後、私のコードは次のようになります。

// Draw all objects except windows
unsigned int guiObjectListSize = m_guiObjectList.size();
for(unsigned int i = 0; i < guiObjectListSize; i++)
{
    GUIObject* obj = m_guiObjectList[i];
    if((obj->getParentId() < 0) && (dynamic_cast<Window*>(obj) == nullptr))
        obj->draw();        // GUIManager should only draw objects which don't have parents specified
                            // And those that aren't instances of Window class
                            // Rest objects will be drawn by their parents
                            // But only if that parent is able to draw children (i.e. Window or Layout)
}

// Now draw windows
for(int i = 1; i <= m_windowList.size(); i++)
{
    m_windowList[i]->draw(); // m_windowList is a map!
}

std::map<int, Window*>s のz インデックスをマップ内の sWindowとして設定する必要があるため、を作成しました。keyしかし問題は、このコードを実行すると非常に遅いことです。4 つのウィンドウ (マップ サイズは 4) しかありませんが、fps レートが非常に低いことがわかります。そのようなカウンターをまだ実装していないため、正確な数は言えません。

このアプローチが非常に遅い理由を誰か教えてもらえますか?

4

2 に答える 2

4

これが仮想関数の目的です。遅い を排除するだけでなくdynamic_cast、より柔軟な型チェックが得られます。

// Draw all objects except windows
unsigned int guiObjectListSize = m_guiObjectList.size();
for(unsigned int i = 0; i < guiObjectListSize; i++)
{
    GUIObject* obj = m_guiObjectList[i];
    if(obj->getParentId() < 0)
        obj->drawFirstChance();
}

// Now draw windows
for(int i = 1; i <= m_windowList.size(); i++)
{
    m_windowList[i]->drawSecondChance();
}

ウィンドウやその他の浮動オブジェクトに対しては、 WheredrawFirstChanceは何もしません。

次の最適化の機会は、ウィンドウ リストを avectorにし、それが変更された場合にのみ z オーダーの並べ替えを実行することです (ウィンドウが作成/破棄/並べ替えされる頻度は、描画されるよりもはるかに少ないと仮定します)。

于 2012-12-04T12:38:39.350 に答える
2

このコードの問題は、std::mapの使用にあるようには見えません。代わりに、ボトルネックはむしろの使用ですdynamic_cast。これは、指定されたクラスの継承ツリーをさまよっている必要があるため、非常にコストのかかる操作です。

このツリーは、GUIコンポーネントにとってはかなり大きい可能性があります。これは、各反復でこれを行うと、アプローチ全体の速度が低下する理由を明確に説明します。

于 2012-12-04T12:27:53.607 に答える