瀏覽代碼

Fix terrain performance

nordsoft 3 年之前
父節點
當前提交
c9eec47304
共有 2 個文件被更改,包括 21 次插入13 次删除
  1. 17 12
      lib/Terrain.cpp
  2. 4 1
      lib/Terrain.h

+ 17 - 12
lib/Terrain.cpp

@@ -154,6 +154,11 @@ Terrain::Manager::Manager()
 			}
 			
 			terrainInfo[terr.first] = info;
+			if(!terrainId.count(terr.first))
+			{
+				terrainId[terr.first] = terrainVault.size();
+				terrainVault.push_back(terr.first);
+			}
 		}
 	}
 }
@@ -164,12 +169,18 @@ Terrain::Manager & Terrain::Manager::get()
 	return manager;
 }
 
-std::vector<Terrain> Terrain::Manager::terrains()
+const std::vector<Terrain> & Terrain::Manager::terrains()
 {
-	std::set<Terrain> _terrains; //have to use std::set to have ordered container. Othervise de-sync is possible
-	for(const auto & info : Terrain::Manager::get().terrainInfo)
-		_terrains.insert(info.first);
-	return std::vector<Terrain>(_terrains.begin(), _terrains.end());
+	return Terrain::Manager::get().terrainVault;
+}
+
+int Terrain::Manager::id(const Terrain & terrain)
+{
+	if(terrain.name == "ANY") return -3;
+	if(terrain.name == "WRONG") return -2;
+	if(terrain.name == "BORDER") return -1;
+	
+	return Terrain::Manager::get().terrainId.at(terrain);
 }
 
 const Terrain::Info & Terrain::Manager::getInfo(const Terrain & terrain)
@@ -219,13 +230,7 @@ bool operator<(const Terrain & l, const Terrain & r)
 	
 int Terrain::id() const
 {
-	if(name == "ANY") return -3;
-	if(name == "WRONG") return -2;
-	if(name == "BORDER") return -1;
-	
-	auto _terrains = Terrain::Manager::terrains();
-	auto iter = std::find(_terrains.begin(), _terrains.end(), *this);
-	return iter - _terrains.begin();
+	return Terrain::Manager::id(*this);
 }
 	
 bool Terrain::isLand() const

+ 4 - 1
lib/Terrain.h

@@ -48,14 +48,17 @@ public:
 	class DLL_LINKAGE Manager
 	{
 	public:
-		static std::vector<Terrain> terrains();
+		static const std::vector<Terrain> & terrains();
 		static const Info & getInfo(const Terrain &);
+		static int id(const Terrain &);
 		
 	private:
 		static Manager & get();
 		Manager();
 		
 		std::unordered_map<std::string, Info> terrainInfo;
+		std::vector<Terrain> terrainVault;
+		std::map<Terrain, int> terrainId;
 	};
 	
 	/*enum EETerrainType