From 2cc3ce72b3f7abf037e554b04850e627a9d8eb5f Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Tue, 9 Jun 2015 15:41:11 -0700 Subject: DD-359 : Improve performance by caching display data while updating and preventing refreshing the whole marketplace (never useful) --- indra/newview/llinventorybridge.cpp | 31 +++++++++++++++++++++++-------- indra/newview/llinventorybridge.h | 6 ++++-- indra/newview/llinventoryfunctions.cpp | 13 +++++++++++-- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 4a82cb5eac..521eefe583 100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -203,7 +203,6 @@ const std::string& LLInvFVBridge::getDisplayName() const { buildDisplayName(); } - return mDisplayName; } @@ -4292,6 +4291,14 @@ void LLFolderBridge::modifyOutfit(BOOL append) // +=================================================+ // LLMarketplaceFolderBridge is a specialized LLFolderBridge for use in Marketplace Inventory panels +LLMarketplaceFolderBridge::LLMarketplaceFolderBridge(LLInventoryPanel* inventory, + LLFolderView* root, + const LLUUID& uuid) : +LLFolderBridge(inventory, root, uuid) +{ + m_depth = depth_nesting_in_marketplace(mUUID); + m_stockCountCache = COMPUTE_STOCK_NOT_EVALUATED; +} LLUIImagePtr LLMarketplaceFolderBridge::getIcon() const { @@ -4306,8 +4313,12 @@ LLUIImagePtr LLMarketplaceFolderBridge::getIconOpen() const LLUIImagePtr LLMarketplaceFolderBridge::getMarketplaceFolderIcon(BOOL is_open) const { LLFolderType::EType preferred_type = getPreferredType(); - S32 depth = depth_nesting_in_marketplace(mUUID); - if ((preferred_type == LLFolderType::FT_NONE) && (depth == 2)) + if (!LLMarketplaceData::instance().isUpdating(getUUID())) + { + // Skip computation (expensive) if we're waiting for updates. Use the old value in that case. + m_depth = depth_nesting_in_marketplace(mUUID); + } + if ((preferred_type == LLFolderType::FT_NONE) && (m_depth == 2)) { // We override the type when in the marketplace listings folder and only for version folder preferred_type = LLFolderType::FT_MARKETPLACE_VERSION; @@ -4345,12 +4356,16 @@ std::string LLMarketplaceFolderBridge::getLabelSuffix() const suffix += " (" + LLTrans::getString("MarketplaceActive") + ")"; } // Add stock amount - S32 stock_count = compute_stock_count(getUUID()); - if (stock_count == 0) + if (!LLMarketplaceData::instance().isUpdating(getUUID())) + { + // Skip computation (expensive) if we're waiting for update anyway. Use the old value in that case. + m_stockCountCache = compute_stock_count(getUUID()); + } + if (m_stockCountCache == 0) { suffix += " (" + LLTrans::getString("MarketplaceNoStock") + ")"; } - else if (stock_count != COMPUTE_STOCK_INFINITE) + else if (m_stockCountCache != COMPUTE_STOCK_INFINITE) { if (getPreferredType() == LLFolderType::FT_MARKETPLACE_STOCK) { @@ -4360,13 +4375,13 @@ std::string LLMarketplaceFolderBridge::getLabelSuffix() const { suffix += " (" + LLTrans::getString("MarketplaceMax"); } - if (stock_count == COMPUTE_STOCK_NOT_EVALUATED) + if (m_stockCountCache == COMPUTE_STOCK_NOT_EVALUATED) { suffix += "=" + LLTrans::getString("MarketplaceUpdating") + ")"; } else { - suffix += "=" + llformat("%d", stock_count) + ")"; + suffix += "=" + llformat("%d", m_stockCountCache) + ")"; } } // Add updating suffix diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 6d027ae115..26f8dd37b4 100755 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -697,8 +697,7 @@ public: // Overloads some display related methods specific to folders in a marketplace floater context LLMarketplaceFolderBridge(LLInventoryPanel* inventory, LLFolderView* root, - const LLUUID& uuid) : - LLFolderBridge(inventory, root, uuid) { } + const LLUUID& uuid); virtual LLUIImagePtr getIcon() const; virtual LLUIImagePtr getIconOpen() const; @@ -707,6 +706,9 @@ public: private: LLUIImagePtr getMarketplaceFolderIcon(BOOL is_open) const; + // Those members are mutable because they are cached variablse to speed up display, not a state variables + mutable S32 m_depth; + mutable S32 m_stockCountCache; }; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 4feb697af9..e245fd2d59 100755 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -2576,6 +2576,7 @@ void LLInventoryAction::buildMarketplaceFolders(LLFolderView* root) // containing folder will need to be updated as well as their initially containing folder. For // instance, moving a stock folder from a listed folder to another will require an update of the // target listing *and* the original listing. So we need to keep track of both. + // Note: do not however put the marketplace listings root itself in this list or the whole marketplace data will be rebuilt. sMarketplaceFolders.clear(); const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS, false); std::set selected_items = root->getSelectionList(); @@ -2586,8 +2587,16 @@ void LLInventoryAction::buildMarketplaceFolders(LLFolderView* root) viewModel = dynamic_cast((*set_iter)->getViewModelItem()); if (viewModel && gInventory.isObjectDescendentOf(viewModel->getInventoryObject()->getParentUUID(), marketplacelistings_id)) { - sMarketplaceFolders.push_back(viewModel->getInventoryObject()->getParentUUID()); - sMarketplaceFolders.push_back(viewModel->getInventoryObject()->getUUID()); + const LLUUID &parent_id = viewModel->getInventoryObject()->getParentUUID(); + if (parent_id != marketplacelistings_id) + { + sMarketplaceFolders.push_back(parent_id); + } + const LLUUID &curr_id = viewModel->getInventoryObject()->getUUID(); + if (curr_id != marketplacelistings_id) + { + sMarketplaceFolders.push_back(curr_id); + } } } // Suppress dupes in the list so we won't update listings twice -- cgit v1.2.3