summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKelly Washington <kelly@lindenlab.com>2012-11-12 14:15:22 -0800
committerKelly Washington <kelly@lindenlab.com>2012-11-12 14:15:22 -0800
commit014edb89e82ef55363c39dd80a6076612db20123 (patch)
treeccff3fcffd89aa3f9be67505e94e1f6e66d832e6
parentb9a92f2b4867e2b3e88bff59de3df6dfed77e746 (diff)
MAINT-1897 Poor performance viewing large group member lists
* Use LLAvatarNameCache in group UI to match what namelists use and prevent double lookups * Remove LLSD -> Prams legacy pattern which is super slow. * Member list on general tab only adds to the list after names are known
-rw-r--r--indra/newview/llpanelgroup.h2
-rw-r--r--indra/newview/llpanelgroupgeneral.cpp101
-rw-r--r--indra/newview/llpanelgroupgeneral.h6
-rw-r--r--indra/newview/llpanelgrouproles.cpp54
-rw-r--r--indra/newview/llpanelgrouproles.h2
5 files changed, 85 insertions, 80 deletions
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index b494c7d403..0e6f5b8924 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -33,7 +33,7 @@
class LLOfferInfo;
-const S32 UPDATE_MEMBERS_PER_FRAME = 500;
+const F32 UPDATE_MEMBERS_SECONDS_PER_FRAME = 0.005; // 5ms
// Forward declares
class LLPanelGroupTab;
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index f6ce7de47e..294b65e994 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -28,8 +28,10 @@
#include "llpanelgroupgeneral.h"
-#include "lluictrlfactory.h"
+#include "llavatarnamecache.h"
#include "llagent.h"
+#include "llsdparam.h"
+#include "lluictrlfactory.h"
#include "roles_constants.h"
// UI elements
@@ -668,6 +670,7 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
{
mMemberProgress = gdatap->mMembers.begin();
mPendingMemberUpdate = TRUE;
+ mUdpateSessionID.generate();
sSDTime = 0.0f;
sElementTime = 0.0f;
@@ -696,76 +699,47 @@ void LLPanelGroupGeneral::updateMembers()
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
- if (!mListVisibleMembers || !gdatap
+ if (!mListVisibleMembers
+ || !gdatap
|| !gdatap->isMemberDataComplete()
|| gdatap->mMembers.empty())
{
return;
}
- static LLTimer all_timer;
- static LLTimer sd_timer;
- static LLTimer element_timer;
+ LLTimer update_time;
+ update_time.setTimerExpirySec(UPDATE_MEMBERS_SECONDS_PER_FRAME);
- all_timer.reset();
- S32 i = 0;
+ LLAvatarName av_name;
- for( ; mMemberProgress != gdatap->mMembers.end() && i<UPDATE_MEMBERS_PER_FRAME;
+ S32 i = 0;
+ for( ; mMemberProgress != gdatap->mMembers.end() && !update_time.hasExpired();
++mMemberProgress, ++i)
{
- lldebugs << "Adding " << mMemberProgress->first << ", " << mMemberProgress->second->getTitle() << llendl;
LLGroupMemberData* member = mMemberProgress->second;
if (!member)
{
continue;
}
- // Owners show up in bold.
- std::string style = "NORMAL";
- sd_timer.reset();
- LLSD row;
- row["id"] = member->getID();
- row["columns"][0]["column"] = "name";
- row["columns"][0]["font"]["name"] = "SANSSERIF_SMALL";
- row["columns"][0]["font"]["style"] = style;
- // value is filled in by name list control
-
- row["columns"][1]["column"] = "title";
- row["columns"][1]["value"] = member->getTitle();
- row["columns"][1]["font"]["name"] = "SANSSERIF_SMALL";
- row["columns"][1]["font"]["style"] = style;
-
- std::string status = member->getOnlineStatus();
-
- row["columns"][2]["column"] = "status";
- row["columns"][2]["value"] = status;
- row["columns"][2]["font"]["name"] = "SANSSERIF_SMALL";
- row["columns"][2]["font"]["style"] = style;
-
- sSDTime += sd_timer.getElapsedTimeF32();
-
- element_timer.reset();
- LLScrollListItem* member_row = mListVisibleMembers->addElement(row);
-
- if ( member->isOwner() )
+ if (LLAvatarNameCache::get(mMemberProgress->first, &av_name))
+ {
+ addMember(mMemberProgress->second);
+ }
+ else
{
- LLScrollListText* name_textp = dynamic_cast<LLScrollListText*>(member_row->getColumn(0));
- if (name_textp)
- name_textp->setFontStyle(LLFontGL::BOLD);
+ // If name is not cached, onNameCache() should be called when it is cached and add this member to list.
+ LLAvatarNameCache::get(mMemberProgress->first,
+ boost::bind(&LLPanelGroupGeneral::onNameCache,
+ this, mUdpateSessionID, member, _1, _2));
}
- sElementTime += element_timer.getElapsedTimeF32();
}
- sAllTime += all_timer.getElapsedTimeF32();
- lldebugs << "Updated " << i << " of " << UPDATE_MEMBERS_PER_FRAME << "members in the list." << llendl;
+ llinfos << "Updated " << i << " members in " << (F32)(1000.0 * update_time.getElapsedTimeF32()) << "ms this frame." << llendl;
if (mMemberProgress == gdatap->mMembers.end())
{
lldebugs << " member list completed." << llendl;
mListVisibleMembers->setEnabled(TRUE);
-
- lldebugs << "All Time: " << sAllTime << llendl;
- lldebugs << "SD Time: " << sSDTime << llendl;
- lldebugs << "Element Time: " << sElementTime << llendl;
}
else
{
@@ -774,6 +748,39 @@ void LLPanelGroupGeneral::updateMembers()
}
}
+void LLPanelGroupGeneral::addMember(LLGroupMemberData* member)
+{
+ LLNameListCtrl::NameItem item_params;
+ item_params.value = member->getID();
+
+ LLScrollListCell::Params column;
+ item_params.columns.add().column("name").font.name("SANSSERIF_SMALL");
+
+ item_params.columns.add().column("title").value(member->getTitle()).font.name("SANSSERIF_SMALL");
+
+ item_params.columns.add().column("status").value(member->getOnlineStatus()).font.name("SANSSERIF_SMALL");
+
+ LLScrollListItem* member_row = mListVisibleMembers->addNameItemRow(item_params);
+
+ if ( member->isOwner() )
+ {
+ LLScrollListText* name_textp = dynamic_cast<LLScrollListText*>(member_row->getColumn(0));
+ if (name_textp)
+ name_textp->setFontStyle(LLFontGL::BOLD);
+ }
+}
+
+void LLPanelGroupGeneral::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name)
+{
+ if (!member
+ || update_id != mUdpateSessionID)
+ {
+ return;
+ }
+
+ addMember(member);
+}
+
void LLPanelGroupGeneral::updateChanged()
{
// List all the controls we want to check for changes...
diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h
index 88c092c461..b179f78c56 100644
--- a/indra/newview/llpanelgroupgeneral.h
+++ b/indra/newview/llpanelgroupgeneral.h
@@ -38,6 +38,7 @@ class LLNameListCtrl;
class LLCheckBoxCtrl;
class LLComboBox;
class LLSpinCtrl;
+class LLAvatarName;
class LLPanelGroupGeneral : public LLPanelGroupTab
{
@@ -62,6 +63,7 @@ public:
virtual void setupCtrls (LLPanel* parent);
+ void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name);
private:
void reset();
@@ -75,7 +77,8 @@ private:
static void onReceiveNotices(LLUICtrl* ctrl, void* data);
static void openProfile(void* data);
- S32 sortMembersList(S32,const LLScrollListItem*,const LLScrollListItem*);
+ S32 sortMembersList(S32,const LLScrollListItem*,const LLScrollListItem*);
+ void addMember(LLGroupMemberData* member);
static bool joinDlgCB(const LLSD& notification, const LLSD& response);
@@ -87,6 +90,7 @@ private:
BOOL mChanged;
BOOL mFirstUse;
std::string mIncompleteMemberDataStr;
+ LLUUID mUdpateSessionID;
// Group information (include any updates in updateChanged)
LLLineEditor *mGroupNameEditor;
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index bbe47ae943..5720168f81 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -29,6 +29,7 @@
#include "llcheckboxctrl.h"
#include "llagent.h"
+#include "llavatarnamecache.h"
#include "llbutton.h"
#include "llfiltereditor.h"
#include "llfloatergroupinvite.h"
@@ -1584,25 +1585,22 @@ void LLPanelGroupMembersSubTab::addMemberToList(LLUUID id, LLGroupMemberData* da
LLUIString donated = getString("donation_area");
donated.setArg("[AREA]", llformat("%d", data->getContribution()));
- LLSD row;
- row["id"] = id;
+ LLNameListCtrl::NameItem item_params;
+ item_params.value = id;
- row["columns"][0]["column"] = "name";
- // value is filled in by name list control
+ item_params.columns.add().column("name").font.name("SANSSERIF_SMALL").style("NORMAL");
- row["columns"][1]["column"] = "donated";
- row["columns"][1]["value"] = donated.getString();
+ item_params.columns.add().column("donated").value(donated.getString())
+ .font.name("SANSSERIF_SMALL").style("NORMAL");
- row["columns"][2]["column"] = "online";
- row["columns"][2]["value"] = data->getOnlineStatus();
- row["columns"][2]["font"] = "SANSSERIF_SMALL";
-
- mMembersList->addElement(row);
+ item_params.columns.add().column("online").value(data->getOnlineStatus())
+ .font.name("SANSSERIF_SMALL").style("NORMAL");
+ mMembersList->addNameItemRow(item_params);
mHasMatch = TRUE;
}
-void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, const LLUUID& id)
+void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name)
{
// Update ID is used to determine whether member whose id is passed
// into onNameCache() was passed after current or previous user-initiated update.
@@ -1612,21 +1610,15 @@ void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, const LLUUI
// we do nothing.
if (mUdpateSessionID != update_id) return;
- LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
- if (!gdatap)
+ if (!member)
{
- llwarns << "LLPanelGroupMembersSubTab::updateMembers() -- No group data!" << llendl;
return;
}
- std::string fullname;
- gCacheName->getFullName(id, fullname);
-
- LLGroupMemberData* data;
// trying to avoid unnecessary hash lookups
- if (matchesSearchFilter(fullname) && ((data = gdatap->mMembers[id]) != NULL))
+ if (matchesSearchFilter(av_name.getLegacyName()))
{
- addMemberToList(id, data);
+ addMemberToList(id, member);
if(!mMembersList->getEnabled())
{
mMembersList->setEnabled(TRUE);
@@ -1665,18 +1657,20 @@ void LLPanelGroupMembersSubTab::updateMembers()
LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end();
-
- S32 i = 0;
- for( ; mMemberProgress != end && i<UPDATE_MEMBERS_PER_FRAME;
- ++mMemberProgress, ++i)
+
+ LLTimer update_time;
+ update_time.setTimerExpirySec(UPDATE_MEMBERS_SECONDS_PER_FRAME);
+
+ for( ; mMemberProgress != end && !update_time.hasExpired(); ++mMemberProgress)
{
if (!mMemberProgress->second)
continue;
+
// Do filtering on name if it is already in the cache.
- std::string fullname;
- if (gCacheName->getFullName(mMemberProgress->first, fullname))
+ LLAvatarName av_name;
+ if (LLAvatarNameCache::get(mMemberProgress->first, &av_name))
{
- if (matchesSearchFilter(fullname))
+ if (matchesSearchFilter(av_name.getLegacyName()))
{
addMemberToList(mMemberProgress->first, mMemberProgress->second);
}
@@ -1684,8 +1678,8 @@ void LLPanelGroupMembersSubTab::updateMembers()
else
{
// If name is not cached, onNameCache() should be called when it is cached and add this member to list.
- gCacheName->get(mMemberProgress->first, FALSE, boost::bind(&LLPanelGroupMembersSubTab::onNameCache,
- this, mUdpateSessionID, _1));
+ LLAvatarNameCache::get(mMemberProgress->first, boost::bind(&LLPanelGroupMembersSubTab::onNameCache,
+ this, mUdpateSessionID, mMemberProgress->second, _1, _2));
}
}
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index a55e264150..8b454e020a 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -188,7 +188,7 @@ public:
virtual void setGroupID(const LLUUID& id);
void addMemberToList(LLUUID id, LLGroupMemberData* data);
- void onNameCache(const LLUUID& update_id, const LLUUID& id);
+ void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLUUID& id, const LLAvatarName& av_name);
protected:
typedef std::map<LLUUID, LLRoleMemberChangeType> role_change_data_map_t;