From 47a81f8b447039b1559e9120ff68963ccb5b30fd Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Thu, 24 Mar 2011 21:55:39 +0000 Subject: [PATCH] - performance improvements for units using the stop command when units are idle --- source/glest_game/type_instances/unit.cpp | 39 ++++++++++++++++++++--- source/glest_game/type_instances/unit.h | 6 +++- source/glest_game/world/unit_updater.cpp | 13 +++++--- source/glest_game/world/world.cpp | 1 + 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/source/glest_game/type_instances/unit.cpp b/source/glest_game/type_instances/unit.cpp index 535eb474..8b771fbb 100644 --- a/source/glest_game/type_instances/unit.cpp +++ b/source/glest_game/type_instances/unit.cpp @@ -36,6 +36,7 @@ using namespace Shared::Util; namespace Glest{ namespace Game{ const int UnitPathBasic::maxBlockCount= GameConstants::updateFps / 2; +const int updateUnitForStopCommandFrameCount = 80; UnitPathBasic::UnitPathBasic() { this->blockCount = 0; @@ -211,6 +212,7 @@ Unit::Unit(int id, UnitPathInterface *unitpath, const Vec2i &pos, const UnitType throw runtime_error("#2 Invalid path position = " + pos.getString()); } + this->lastStopCommandCheckFrame = 0; this->unitPath = unitpath; this->unitPath->setMap(map); this->pos=pos; @@ -1143,12 +1145,25 @@ bool Unit::needToUpdate() { } //update progresses - float newProgress = progress; const Game *game = Renderer::getInstance().getGame(); - newProgress += (speed * diagonalFactor * heightFactor) / (speedDivider * game->getWorld()->getUpdateFps(this->getFactionIndex())); + float speedDenominator = (speedDivider * game->getWorld()->getUpdateFps(this->getFactionIndex())); + float newProgress = progress; + newProgress += (speed * diagonalFactor * heightFactor) / speedDenominator; if(newProgress >= 1.f) { return_value = true; + + if(currSkill->getClass() != scDie) { + if(currSkill->getClass() == scStop) { + return_value = false; + uint32 framesSinceLastCheck = (game->getWorld()->getFrameCount() - this->getLastStopCommandCheckFrame()); + if(this->getLastStopCommandCheckFrame() <= 0 || + framesSinceLastCheck >= updateUnitForStopCommandFrameCount) { + return_value = true; + } + } + } + } } return return_value; @@ -1190,8 +1205,11 @@ bool Unit::update() { //update progresses lastAnimProgress= animProgress; const Game *game = Renderer::getInstance().getGame(); - progress += (speed * diagonalFactor * heightFactor) / (speedDivider * game->getWorld()->getUpdateFps(this->getFactionIndex())); - animProgress += (currSkill->getAnimSpeed() * heightFactor) / (speedDivider * game->getWorld()->getUpdateFps(this->getFactionIndex())); + + float speedDenominator = (speedDivider * game->getWorld()->getUpdateFps(this->getFactionIndex())); + progress += (speed * diagonalFactor * heightFactor) / speedDenominator; + + animProgress += (currSkill->getAnimSpeed() * heightFactor) / speedDenominator; //update target updateTarget(); @@ -1226,6 +1244,7 @@ bool Unit::update() { (*it)->setPos(getCurrVector()); (*it)->setRotation(getRotation()); } + //checks if(animProgress > 1.f) { animProgress = currSkill->getClass() == scDie? 1.f: 0.f; @@ -1238,6 +1257,18 @@ bool Unit::update() { if(currSkill->getClass() != scDie) { progress = 0.f; return_value = true; + if(currSkill->getClass() == scStop) { + return_value = false; + uint32 framesSinceLastCheck = (game->getWorld()->getFrameCount() - this->getLastStopCommandCheckFrame()); + if(this->getLastStopCommandCheckFrame() <= 0 || + framesSinceLastCheck >= updateUnitForStopCommandFrameCount) { + this->setLastStopCommandCheckFrame(game->getWorld()->getFrameCount()); + return_value = true; + } + } + //if(return_value == true) { + // printf("\n\n\n@@@@@@@@@@@@@@@ Unit [%s - %d] current skill [%s]\n",this->getFullName().c_str(),this->getId(),currSkill->getName().c_str()); + //} } else { progress= 1.f; diff --git a/source/glest_game/type_instances/unit.h b/source/glest_game/type_instances/unit.h index 64a4fbb8..afe8c76b 100644 --- a/source/glest_game/type_instances/unit.h +++ b/source/glest_game/type_instances/unit.h @@ -331,6 +331,7 @@ private: static Game *game; bool ignoreCheckCommand; + uint32 lastStopCommandCheckFrame; public: Unit(int id, UnitPathInterface *path, const Vec2i &pos, const UnitType *type, Faction *faction, Map *map, CardinalDir placeFacing); @@ -345,7 +346,7 @@ public: Field getCurrField() const {return currField;} int getLoadCount() const {return loadCount;} float getLastAnimProgress() const {return lastAnimProgress;} - float getProgress() const {return progress;} + //float getProgress() const {return progress;} float getAnimProgress() const {return animProgress;} float getHightlight() const {return highlight;} int getProgress2() const {return progress2;} @@ -496,6 +497,9 @@ public: std::string toString() const; bool needToUpdate(); + uint32 getLastStopCommandCheckFrame() const {return lastStopCommandCheckFrame; } + void setLastStopCommandCheckFrame(uint32 value) { lastStopCommandCheckFrame = value; } + private: float computeHeight(const Vec2i &pos) const; void updateTarget(); diff --git a/source/glest_game/world/unit_updater.cpp b/source/glest_game/world/unit_updater.cpp index ed5a255c..07a94e04 100644 --- a/source/glest_game/world/unit_updater.cpp +++ b/source/glest_game/world/unit_updater.cpp @@ -269,15 +269,17 @@ void UnitUpdater::updateUnitCommand(Unit *unit, int frameIndex) { if(unit->anyCommand() == false && unit->isOperative()) { SystemFlags::OutputDebug(SystemFlags::debugUnitCommands,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); - //const SkillType *currSkill= unit->getCurrSkill(); - //if(currSkill == NULL || currSkill->getClass() != scStop) { - unit->setCurrSkill(scStop); + if(unit->getType()->hasSkillClass(scAttack) || unit->getType()->hasCommandClass(ccMove)) { + //printf("\n\n\n$$$$$$$$$ Unit [%s - %d] unitFrame [%d] WorldFrame [%d]\n",unit->getFullName().c_str(),unit->getId(),unit->getLastStopCommandCheckFrame(),world->getFrameCount()); + if(unit->getType()->hasSkillClass(scStop)) { + unit->setCurrSkill(scStop); + } if(unit->getType()->hasCommandClass(ccStop)) { //SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); unit->giveCommand(new Command(unit->getType()->getFirstCtOfClass(ccStop))); } - //} + } } } if(chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld --------------------------- [END OF METHOD] ---------------------------\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); @@ -344,6 +346,9 @@ void UnitUpdater::updateStop(Unit *unit, int frameIndex) { //if(chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s Line: %d] took msecs: %lld\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); } +// else { +// printf("\n\n\n################ Unit [%s - %d] unitFrame [%d] WorldFrame [%d]\n",unit->getFullName().c_str(),unit->getId(),unit->getLastStopCommandCheckFrame(),world->getFrameCount()); +// } //if(chrono.getMillis() > 0) SystemFlags::OutputDebug(SystemFlags::debugPerformance,"In [%s::%s] Line: %d took msecs: %lld --------------------------- [END OF METHOD] ---------------------------\n",__FILE__,__FUNCTION__,__LINE__,chrono.getMillis()); } diff --git a/source/glest_game/world/world.cpp b/source/glest_game/world/world.cpp index 5f775450..6f8f2866 100644 --- a/source/glest_game/world/world.cpp +++ b/source/glest_game/world/world.cpp @@ -426,6 +426,7 @@ void World::update(){ //tick bool needToTick = canTickWorld(); if(needToTick == true) { + //printf("=========== World is about to be updated, current frameCount = %d\n",frameCount); tick(); } }