- performance improvements for units using the stop command when units are idle

This commit is contained in:
Mark Vejvoda 2011-03-24 21:55:39 +00:00
parent ab7dc1d007
commit 47a81f8b44
4 changed files with 50 additions and 9 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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());
}

View File

@ -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();
}
}