(svn r27288) -Fix: Slow network content GUI in MSVC Debug builds due to repeated string resolving.

This commit is contained in:
michi_cc 2015-05-17 19:49:35 +00:00
parent 514da346bd
commit 95cb7c8692
3 changed files with 20 additions and 5 deletions

View File

@ -304,6 +304,8 @@ class NetworkContentListWindow : public Window, ContentCallback {
uint filesize_sum; ///< The sum of all selected file sizes uint filesize_sum; ///< The sum of all selected file sizes
Scrollbar *vscroll; ///< Cache of the vertical scrollbar Scrollbar *vscroll; ///< Cache of the vertical scrollbar
static char content_type_strs[CONTENT_TYPE_END][64]; ///< Cached strings for all content types.
/** Search external websites for content */ /** Search external websites for content */
void OpenExternalSearch() void OpenExternalSearch()
{ {
@ -401,11 +403,7 @@ class NetworkContentListWindow : public Window, ContentCallback {
{ {
int r = 0; int r = 0;
if ((*a)->type != (*b)->type) { if ((*a)->type != (*b)->type) {
char a_str[64]; r = strnatcmp(content_type_strs[(*a)->type], content_type_strs[(*b)->type]);
char b_str[64];
GetString(a_str, STR_CONTENT_TYPE_BASE_GRAPHICS + (*a)->type - CONTENT_TYPE_BASE_GRAPHICS, lastof(a_str));
GetString(b_str, STR_CONTENT_TYPE_BASE_GRAPHICS + (*b)->type - CONTENT_TYPE_BASE_GRAPHICS, lastof(b_str));
r = strnatcmp(a_str, b_str);
} }
if (r == 0) r = NameSorter(a, b); if (r == 0) r = NameSorter(a, b);
return r; return r;
@ -469,6 +467,7 @@ class NetworkContentListWindow : public Window, ContentCallback {
this->vscroll->ScrollTowards(this->list_pos); this->vscroll->ScrollTowards(this->list_pos);
} }
friend void BuildContentTypeStringList();
public: public:
/** /**
* Create the content list window. * Create the content list window.
@ -968,6 +967,18 @@ NetworkContentListWindow::GUIContentList::FilterFunction * const NetworkContentL
&TagNameFilter, &TagNameFilter,
}; };
char NetworkContentListWindow::content_type_strs[CONTENT_TYPE_END][64];
/**
* Build array of all strings corresponding to the content types.
*/
void BuildContentTypeStringList()
{
for (int i = CONTENT_TYPE_BEGIN; i < CONTENT_TYPE_END; i++) {
GetString(NetworkContentListWindow::content_type_strs[i], STR_CONTENT_TYPE_BASE_GRAPHICS + i - CONTENT_TYPE_BASE_GRAPHICS, lastof(NetworkContentListWindow::content_type_strs[i]));
}
}
/** The widgets for the content list. */ /** The widgets for the content list. */
static const NWidgetPart _nested_network_content_list_widgets[] = { static const NWidgetPart _nested_network_content_list_widgets[] = {
NWidget(NWID_HORIZONTAL), NWidget(NWID_HORIZONTAL),

View File

@ -43,4 +43,6 @@ public:
virtual void OnDownloadProgress(const ContentInfo *ci, int bytes); virtual void OnDownloadProgress(const ContentInfo *ci, int bytes);
}; };
void BuildContentTypeStringList();
#endif /* NETWORK_CONTENT_GUI_H */ #endif /* NETWORK_CONTENT_GUI_H */

View File

@ -35,6 +35,7 @@
#include "window_func.h" #include "window_func.h"
#include "debug.h" #include "debug.h"
#include "game/game_text.hpp" #include "game/game_text.hpp"
#include "network/network_content_gui.h"
#include <stack> #include <stack>
#include "table/strings.h" #include "table/strings.h"
@ -1814,6 +1815,7 @@ bool ReadLanguagePack(const LanguageMetadata *lang)
SortIndustryTypes(); SortIndustryTypes();
BuildIndustriesLegend(); BuildIndustriesLegend();
SortNetworkLanguages(); SortNetworkLanguages();
BuildContentTypeStringList();
InvalidateWindowClassesData(WC_BUILD_VEHICLE); // Build vehicle window. InvalidateWindowClassesData(WC_BUILD_VEHICLE); // Build vehicle window.
InvalidateWindowClassesData(WC_TRAINS_LIST); // Train group window. InvalidateWindowClassesData(WC_TRAINS_LIST); // Train group window.
InvalidateWindowClassesData(WC_ROADVEH_LIST); // Road vehicle group window. InvalidateWindowClassesData(WC_ROADVEH_LIST); // Road vehicle group window.