From 1f498867553429bae209bd92ef4c60eb190ed53d Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Thu, 3 Jan 2013 17:30:59 +0000 Subject: [PATCH] - re-enabled fog of war cache to improve performance - improve xml file loading speed --- source/glest_game/ai/path_finder.cpp | 72 ++++---- source/glest_game/ai/path_finder.h | 2 +- source/glest_game/game/game.cpp | 163 ++++++++++++++--- source/glest_game/main/program.cpp | 57 ++++++ source/glest_game/type_instances/faction.cpp | 4 +- source/glest_game/type_instances/unit.cpp | 59 +++--- source/glest_game/world/world.cpp | 171 +++++++++++++++--- source/shared_lib/include/util/properties.h | 2 +- source/shared_lib/include/xml/xml_parser.h | 18 +- source/shared_lib/sources/util/properties.cpp | 4 +- source/shared_lib/sources/xml/xml_parser.cpp | 46 +++-- 11 files changed, 463 insertions(+), 135 deletions(-) diff --git a/source/glest_game/ai/path_finder.cpp b/source/glest_game/ai/path_finder.cpp index 4159df6a..046f9c87 100644 --- a/source/glest_game/ai/path_finder.cpp +++ b/source/glest_game/ai/path_finder.cpp @@ -42,7 +42,7 @@ const int PathFinder::maxFreeSearchRadius = 10; int PathFinder::pathFindNodesAbsoluteMax = 900; int PathFinder::pathFindNodesMax = 2000; -const int PathFinder::pathFindRefresh = 10; +//const int PathFinder::pathFindRefresh = 10; const int PathFinder::pathFindBailoutRadius = 20; const int PathFinder::pathFindExtendRefreshForNodeCount = 25; const int PathFinder::pathFindExtendRefreshNodeCountMin = 40; @@ -142,7 +142,7 @@ TravelState PathFinder::findPath(Unit *unit, const Vec2i &finalPos, bool *wasStu char szBuf[8096]=""; snprintf(szBuf,8096,"[findPath] unit->getPos() [%s] finalPos [%s]", unit->getPos().getString().c_str(),finalPos.getString().c_str()); - unit->logSynchData(__FILE__,__LINE__,szBuf); + unit->logSynchData(extractFileFromDirectoryPath(__FILE__).c_str(),__LINE__,szBuf); } //route cache @@ -245,7 +245,7 @@ TravelState PathFinder::findPath(Unit *unit, const Vec2i &finalPos, bool *wasStu char szBuf[8096]=""; snprintf(szBuf,8096,"[attempting to BAIL OUT] finalPos [%s] ts [%d]", finalPos.getString().c_str(),ts); - unit->logSynchData(__FILE__,__LINE__,szBuf); + unit->logSynchData(extractFileFromDirectoryPath(__FILE__).c_str(),__LINE__,szBuf); } if(wasStuck != NULL) { @@ -296,7 +296,7 @@ TravelState PathFinder::findPath(Unit *unit, const Vec2i &finalPos, bool *wasStu char szBuf[8096]=""; snprintf(szBuf,8096,"[attempting to BAIL OUT] finalPos [%s] newFinalPos [%s] ts [%d] canUnitMove [%d]", finalPos.getString().c_str(),newFinalPos.getString().c_str(),ts,canUnitMove); - unit->logSynchData(__FILE__,__LINE__,szBuf); + unit->logSynchData(extractFileFromDirectoryPath(__FILE__).c_str(),__LINE__,szBuf); } if(canUnitMove) { @@ -319,7 +319,7 @@ TravelState PathFinder::findPath(Unit *unit, const Vec2i &finalPos, bool *wasStu char szBuf[8096]=""; snprintf(szBuf,8096,"[attempting to BAIL OUT] finalPos [%s] newFinalPos [%s] ts [%d] canUnitMove [%d]", finalPos.getString().c_str(),newFinalPos.getString().c_str(),ts,canUnitMove); - unit->logSynchData(__FILE__,__LINE__,szBuf); + unit->logSynchData(extractFileFromDirectoryPath(__FILE__).c_str(),__LINE__,szBuf); } if(canUnitMove) { @@ -864,7 +864,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout float dist= unitPos.dist(finalPos); factions[unitFactionIndex].useMaxNodeCount = PathFinder::pathFindNodesMax; - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); // Check the previous path find cache for the unit to see if its good to // use @@ -888,7 +888,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout //on the way ts= tsMoving; - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); //store path if(frameIndex < 0) { @@ -914,13 +914,13 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout pathCount++; } - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); if(SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled == true && frameIndex < 0) { char szBuf[8096]=""; snprintf(szBuf,8096,"[Setting new path for unit] openNodesList.size() [" MG_SIZE_T_SPECIFIER "] openPosList.size() [" MG_SIZE_T_SPECIFIER "] finalPos [%s] targetPos [%s] inBailout [%d] ts [%d]", factions[unitFactionIndex].openNodesList.size(),factions[unitFactionIndex].openPosList.size(),finalPos.getString().c_str(),targetPos.getString().c_str(),inBailout,ts); - unit->logSynchData(__FILE__,__LINE__,szBuf); + unit->logSynchData(extractFileFromDirectoryPath(__FILE__).c_str(),__LINE__,szBuf); } if(SystemFlags::getSystemSettingType(SystemFlags::debugPathFinder).enabled == true) { @@ -935,7 +935,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout unit->setCurrentUnitTitle(szBuf); } - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); unit->setUsePathfinderExtendedMaxNodes(false); return ts; @@ -945,7 +945,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout //on the way ts= tsMoving; - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); //store path if(frameIndex < 0) { @@ -971,13 +971,13 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout pathCount++; } - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); if(SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled == true && frameIndex < 0) { char szBuf[8096]=""; snprintf(szBuf,8096,"[Setting new path for unit] openNodesList.size() [" MG_SIZE_T_SPECIFIER "] openPosList.size() [" MG_SIZE_T_SPECIFIER "] finalPos [%s] targetPos [%s] inBailout [%d] ts [%d]", factions[unitFactionIndex].openNodesList.size(),factions[unitFactionIndex].openPosList.size(),finalPos.getString().c_str(),targetPos.getString().c_str(),inBailout,ts); - unit->logSynchData(__FILE__,__LINE__,szBuf); + unit->logSynchData(extractFileFromDirectoryPath(__FILE__).c_str(),__LINE__,szBuf); } if(SystemFlags::getSystemSettingType(SystemFlags::debugPathFinder).enabled == true) { @@ -992,7 +992,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout unit->setCurrentUnitTitle(szBuf); } - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); unit->setUsePathfinderExtendedMaxNodes(false); return ts; @@ -1034,7 +1034,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout bool nodeLimitReached = false; Node *node = NULL; - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); // First check if unit currently blocked all around them, if so don't try to pathfind if(inBailout == false && unitPos != finalPos) { @@ -1057,7 +1057,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout nodeLimitReached = (failureCount == cellCount); pathFound = !nodeLimitReached; - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 1) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] **Check if dest blocked, distance for unit [%d - %s] from [%s] to [%s] is %.2f took msecs: %lld nodeLimitReached = %d, failureCount = %d\n",__FILE__,__FUNCTION__,__LINE__,unit->getId(),unit->getFullName().c_str(), unitPos.getString().c_str(), finalPos.getString().c_str(), dist,(long long int)chrono.getMillis(),nodeLimitReached,failureCount); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 1) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] **Check if dest blocked, distance for unit [%d - %s] from [%s] to [%s] is %.2f took msecs: %lld nodeLimitReached = %d, failureCount = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,unit->getId(),unit->getFullName().c_str(), unitPos.getString().c_str(), finalPos.getString().c_str(), dist,(long long int)chrono.getMillis(),nodeLimitReached,failureCount); if(showConsoleDebugInfo && nodeLimitReached) { printf("**Check if src blocked [%d - %d], unit [%d - %s] from [%s] to [%s] distance %.2f took msecs: %lld nodeLimitReached = %d, failureCount = %d [%d]\n", nodeLimitReached, inBailout, unit->getId(),unit->getFullName().c_str(), unitPos.getString().c_str(), finalPos.getString().c_str(), dist,(long long int)chrono.getMillis(),nodeLimitReached,failureCount,cellCount); @@ -1084,7 +1084,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout nodeLimitReached = (failureCount == cellCount); pathFound = !nodeLimitReached; - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 1) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] **Check if dest blocked, distance for unit [%d - %s] from [%s] to [%s] is %.2f took msecs: %lld nodeLimitReached = %d, failureCount = %d\n",__FILE__,__FUNCTION__,__LINE__,unit->getId(),unit->getFullName().c_str(), unitPos.getString().c_str(), finalPos.getString().c_str(), dist,(long long int)chrono.getMillis(),nodeLimitReached,failureCount); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 1) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] **Check if dest blocked, distance for unit [%d - %s] from [%s] to [%s] is %.2f took msecs: %lld nodeLimitReached = %d, failureCount = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,unit->getId(),unit->getFullName().c_str(), unitPos.getString().c_str(), finalPos.getString().c_str(), dist,(long long int)chrono.getMillis(),nodeLimitReached,failureCount); if(showConsoleDebugInfo && nodeLimitReached) { printf("**Check if dest blocked [%d - %d], unit [%d - %s] from [%s] to [%s] distance %.2f took msecs: %lld nodeLimitReached = %d, failureCount = %d [%d]\n", nodeLimitReached, inBailout, unit->getId(),unit->getFullName().c_str(), unitPos.getString().c_str(), finalPos.getString().c_str(), dist,(long long int)chrono.getMillis(),nodeLimitReached,failureCount,cellCount); @@ -1142,7 +1142,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout } } - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 1) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld nodeLimitReached = %d whileLoopCount = %d nodePoolCount = %d\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis(),nodeLimitReached,whileLoopCount,factions[unitFactionIndex].nodePoolCount); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 1) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld nodeLimitReached = %d whileLoopCount = %d nodePoolCount = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis(),nodeLimitReached,whileLoopCount,factions[unitFactionIndex].nodePoolCount); if(showConsoleDebugInfo && chrono.getMillis() > 2) { printf("Distance for unit [%d - %s] from [%s] to [%s] is %.2f took msecs: %lld nodeLimitReached = %d whileLoopCount = %d nodePoolCount = %d\n",unit->getId(),unit->getFullName().c_str(), unitPos.getString().c_str(), finalPos.getString().c_str(), dist,(long long int)chrono.getMillis(),nodeLimitReached,whileLoopCount,factions[unitFactionIndex].nodePoolCount); } @@ -1159,7 +1159,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout } } - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); //check results of path finding ts = tsImpossible; @@ -1194,10 +1194,10 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout char szBuf[8096]=""; snprintf(szBuf,8096,"[path for unit BLOCKED] openNodesList.size() [" MG_SIZE_T_SPECIFIER "] openPosList.size() [" MG_SIZE_T_SPECIFIER "] finalPos [%s] targetPos [%s] inBailout [%d] ts [%d]", factions[unitFactionIndex].openNodesList.size(),factions[unitFactionIndex].openPosList.size(),finalPos.getString().c_str(),targetPos.getString().c_str(),inBailout,ts); - unit->logSynchData(__FILE__,__LINE__,szBuf); + unit->logSynchData(extractFileFromDirectoryPath(__FILE__).c_str(),__LINE__,szBuf); } - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); } else { if(minorDebugPathfinder) printf("Legacy Pathfind Unit [%d - %s] FOUND PATH count = %d frameIndex = %d\n",unit->getId(),unit->getType()->getName().c_str(),whileLoopCount,frameIndex); @@ -1211,7 +1211,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout currNode= currNode->prev; } - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); if(frameIndex < 0) { if(maxNodeCount == pathFindNodesAbsoluteMax) { @@ -1264,13 +1264,13 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout } } - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); if(SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled == true && frameIndex < 0) { char szBuf[8096]=""; snprintf(szBuf,8096,"[Setting new path for unit] openNodesList.size() [" MG_SIZE_T_SPECIFIER "] openPosList.size() [" MG_SIZE_T_SPECIFIER "] finalPos [%s] targetPos [%s] inBailout [%d] ts [%d]", factions[unitFactionIndex].openNodesList.size(),factions[unitFactionIndex].openPosList.size(),finalPos.getString().c_str(),targetPos.getString().c_str(),inBailout,ts); - unit->logSynchData(__FILE__,__LINE__,szBuf); + unit->logSynchData(extractFileFromDirectoryPath(__FILE__).c_str(),__LINE__,szBuf); string pathToTake = ""; for(int i = 0; i < path->getQueueCount(); ++i) { @@ -1280,7 +1280,7 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout } pathToTake += pos.getString(); } - unit->logSynchData(__FILE__,__LINE__,szBuf); + unit->logSynchData(extractFileFromDirectoryPath(__FILE__).c_str(),__LINE__,szBuf); snprintf(szBuf,8096,"Path for unit to take = %s",pathToTake.c_str()); } @@ -1296,20 +1296,20 @@ TravelState PathFinder::aStar(Unit *unit, const Vec2i &targetPos, bool inBailout unit->setCurrentUnitTitle(szBuf); } - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); } factions[unitFactionIndex].openNodesList.clear(); factions[unitFactionIndex].openPosList.clear(); factions[unitFactionIndex].closedNodesList.clear(); - if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld --------------------------- [END OF METHOD] ---------------------------\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled == true && chrono.getMillis() > 4) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld --------------------------- [END OF METHOD] ---------------------------\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); if(frameIndex >= 0) { factions[unitFactionIndex].precachedTravelState[unit->getId()] = ts; } else { - if(SystemFlags::VERBOSE_MODE_ENABLED && chrono.getMillis() >= 5) printf("In [%s::%s Line: %d] astar took [%lld] msecs, ts = %d.\n",__FILE__,__FUNCTION__,__LINE__,(long long int)chrono.getMillis(),ts); + if(SystemFlags::VERBOSE_MODE_ENABLED && chrono.getMillis() >= 5) printf("In [%s::%s Line: %d] astar took [%lld] msecs, ts = %d.\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,(long long int)chrono.getMillis(),ts); } //printf("$$$$ Path for Unit [%d - %s] return value = %d inBailout = %d\n",unit->getId(),unit->getFullName().c_str(),ts,inBailout); @@ -1505,9 +1505,14 @@ void PathFinder::loadGame(const XmlNode *rootNode) { //attackWarnRange = unitupdaterNode->getAttribute("attackWarnRange")->getFloatValue(); // static int pathFindNodesMax; - pathFindNodesMax = pathfinderNode->getAttribute("pathFindNodesMax")->getIntValue(); - // static int pathFindNodesAbsoluteMax; - pathFindNodesAbsoluteMax = pathfinderNode->getAttribute("pathFindNodesAbsoluteMax")->getIntValue(); +// pathFindNodesMax = pathfinderNode->getAttribute("pathFindNodesMax")->getIntValue(); +// // static int pathFindNodesAbsoluteMax; +// pathFindNodesAbsoluteMax = pathfinderNode->getAttribute("pathFindNodesAbsoluteMax")->getIntValue(); +// +// for(int i = 0; i < GameConstants::maxPlayers; ++i) { +// factions[i].nodePool.resize(pathFindNodesAbsoluteMax); +// factions[i].useMaxNodeCount = PathFinder::pathFindNodesMax; +// } vector factionsNodeList = pathfinderNode->getChildList("factions"); for(unsigned int i = 0; i < factionsNodeList.size(); ++i) { @@ -1516,7 +1521,7 @@ void PathFinder::loadGame(const XmlNode *rootNode) { FactionState &factionState = factions[i]; // std::vector nodePool; vector nodePoolListNode = factionsNode->getChildList("nodePool"); - for(unsigned int j = 0; j < nodePoolListNode.size(); ++j) { + for(unsigned int j = 0; j < nodePoolListNode.size() && j < pathFindNodesAbsoluteMax; ++j) { XmlNode *nodePoolNode = nodePoolListNode[j]; Node *curNode = &factionState.nodePool[j]; @@ -1553,7 +1558,8 @@ void PathFinder::loadGame(const XmlNode *rootNode) { // RandomGen random; factionState.random.setLastNumber(factionsNode->getAttribute("random")->getIntValue()); // int useMaxNodeCount; - factionState.useMaxNodeCount = factionsNode->getAttribute("useMaxNodeCount")->getIntValue(); + //factionState.useMaxNodeCount = factionsNode->getAttribute("useMaxNodeCount")->getIntValue(); + factionState.useMaxNodeCount = PathFinder::pathFindNodesMax; // // std::map precachedTravelState; // std::map > precachedPath; diff --git a/source/glest_game/ai/path_finder.h b/source/glest_game/ai/path_finder.h index 1c34c6ee..a9ea3a1b 100644 --- a/source/glest_game/ai/path_finder.h +++ b/source/glest_game/ai/path_finder.h @@ -138,7 +138,7 @@ public: public: static const int maxFreeSearchRadius; - static const int pathFindRefresh; + //static const int pathFindRefresh; static const int pathFindBailoutRadius; static const int pathFindExtendRefreshForNodeCount; static const int pathFindExtendRefreshNodeCountMin; diff --git a/source/glest_game/game/game.cpp b/source/glest_game/game/game.cpp index 7cb2e41e..ca48c6dc 100644 --- a/source/glest_game/game/game.cpp +++ b/source/glest_game/game/game.cpp @@ -1385,6 +1385,17 @@ void Game::update() { currentUIState->update(); } + bool showPerfStats = Config::getInstance().getBool("ShowPerfStats","false"); + Chrono chronoPerf; + char perfBuf[8096]=""; + std::vector perfList; + if(showPerfStats) chronoPerf.start(); + + if(showPerfStats) { + sprintf(perfBuf,"=============== FRAME: %d In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",world.getFrameCount(),extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + Chrono chrono; if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled) chrono.start(); @@ -1441,6 +1452,10 @@ void Game::update() { int updateLoops= getUpdateLoops(); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } NetworkManager &networkManager= NetworkManager::getInstance(); bool enableServerControlledAI = this->gameSettings.getEnableServerControlledAI(); @@ -1448,6 +1463,10 @@ void Game::update() { NetworkRole role = networkManager.getNetworkRole(); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld [before ReplaceDisconnectedNetworkPlayersWithAI]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } // Check to see if we are playing a network game and if any players // have disconnected? @@ -1455,6 +1474,10 @@ void Game::update() { setupPopupMenus(true); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld [after ReplaceDisconnectedNetworkPlayersWithAI]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } if(updateLoops > 0) { // update the frame based timer in the stats with at least one step @@ -1473,7 +1496,12 @@ void Game::update() { replayCommandsPlayed = (replayTotal - commander.getReplayCommandListForFrameCount()); } for(int i = 0; i < updateLoops; ++i) { - chrono.start(); + //if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled) chrono.start(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //AiInterface if(commander.hasReplayCommandListForFrame() == false) { @@ -1498,6 +1526,7 @@ void Game::update() { */ // Signal the faction threads to do any pre-processing + bool hasAIPlayer = false; for(int j = 0; j < world.getFactionCount(); ++j) { Faction *faction = world.getFaction(j); @@ -1508,40 +1537,51 @@ void Game::update() { if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] [i = %d] faction = %d, factionCount = %d, took msecs: %lld [before AI updates]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,i,j,world.getFactionCount(),chrono.getMillis()); aiInterfaces[j]->signalWorkerThread(world.getFrameCount()); + hasAIPlayer = true; } } - bool workThreadsFinished = false; - Chrono chrono; - chrono.start(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } - const int MAX_FACTION_THREAD_WAIT_MILLISECONDS = 20000; - for(;chrono.getMillis() < MAX_FACTION_THREAD_WAIT_MILLISECONDS;) { - workThreadsFinished = true; - for(int j = 0; j < world.getFactionCount(); ++j) { - Faction *faction = world.getFaction(j); - if(faction == NULL) { - throw megaglest_runtime_error("faction == NULL"); - } - if( faction->getCpuControl(enableServerControlledAI,isNetworkGame,role) == true && - scriptManager.getPlayerModifiers(j)->getAiEnabled() == true) { - if(aiInterfaces[j]->isWorkerThreadSignalCompleted(world.getFrameCount()) == false) { - workThreadsFinished = false; - break; + if(hasAIPlayer == true) { + //sleep(0); + + bool workThreadsFinished = false; + Chrono chronoAI; + chronoAI.start(); + + const int MAX_FACTION_THREAD_WAIT_MILLISECONDS = 20000; + for(;chronoAI.getMillis() < MAX_FACTION_THREAD_WAIT_MILLISECONDS;) { + workThreadsFinished = true; + for(int j = 0; j < world.getFactionCount(); ++j) { + Faction *faction = world.getFaction(j); + if(faction == NULL) { + throw megaglest_runtime_error("faction == NULL"); + } + if( faction->getCpuControl(enableServerControlledAI,isNetworkGame,role) == true && + scriptManager.getPlayerModifiers(j)->getAiEnabled() == true) { + if(aiInterfaces[j]->isWorkerThreadSignalCompleted(world.getFrameCount()) == false) { + workThreadsFinished = false; + break; + } } } - } - if(workThreadsFinished == false) { - //sleep(0); - } - else { - break; + if(workThreadsFinished == false) { + //sleep(0); + } + else { + break; + } } } - - - + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } } else { @@ -1587,6 +1627,11 @@ void Game::update() { } } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld [AI updates]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start(); @@ -1595,6 +1640,11 @@ void Game::update() { if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld [world update i = %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis(),i); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + if(currentCameraFollowUnit!=NULL){ Vec3f c=currentCameraFollowUnit->getCurrVector(); int rotation=currentCameraFollowUnit->getRotation(); @@ -1621,10 +1671,20 @@ void Game::update() { } } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + // Commander //commander.updateNetwork(); if(pendingQuitError == false) commander.signalNetworkUpdate(this); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld [commander updateNetwork i = %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis(),i); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start(); @@ -1633,6 +1693,11 @@ void Game::update() { if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld [gui updating i = %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis(),i); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //Particle systems if(weatherParticleSystem != NULL) { weatherParticleSystem->setPos(gameCamera.getPos()); @@ -1641,11 +1706,21 @@ void Game::update() { if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld [weather particle updating i = %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis(),i); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + Renderer &renderer= Renderer::getInstance(); renderer.updateParticleManager(rsGame,avgRenderFps); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld [particle manager updating i = %d]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis(),i); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //good_fpu_control_registers(NULL,extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__); } } @@ -1663,15 +1738,30 @@ void Game::update() { } } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //call the chat manager chatManager.updateNetwork(); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld [chatManager.updateNetwork]\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + updateNetworkMarkedCells(); updateNetworkUnMarkedCells(); updateNetworkHighligtedCells(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //check for quiting status if(NetworkManager::getInstance().getGameNetworkInterface() != NULL && NetworkManager::getInstance().getGameNetworkInterface()->getQuit() && @@ -1682,12 +1772,22 @@ void Game::update() { return; } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //update auto test if(Config::getInstance().getBool("AutoTest")){ AutoTest::getInstance().updateGame(this); return; } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + if(world.getQueuedScenario() != "") { string name = world.getQueuedScenario(); bool keepFactions = world.getQueuedScenarioKeepFactions(); @@ -1833,6 +1933,17 @@ void Game::update() { throw; } } + + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + + if(showPerfStats && chronoPerf.getMillis() >= 50) { + for(unsigned int x = 0; x < perfList.size(); ++x) { + printf("%s",perfList[x].c_str()); + } + } } catch(const exception &ex) { quitPendingIndicator = true; diff --git a/source/glest_game/main/program.cpp b/source/glest_game/main/program.cpp index 507032b2..2d51e39c 100644 --- a/source/glest_game/main/program.cpp +++ b/source/glest_game/main/program.cpp @@ -383,6 +383,12 @@ void Program::loopWorker() { } } + bool showPerfStats = Config::getInstance().getBool("ShowPerfStats","false"); + Chrono chronoPerf; + char perfBuf[8096]=""; + std::vector perfList; + if(showPerfStats) chronoPerf.start(); + Chrono chronoLoop; if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled) chronoLoop.start(); @@ -407,9 +413,19 @@ void Program::loopWorker() { } ProgramState *prevState = this->programState; + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + assert(programState != NULL); programState->render(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d programState->render took msecs: %lld ==============> MAIN LOOP RENDERING\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start(); @@ -419,6 +435,11 @@ void Program::loopWorker() { programState->updateCamera(); } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d programState->render took msecs: %lld ==============> MAIN LOOP CAMERA UPDATING\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start(); @@ -428,12 +449,21 @@ void Program::loopWorker() { while(prevState == this->programState && updateTimer.isTime()) { Chrono chronoUpdateLoop; if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled) chronoUpdateLoop.start(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER " updateCount: %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis(),updateCount); + perfList.push_back(perfBuf); + } GraphicComponent::update(); programState->update(); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chronoUpdateLoop.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] programState->update took msecs: %lld, updateCount = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoUpdateLoop.getMillis(),updateCount); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chronoUpdateLoop.getMillis() > 0) chronoUpdateLoop.start(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER " updateCount: %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis(),updateCount); + perfList.push_back(perfBuf); + } + if(prevState == this->programState) { if(soundThreadManager == NULL || soundThreadManager->isThreadExecutionLagging()) { if(soundThreadManager != NULL) { @@ -445,9 +475,20 @@ void Program::loopWorker() { if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chronoUpdateLoop.getMillis() > 0) chronoUpdateLoop.start(); } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER " updateCount: %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis(),updateCount); + perfList.push_back(perfBuf); + } + NetworkManager::getInstance().update(); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chronoUpdateLoop.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] NetworkManager::getInstance().update() took msecs: %lld, updateCount = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoUpdateLoop.getMillis(),updateCount); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chronoUpdateLoop.getMillis() > 0) chronoUpdateLoop.start(); + + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER " updateCount: %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis(),updateCount); + perfList.push_back(perfBuf); + } + } updateCount++; } @@ -456,6 +497,11 @@ void Program::loopWorker() { if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + if(prevState == this->programState) { //fps timer chrono.start(); @@ -463,6 +509,11 @@ void Program::loopWorker() { programState->tick(); } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d programState->render took msecs: %lld ==============> MAIN LOOP TICKING\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled && chrono.getMillis() > 0) chrono.start(); @@ -471,6 +522,12 @@ void Program::loopWorker() { } + if(showPerfStats && chronoPerf.getMillis() >= 100) { + for(unsigned int x = 0; x < perfList.size(); ++x) { + printf("%s",perfList[x].c_str()); + } + } + if(SystemFlags::getSystemSettingType(SystemFlags::debugPerformance).enabled) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] ------------------------------- MAIN LOOP END, stats: loop took msecs: %lld -------------------------------\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoLoop.getMillis()); } diff --git a/source/glest_game/type_instances/faction.cpp b/source/glest_game/type_instances/faction.cpp index 7906f3f0..1b980ea9 100644 --- a/source/glest_game/type_instances/faction.cpp +++ b/source/glest_game/type_instances/faction.cpp @@ -511,7 +511,9 @@ int Faction::getUnitPathfindingListCount() { void Faction::clearUnitsPathfinding() { //printf("CLEAR Faction [%d - %s] threaded updates for [%d] units\n",this->getStartLocationIndex(),this->getType()->getName().c_str(),unitsPathfindingList.size()); - unitsPathfindingList.clear(); + if(unitsPathfindingList.empty() == false) { + unitsPathfindingList.clear(); + } } bool Faction::canUnitsPathfind() { diff --git a/source/glest_game/type_instances/unit.cpp b/source/glest_game/type_instances/unit.cpp index bc00ac92..9aecc7ca 100644 --- a/source/glest_game/type_instances/unit.cpp +++ b/source/glest_game/type_instances/unit.cpp @@ -1752,49 +1752,52 @@ bool Unit::needToUpdate() { void Unit::updateTimedParticles() { //!!! // Start new particle systems based on start time - for(int i = queuedUnitParticleSystemTypes.size() - 1; i >= 0; i--) { - UnitParticleSystemType *pst = queuedUnitParticleSystemTypes[i]; - if(pst != NULL) { - if(truncateDecimal(pst->getStartTime()) <= truncateDecimal(animProgress)) { - //printf("STARTING queued particle system type [%s] [%f] [%f] [%f] [%f]\n",pst->getType().c_str(),truncateDecimal(pst->getStartTime()),truncateDecimal(pst->getEndTime()),truncateDecimal(animProgress),truncateDecimal(lastAnimProgress)); + if(queuedUnitParticleSystemTypes.empty() == false) { + for(int i = queuedUnitParticleSystemTypes.size() - 1; i >= 0; i--) { + UnitParticleSystemType *pst = queuedUnitParticleSystemTypes[i]; + if(pst != NULL) { + if(truncateDecimal(pst->getStartTime()) <= truncateDecimal(animProgress)) { + //printf("STARTING queued particle system type [%s] [%f] [%f] [%f] [%f]\n",pst->getType().c_str(),truncateDecimal(pst->getStartTime()),truncateDecimal(pst->getEndTime()),truncateDecimal(animProgress),truncateDecimal(lastAnimProgress)); - UnitParticleSystem *ups = new UnitParticleSystem(200); - pst->setValues(ups); - ups->setPos(getCurrVector()); - if(getFaction()->getTexture()) { - ups->setFactionColor(getFaction()->getTexture()->getPixmapConst()->getPixel3f(0,0)); + UnitParticleSystem *ups = new UnitParticleSystem(200); + pst->setValues(ups); + ups->setPos(getCurrVector()); + if(getFaction()->getTexture()) { + ups->setFactionColor(getFaction()->getTexture()->getPixmapConst()->getPixel3f(0,0)); + } + unitParticleSystems.push_back(ups); + Renderer::getInstance().manageParticleSystem(ups, rsGame); + + queuedUnitParticleSystemTypes.erase(queuedUnitParticleSystemTypes.begin() + i); } - unitParticleSystems.push_back(ups); - Renderer::getInstance().manageParticleSystem(ups, rsGame); - + } + else { queuedUnitParticleSystemTypes.erase(queuedUnitParticleSystemTypes.begin() + i); } } - else { - queuedUnitParticleSystemTypes.erase(queuedUnitParticleSystemTypes.begin() + i); - } } // End existing systems based on end time - for(int i = unitParticleSystems.size() - 1; i >= 0; i--) { - UnitParticleSystem *ps = unitParticleSystems[i]; - if(ps != NULL) { - if(Renderer::getInstance().validateParticleSystemStillExists(ps,rsGame) == true) { - if(truncateDecimal(ps->getStartTime()) != 0.0 || truncateDecimal(ps->getEndTime()) != 1.0) { - //printf("Checking for end particle system #%d [%d] [%f] [%f] [%f] [%f]\n",i,ps->shape,truncateDecimal(ps->getStartTime()),truncateDecimal(ps->getEndTime()),truncateDecimal(animProgress),truncateDecimal(lastAnimProgress)); + if(unitParticleSystems.empty() == false) { + for(int i = unitParticleSystems.size() - 1; i >= 0; i--) { + UnitParticleSystem *ps = unitParticleSystems[i]; + if(ps != NULL) { + if(Renderer::getInstance().validateParticleSystemStillExists(ps,rsGame) == true) { + if(truncateDecimal(ps->getStartTime()) != 0.0 || truncateDecimal(ps->getEndTime()) != 1.0) { + //printf("Checking for end particle system #%d [%d] [%f] [%f] [%f] [%f]\n",i,ps->shape,truncateDecimal(ps->getStartTime()),truncateDecimal(ps->getEndTime()),truncateDecimal(animProgress),truncateDecimal(lastAnimProgress)); - if(truncateDecimal(animProgress) >= 0.99 || - truncateDecimal(animProgress) >= truncateDecimal(ps->getEndTime())) { - //printf("ENDING particle system [%d]\n",ps->shape); + if(truncateDecimal(animProgress) >= 0.99 || + truncateDecimal(animProgress) >= truncateDecimal(ps->getEndTime())) { + //printf("ENDING particle system [%d]\n",ps->shape); - ps->fade(); - unitParticleSystems.erase(unitParticleSystems.begin() + i); + ps->fade(); + unitParticleSystems.erase(unitParticleSystems.begin() + i); + } } } } } } - } bool Unit::update() { diff --git a/source/glest_game/world/world.cpp b/source/glest_game/world/world.cpp index 20ea7da8..43de2d0b 100644 --- a/source/glest_game/world/world.cpp +++ b/source/glest_game/world/world.cpp @@ -56,7 +56,7 @@ World::World() { ExploredCellsLookupItemCacheTimerCount = 0; FowAlphaCellsLookupItemCache.clear(); // Disable this cache as it takes too much RAM (not sure if its worth the performance gain) - enableFowAlphaCellsLookupItemCache = false; + enableFowAlphaCellsLookupItemCache = config.getBool("EnableFowCache","true"); nextCommandGroupId = 0; techTree = NULL; @@ -415,9 +415,9 @@ void World::updateAllFactionUnits() { // Clear pathfinder list restrictions for(int i = 0; i < factionCount; ++i) { Faction *faction = getFaction(i); - if(faction == NULL) { - throw megaglest_runtime_error("faction == NULL"); - } + //if(faction == NULL) { + // throw megaglest_runtime_error("faction == NULL"); + //} faction->clearUnitsPathfinding(); faction->clearAproxCanMoveSoonCached(); } @@ -425,12 +425,13 @@ void World::updateAllFactionUnits() { // Signal the faction threads to do any pre-processing for(int i = 0; i < factionCount; ++i) { Faction *faction = getFaction(i); - if(faction == NULL) { - throw megaglest_runtime_error("faction == NULL"); - } + //if(faction == NULL) { + // throw megaglest_runtime_error("faction == NULL"); + //} faction->signalWorkerThread(frameCount); } + //sleep(0); bool workThreadsFinished = false; Chrono chrono; chrono.start(); @@ -440,9 +441,9 @@ void World::updateAllFactionUnits() { workThreadsFinished = true; for(int i = 0; i < factionCount; ++i) { Faction *faction = getFaction(i); - if(faction == NULL) { - throw megaglest_runtime_error("faction == NULL"); - } + //if(faction == NULL) { + // throw megaglest_runtime_error("faction == NULL"); + //} if(faction->isWorkerThreadSignalCompleted(frameCount) == false) { workThreadsFinished = false; break; @@ -461,10 +462,9 @@ void World::updateAllFactionUnits() { //units for(int i = 0; i < factionCount; ++i) { Faction *faction = getFaction(i); - if(faction == NULL) { - throw megaglest_runtime_error("faction == NULL"); - } - + //if(faction == NULL) { + // throw megaglest_runtime_error("faction == NULL"); + //} faction->clearUnitsPathfinding(); int unitCount = faction->getUnitCount(); @@ -539,17 +539,34 @@ void World::updateAllFactionConsumableCosts() { } } -void World::update(){ +void World::update() { + + bool showPerfStats = Config::getInstance().getBool("ShowPerfStats","false"); + Chrono chronoPerf; + char perfBuf[8096]=""; + std::vector perfList; + if(showPerfStats) chronoPerf.start(); + ++frameCount; //time timeFlow.update(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //water effects waterEffects.update(1.0f); // attack effects attackEffects.update(0.25f); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //bool needToUpdateUnits = true; //if(staggeredFactionUpdates == true) { // needToUpdateUnits = (frameCount % (GameConstants::updateFps / GameConstants::maxPlayers) == 0); @@ -561,29 +578,71 @@ void World::update(){ // objects on the map from tilesets updateAllTilesetObjects(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //units if(getFactionCount() > 0) { updateAllFactionUnits(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //undertake the dead underTakeDeadFactionUnits(); //} + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //food costs updateAllFactionConsumableCosts(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //fow smoothing if(fogOfWarSmoothing && ((frameCount+1) % (fogOfWarSmoothingFrameSkip+1))==0) { float fogFactor= static_cast(frameCount % GameConstants::updateFps) / GameConstants::updateFps; minimap.updateFowTex(clamp(fogFactor, 0.f, 1.f)); } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //tick bool needToTick = canTickWorld(); + + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + if(needToTick == true) { //printf("=========== World is about to be updated, current frameCount = %d\n",frameCount); tick(); } + + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + } + + if(showPerfStats && chronoPerf.getMillis() >= 50) { + for(unsigned int x = 0; x < perfList.size(); ++x) { + printf("%s",perfList[x].c_str()); + } } } @@ -625,6 +684,12 @@ int World::tickFactionIndex() { } void World::tick() { + bool showPerfStats = Config::getInstance().getBool("ShowPerfStats","false"); + Chrono chronoPerf; + char perfBuf[8096]=""; + std::vector perfList; + if(showPerfStats) chronoPerf.start(); + int factionIdxToTick = -1; if(staggeredFactionUpdates == true) { factionIdxToTick = tickFactionIndex(); @@ -632,23 +697,36 @@ void World::tick() { return; } } + + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + computeFow(factionIdxToTick); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER " fogOfWar: %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis(),fogOfWar); + perfList.push_back(perfBuf); + } + if(factionIdxToTick == -1 || factionIdxToTick == 0) { if(fogOfWarSmoothing == false) { minimap.updateFowTex(1.f); } } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //increase hp //int i = factionIdxToTick; int factionCount = getFactionCount(); for(int i = 0; i < factionCount; ++i) { if(factionIdxToTick == -1 || i == factionIdxToTick) { Faction *faction = getFaction(i); - if(faction == NULL) { - throw megaglest_runtime_error("faction == NULL"); - } int unitCount = faction->getUnitCount(); for(int j = 0; j < unitCount; ++j) { @@ -662,15 +740,17 @@ void World::tick() { } } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //compute resources balance //int k = factionIdxToTick; factionCount = getFactionCount(); for(int k = 0; k < factionCount; ++k) { if(factionIdxToTick == -1 || k == factionIdxToTick) { Faction *faction= getFaction(k); - if(faction == NULL) { - throw megaglest_runtime_error("faction == NULL"); - } //for each resource for(int i = 0; i < techTree->getResourceTypeCount(); ++i) { @@ -695,6 +775,17 @@ void World::tick() { } } } + + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + + if(showPerfStats && chronoPerf.getMillis() >= 50) { + for(unsigned int x = 0; x < perfList.size(); ++x) { + printf("%s",perfList[x].c_str()); + } + } } Unit* World::findUnitById(int id) const { @@ -2001,8 +2092,19 @@ bool World::showWorldForPlayer(int factionIndex) const { //computes the fog of war texture, contained in the minimap void World::computeFow(int factionIdxToTick) { + bool showPerfStats = Config::getInstance().getBool("ShowPerfStats","false"); + Chrono chronoPerf; + char perfBuf[8096]=""; + std::vector perfList; + if(showPerfStats) chronoPerf.start(); + minimap.resetFowTex(); + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //reset cells if(factionIdxToTick == -1 || factionIdxToTick == this->thisFactionIndex) { for(int i = 0; i < map.getSurfaceW(); ++i) { @@ -2075,6 +2177,11 @@ void World::computeFow(int factionIdxToTick) { } } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //compute cells for(int i=0; ithisFactionIndex) { @@ -2087,6 +2194,11 @@ void World::computeFow(int factionIdxToTick) { } } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //fire for(int i=0; ithisFactionIndex) { @@ -2107,6 +2219,11 @@ void World::computeFow(int factionIdxToTick) { } } + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + //compute texture //printf("Masterserver = %d\n",game->isMasterserverMode()); @@ -2181,6 +2298,18 @@ void World::computeFow(int factionIdxToTick) { } } } + + if(showPerfStats) { + sprintf(perfBuf,"In [%s::%s] Line: %d took msecs: " MG_I64_SPECIFIER "\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chronoPerf.getMillis()); + perfList.push_back(perfBuf); + } + + if(showPerfStats && chronoPerf.getMillis() >= 50) { + for(unsigned int x = 0; x < perfList.size(); ++x) { + printf("%s",perfList[x].c_str()); + } + } + } GameSettings * World::getGameSettingsPtr() { diff --git a/source/shared_lib/include/util/properties.h b/source/shared_lib/include/util/properties.h index b02c09f7..90035f45 100644 --- a/source/shared_lib/include/util/properties.h +++ b/source/shared_lib/include/util/properties.h @@ -85,7 +85,7 @@ public: bool hasString(const string &key) const; - static bool applyTagsToValue(string &value, std::map *mapTagReplacementValues=NULL); + static bool applyTagsToValue(string &value, const std::map *mapTagReplacementValues=NULL); static std::map getTagReplacementValues(std::map *mapExtraTagReplacementValues=NULL); string getpath() const { return path;} diff --git a/source/shared_lib/include/xml/xml_parser.h b/source/shared_lib/include/xml/xml_parser.h index 17f5d0a1..d68707e4 100644 --- a/source/shared_lib/include/xml/xml_parser.h +++ b/source/shared_lib/include/xml/xml_parser.h @@ -64,7 +64,7 @@ public: ~XmlIo(); void cleanup(); - XmlNode *load(const string &path, std::map mapTagReplacementValues,bool noValidation=false, bool skipStackCheck=false); + XmlNode *load(const string &path, const std::map &mapTagReplacementValues,bool noValidation=false, bool skipStackCheck=false); void save(const string &path, const XmlNode *node); }; @@ -81,7 +81,7 @@ public: ~XmlIoRapid(); void cleanup(); - XmlNode *load(const string &path, std::map mapTagReplacementValues,bool noValidation=false,bool skipStackCheck=false); + XmlNode *load(const string &path, const std::map &mapTagReplacementValues,bool noValidation=false,bool skipStackCheck=false); void save(const string &path, const XmlNode *node); }; @@ -104,7 +104,7 @@ public: ~XmlTree(); void init(const string &name); - void load(const string &path, std::map mapTagReplacementValues, bool noValidation=false,bool skipStackCheck=false); + void load(const string &path, const std::map &mapTagReplacementValues, bool noValidation=false,bool skipStackCheck=false); void save(const string &path); XmlNode *getRootNode() const {return rootNode;} @@ -127,8 +127,8 @@ private: void operator =(XmlNode&); public: - XmlNode(XERCES_CPP_NAMESPACE::DOMNode *node, std::map mapTagReplacementValues); - XmlNode(xml_node<> *node, std::map mapTagReplacementValues); + XmlNode(XERCES_CPP_NAMESPACE::DOMNode *node, const std::map &mapTagReplacementValues); + XmlNode(xml_node<> *node, const std::map &mapTagReplacementValues); XmlNode(const string &name); ~XmlNode(); @@ -152,7 +152,7 @@ public: XmlNode *addChild(const string &name); - XmlAttribute *addAttribute(const string &name, const string &value, std::map mapTagReplacementValues); + XmlAttribute *addAttribute(const string &name, const string &value, const std::map &mapTagReplacementValues); XERCES_CPP_NAMESPACE::DOMElement *buildElement(XERCES_CPP_NAMESPACE::DOMDocument *document) const; xml_node<>* buildElement(xml_document<> *document) const; @@ -179,9 +179,9 @@ private: void operator =(XmlAttribute&); public: - XmlAttribute(XERCES_CPP_NAMESPACE::DOMNode *attribute, std::map mapTagReplacementValues); - XmlAttribute(xml_attribute<> *attribute, std::map mapTagReplacementValues); - XmlAttribute(const string &name, const string &value, std::map mapTagReplacementValues); + XmlAttribute(XERCES_CPP_NAMESPACE::DOMNode *attribute, const std::map &mapTagReplacementValues); + XmlAttribute(xml_attribute<> *attribute, const std::map &mapTagReplacementValues); + XmlAttribute(const string &name, const string &value, const std::map &mapTagReplacementValues); public: const string getName() const {return name;} diff --git a/source/shared_lib/sources/util/properties.cpp b/source/shared_lib/sources/util/properties.cpp index bb03f41b..709164d9 100644 --- a/source/shared_lib/sources/util/properties.cpp +++ b/source/shared_lib/sources/util/properties.cpp @@ -248,7 +248,7 @@ std::map Properties::getTagReplacementValues(std::map *mapTagReplacementValues) { +bool Properties::applyTagsToValue(string &value, const std::map *mapTagReplacementValues) { string originalValue = value; //if(originalValue.find("$APPLICATIONDATAPATH") != string::npos) { @@ -256,7 +256,7 @@ bool Properties::applyTagsToValue(string &value, std::map *mapTag //} if(mapTagReplacementValues != NULL) { - for(std::map::iterator iterMap = mapTagReplacementValues->begin(); + for(std::map::const_iterator iterMap = mapTagReplacementValues->begin(); iterMap != mapTagReplacementValues->end(); ++iterMap) { replaceAll(value, iterMap->first, iterMap->second); } diff --git a/source/shared_lib/sources/xml/xml_parser.cpp b/source/shared_lib/sources/xml/xml_parser.cpp index 90009281..191f6762 100644 --- a/source/shared_lib/sources/xml/xml_parser.cpp +++ b/source/shared_lib/sources/xml/xml_parser.cpp @@ -105,7 +105,7 @@ XmlIo::~XmlIo() { cleanup(); } -XmlNode *XmlIo::load(const string &path, std::map mapTagReplacementValues,bool noValidation,bool skipStackCheck) { +XmlNode *XmlIo::load(const string &path, const std::map &mapTagReplacementValues,bool noValidation,bool skipStackCheck) { //printf("Load file using Xerces engine [%s]\n",path.c_str()); try { @@ -264,10 +264,11 @@ XmlIoRapid::~XmlIoRapid() { cleanup(); } -XmlNode *XmlIoRapid::load(const string &path, std::map mapTagReplacementValues,bool noValidation,bool skipStackCheck) { +XmlNode *XmlIoRapid::load(const string &path, const std::map &mapTagReplacementValues,bool noValidation,bool skipStackCheck) { + bool showPerfStats = SystemFlags::VERBOSE_MODE_ENABLED; Chrono chrono; chrono.start(); - if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Using RapidXml to load file [%s]\n",path.c_str()); + if(SystemFlags::VERBOSE_MODE_ENABLED || showPerfStats) printf("Using RapidXml to load file [%s]\n",path.c_str()); //printf("Using RapidXml to load file [%s]\n",path.c_str()); XmlNode *rootNode = NULL; @@ -282,6 +283,8 @@ XmlNode *XmlIoRapid::load(const string &path, std::map mapTagRepl throw megaglest_runtime_error("Can not open file: [" + path + "]"); } + if(showPerfStats) printf("In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); + xmlFile.unsetf(ios::skipws); // Determine stream size @@ -289,19 +292,30 @@ XmlNode *XmlIoRapid::load(const string &path, std::map mapTagRepl streampos size = xmlFile.tellg(); xmlFile.seekg(0); + if(showPerfStats) printf("In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); + // Load data and add terminating 0 vector buffer; buffer.resize((unsigned int)size + 1); xmlFile.read(&buffer.front(), static_cast(size)); buffer[(unsigned int)size] = 0; + if(showPerfStats) printf("In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); + // This is required because rapidxml seems to choke when we load lua // scenarios that have lua + xml style comments replaceAllBetweenTokens(buffer, "", "", true); + + if(showPerfStats) printf("In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); + doc->parse(&buffer.front()); + if(showPerfStats) printf("In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); + rootNode= new XmlNode(doc->first_node(),mapTagReplacementValues); + if(showPerfStats) printf("In [%s::%s Line: %d] took msecs: %lld\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,chrono.getMillis()); + #if defined(WIN32) && !defined(__MINGW32__) if(fp) { fclose(fp); @@ -402,7 +416,7 @@ typedef std::vector LoadStack; //static LoadStack loadStack; static string loadStackCacheName = string(__FILE__) + string("_loadStackCacheName"); -void XmlTree::load(const string &path, std::map mapTagReplacementValues, bool noValidation,bool skipStackCheck) { +void XmlTree::load(const string &path, const std::map &mapTagReplacementValues, bool noValidation,bool skipStackCheck) { if(SystemFlags::VERBOSE_MODE_ENABLED) printf("In [%s::%s Line: %d] about to load [%s] skipStackCheck = %d\n",extractFileFromDirectoryPath(__FILE__).c_str(),__FUNCTION__,__LINE__,path.c_str(),skipStackCheck); this->skipStackCheck = skipStackCheck; @@ -465,7 +479,7 @@ XmlTree::~XmlTree() { // class XmlNode // ===================================================== -XmlNode::XmlNode(DOMNode *node, std::map mapTagReplacementValues): superNode(NULL) { +XmlNode::XmlNode(DOMNode *node, const std::map &mapTagReplacementValues): superNode(NULL) { if(node == NULL || node->getNodeName() == NULL) { throw megaglest_runtime_error("XML structure seems to be corrupt!"); } @@ -512,13 +526,15 @@ XmlNode::XmlNode(DOMNode *node, std::map mapTagReplacementValues) } } -XmlNode::XmlNode(xml_node<> *node, std::map mapTagReplacementValues) : superNode(NULL) { +XmlNode::XmlNode(xml_node<> *node, const std::map &mapTagReplacementValues) : superNode(NULL) { if(node == NULL || node->name() == NULL) { throw megaglest_runtime_error("XML structure seems to be corrupt!"); } //get name name = node->name(); + children.reserve(1000); + attributes.reserve(1000); //check document if(node->type() == node_document) { @@ -546,7 +562,7 @@ XmlNode::XmlNode(xml_node<> *node, std::map mapTagReplacementValu //get value if(node->type() == node_element && children.size() == 0) { text = node->value(); - Properties::applyTagsToValue(this->text); + Properties::applyTagsToValue(this->text,&mapTagReplacementValues); } } @@ -670,7 +686,7 @@ XmlNode *XmlNode::addChild(const string &name){ return node; } -XmlAttribute *XmlNode::addAttribute(const string &name, const string &value, std::map mapTagReplacementValues) { +XmlAttribute *XmlNode::addAttribute(const string &name, const string &value, const std::map &mapTagReplacementValues) { XmlAttribute *attr= new XmlAttribute(name, value, mapTagReplacementValues); attributes.push_back(attr); return attr; @@ -737,7 +753,7 @@ string XmlNode::getTreeString() const { // class XmlAttribute // ===================================================== -XmlAttribute::XmlAttribute(DOMNode *attribute, std::map mapTagReplacementValues) { +XmlAttribute::XmlAttribute(DOMNode *attribute, const std::map &mapTagReplacementValues) { skipRestrictionCheck = false; usesCommondata = false; this->mapTagReplacementValues = mapTagReplacementValues; @@ -752,10 +768,12 @@ XmlAttribute::XmlAttribute(DOMNode *attribute, std::map mapTagRep name= str; } -XmlAttribute::XmlAttribute(xml_attribute<> *attribute, std::map mapTagReplacementValues) { +XmlAttribute::XmlAttribute(xml_attribute<> *attribute, const std::map &mapTagReplacementValues) { skipRestrictionCheck = false; usesCommondata = false; - this->mapTagReplacementValues = mapTagReplacementValues; + if(mapTagReplacementValues.size() > 0) { + this->mapTagReplacementValues = mapTagReplacementValues; + } //char str[strSize] = ""; //XMLString::transcode(attribute->getNodeValue(), str, strSize-1); @@ -767,10 +785,12 @@ XmlAttribute::XmlAttribute(xml_attribute<> *attribute, std::map m name= attribute->name(); } -XmlAttribute::XmlAttribute(const string &name, const string &value, std::map mapTagReplacementValues) { +XmlAttribute::XmlAttribute(const string &name, const string &value, const std::map &mapTagReplacementValues) { skipRestrictionCheck = false; usesCommondata = false; - this->mapTagReplacementValues = mapTagReplacementValues; + if(mapTagReplacementValues.size() > 0) { + this->mapTagReplacementValues = mapTagReplacementValues; + } this->name = name; this->value = value;