summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichi_cc <michi_cc@openttd.org>2015-05-17 19:49:35 +0000
committermichi_cc <michi_cc@openttd.org>2015-05-17 19:49:35 +0000
commit95cb7c8692ab9527f05a7bef743f6a6a18b7df17 (patch)
treef285c527da15263004638cec6dbdb894f4dc27ef
parent514da346bdfb94422d0e0c57eeaebea80b3db071 (diff)
downloadopenttd-95cb7c8692ab9527f05a7bef743f6a6a18b7df17.tar.xz
(svn r27288) -Fix: Slow network content GUI in MSVC Debug builds due to repeated string resolving.
-rw-r--r--src/network/network_content_gui.cpp21
-rw-r--r--src/network/network_content_gui.h2
-rw-r--r--src/strings.cpp2
3 files changed, 20 insertions, 5 deletions
diff --git a/src/network/network_content_gui.cpp b/src/network/network_content_gui.cpp
index 1b4b7e030..7ee1dbd99 100644
--- a/src/network/network_content_gui.cpp
+++ b/src/network/network_content_gui.cpp
@@ -304,6 +304,8 @@ class NetworkContentListWindow : public Window, ContentCallback {
uint filesize_sum; ///< The sum of all selected file sizes
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 */
void OpenExternalSearch()
{
@@ -401,11 +403,7 @@ class NetworkContentListWindow : public Window, ContentCallback {
{
int r = 0;
if ((*a)->type != (*b)->type) {
- char a_str[64];
- 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);
+ r = strnatcmp(content_type_strs[(*a)->type], content_type_strs[(*b)->type]);
}
if (r == 0) r = NameSorter(a, b);
return r;
@@ -469,6 +467,7 @@ class NetworkContentListWindow : public Window, ContentCallback {
this->vscroll->ScrollTowards(this->list_pos);
}
+ friend void BuildContentTypeStringList();
public:
/**
* Create the content list window.
@@ -968,6 +967,18 @@ NetworkContentListWindow::GUIContentList::FilterFunction * const NetworkContentL
&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. */
static const NWidgetPart _nested_network_content_list_widgets[] = {
NWidget(NWID_HORIZONTAL),
diff --git a/src/network/network_content_gui.h b/src/network/network_content_gui.h
index 212fcec04..139701001 100644
--- a/src/network/network_content_gui.h
+++ b/src/network/network_content_gui.h
@@ -43,4 +43,6 @@ public:
virtual void OnDownloadProgress(const ContentInfo *ci, int bytes);
};
+void BuildContentTypeStringList();
+
#endif /* NETWORK_CONTENT_GUI_H */
diff --git a/src/strings.cpp b/src/strings.cpp
index a7e60f846..9c88b70c7 100644
--- a/src/strings.cpp
+++ b/src/strings.cpp
@@ -35,6 +35,7 @@
#include "window_func.h"
#include "debug.h"
#include "game/game_text.hpp"
+#include "network/network_content_gui.h"
#include <stack>
#include "table/strings.h"
@@ -1814,6 +1815,7 @@ bool ReadLanguagePack(const LanguageMetadata *lang)
SortIndustryTypes();
BuildIndustriesLegend();
SortNetworkLanguages();
+ BuildContentTypeStringList();
InvalidateWindowClassesData(WC_BUILD_VEHICLE); // Build vehicle window.
InvalidateWindowClassesData(WC_TRAINS_LIST); // Train group window.
InvalidateWindowClassesData(WC_ROADVEH_LIST); // Road vehicle group window.