浏览代码

Fixed high CPU usage by mapHandler::hideObject

DjWarmonger 10 年之前
父节点
当前提交
32f3f9d76d
共有 1 个文件被更改,包括 20 次插入15 次删除
  1. 20 15
      client/mapHandler.cpp

+ 20 - 15
client/mapHandler.cpp

@@ -1329,33 +1329,38 @@ bool CMapHandler::printObject(const CGObjectInstance *obj, bool fadein /* = fals
 
 bool CMapHandler::hideObject(const CGObjectInstance *obj, bool fadeout /* = false */)
 {
-	// do we actually need to search through the whole map for this?
-	for (size_t i=0; i<map->width; i++)
+	auto pos = obj->pos;
+
+	for (size_t i = pos.x; i > pos.x - obj->getWidth(); i--)
 	{
-		for (size_t j=0; j<map->height; j++)
+		for (size_t j = pos.y; j > pos.y - obj->getHeight(); j--)
 		{
-			for (size_t k=0; k<(map->twoLevel ? 2 : 1); k++)
+			int3 t(i, j, pos.z);
+			if (!map->isInTheMap(t))
+				continue;
+
+			auto &objs = ttiles[i][j][pos.z].objects;
+			for (size_t x = 0; x < objs.size(); x++)
 			{
-				auto &objs = ttiles[i][j][k].objects;
-				for(size_t x=0; x < objs.size(); x++)
+				auto ourObj = objs[x].obj;
+				if (ourObj && ourObj->id == obj->id)
 				{
-					if (objs[x].obj && objs[x].obj->id == obj->id)
+					if (fadeout && ADVOPT.objectFading) // object should be faded == erase is delayed until the end of fadeout
 					{
-						if (fadeout && ADVOPT.objectFading) // object should be faded == erase is delayed until the end of fadeout
-						{
-							if (startObjectFade(objs[x], false, int3(i, j, k)))
-								objs[x].obj = nullptr;
-							else
-								objs.erase(objs.begin() + x);
-						}
+						if (startObjectFade(objs[x], false, t))
+							objs[x].obj = nullptr; //set original pointer to null
 						else
 							objs.erase(objs.begin() + x);
-						break;
 					}
+					else
+						objs.erase(objs.begin() + x);
+					break;
 				}
 			}
 		}
+
 	}
+
 	return true;
 }
 bool CMapHandler::removeObject(CGObjectInstance *obj, bool fadeout /* = false */)